这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【2025 Let's do 第4期】基于单片机的直流电机控制过程贴

共1条 1/1 1 跳转至

【2025 Let's do 第4期】基于单片机的直流电机控制过程贴

助工
2026-01-13 15:51:51     打赏

基础任务1、电机启停与方向控制;

任务要求

通过程序实现电机的启动、停止、正转和反转。


硬件准备

1. NXP FRDM-MCXA153开发板 1 块

2. Adafruit Motor Shield V2 电机驱动板 1 块

3. 电源(5 ~ 12V)1 个

4. 直流有刷电机 1 个

5. 杜邦线若干


开发环境搭建

我使用 NXP 官方开发环境 MCUXpresso IDE 来编程实现,开发环境安装我这里不作展开说明。具体环境安装方案详见:FRDM-MCXA153快速入门 - 获取软件


代码实现

/* 任务1:电机启停与方向控制:通过程序实现电机的启动、停止、正转和反转。 */
void task1(void)  {
  /* 马达控制测试 */
  PRINTF("\nTesting Motor Control...\r\n");
  
  /* 获取马达4对象 */
  motor_shield_t *motor1 = getMotor(LPI2C0, pca9685Address, MOTOR_CHANNEL_4);
  if (motor1 == NULL) {
    PRINTF("Failed to get motor 4 object\r\n");
    while(1);
  }
  PRINTF("Successfully got motor 4 object\r\n");
  
  /* 测试马达正转 */
  PRINTF("\nTesting motor 4 forward rotation...\r\n");
  status_t result = runMotor(motor1, MOTOR_DIR_FORWARD, 128); // 50%速度正转
  if (result == kStatus_Success) {
    PRINTF("Motor 4 moving forward at 50%% speed\r\n");
  } else {
    PRINTF("Failed to run motor forward with error: 0x%08X\r\n", result);
  }
  /* 马达正转保持5秒 */
  SDK_DelayAtLeastUs(5 * 1000000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
  
  /* 测试改变速度 */
  PRINTF("\nChanging motor 4 speed to 100%%...\r\n");
  result = setMotorSpeed(motor1, 255); // 100%速度
  if (result == kStatus_Success) {
    PRINTF("Motor 4 speed set to 100%%\r\n");
  } else {
    PRINTF("Failed to set motor speed with error: 0x%08X\r\n", result);
  }
  
  /* 马达正转全速运行5秒 */
  SDK_DelayAtLeastUs(5 * 1000000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
  
  /* 测试马达反转 */
  PRINTF("\nTesting motor 4 backward rotation...\r\n");
  result = setMotorDirection(motor1, MOTOR_DIR_BACKWARD);
  if (result == kStatus_Success) {
    PRINTF("Motor 4 moving backward at 100%% speed\r\n");
  } else {
    PRINTF("Failed to set motor direction with error: 0x%08X\r\n", result);
  }
  
  /* 马达反转保持5秒 */
  SDK_DelayAtLeastUs(5 * 1000000U, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
  
  /* 测试停止马达 */
  PRINTF("\nStopping motor 4...\r\n");
  result = stopMotor(motor1);
  if (result == kStatus_Success) {
    PRINTF("Motor 4 stopped\r\n");
  } else {
    PRINTF("Failed to stop motor with error: 0x%08X\r\n", result);
  }
  
  PRINTF("\nMotor Shield test completed!\r\n");
}


效果展示

2026-01-13_15-03-09.gif


基础任务2、电机调速控制;

任务要求

编写一个函数,可以通过输入参数(如0-100)来改变PWM的占空比,从而控制速度。


硬件准备

1. NXP FRDM-MCXA153开发板 1 块

2. Adafruit Motor Shield V2 电机驱动板 1 块

3. 电源(5 ~ 12V)1 个

4. 直流有刷电机 1 个

5. 杜邦线若干


代码实现

/* 任务2:电机调速控制:编写一个函数,可以通过输入参数(如0-100)来改变PWM的占空比,从而控制速度。 */
void task2(motor_direction_t direction, int speed) {
  status_t result;
  /* 获取马达4对象 */
  motor_shield_t *motor1 = getMotor(LPI2C0, pca9685Address, MOTOR_CHANNEL_4);
  if (motor1 == NULL) {
    PRINTF("Failed to get motor 4 object\r\n");
    while(1);
  }
  PRINTF("Successfully got motor 4 object\r\n");
  
  /* 设置马达方向 */
  result = setMotorDirection(motor1, direction);
  if (result == kStatus_Success) {
    PRINTF("Motor 4 direction set to %s\r\n", (direction == MOTOR_DIR_FORWARD) ? "forward" : "backward");
  } else {
    PRINTF("Failed to set motor direction with error: 0x%08X\r\n", result);
  }
  
  /* 设置马达速度 */
  result = setMotorSpeed(motor1, speed);
  if (result == kStatus_Success) {
    PRINTF("Motor 4 speed set to %d\r\n", speed);
  } else {
    PRINTF("Failed to set motor speed with error: 0x%08X\r\n", result);
  }
}


效果展示

2026-01-13_15-07-38.gif





关键词: Let's do     DIY     NXP     C/C++     Ar    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]