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

共2条 1/1 1 跳转至

【2025Let'sdo第4期】基于单片机的直流电机控制-成果帖

专家
2026-01-31 23:00:30     打赏

        通过前面的开箱,开发过程,对整个用到的器件,开发板和对应的软件开发流程有了一个初步的了解,下面进行项目成果的开发。

硬件设计方面,前面的过程贴硬件的基本知识已经基本说明的差不多,如有不确定的可以参考。

       电机驱动板上有两路H桥的驱动,分A路和B路,这里用到的其中的B路, 控制信号的连接:驱动板上的BIN1和BIN2两个引脚是控制电机的正反转的,通过把这两个引脚的电平接在高电平或者低电平上切换进行电机控制方向的控制,BIN1接高电平,BIN2接低电平,或者BIN1接电平,BIN2接电平,STBY引脚可以通过连接一个10K欧的上拉电阻到3.3V或者VCC控制使能电机驱动,如果接地就会失能电机控制,PWMA和PWMB是用来连接到开发板的PWM输出控制引脚上,用来通过PWM来控制电机。

        控制功能真值表如下:

    92bda66d-7626-4aba-968c-d47aeb60087b.png

        功率部分的连接:VM接给电机供电的功率电源,也就是开关电源的输出12V电源正,这里要特别注意正负极,不要接反了,我是用万用表测量之后确认没问题才接上的,GND引脚是功率电源地和信号地的公共地,这里一并引出两根线分别接到开发板的地上和开关电源的输出负极上,电机驱动开发板上的MOT B的两个引脚连接有刷电机的两个电机引线,不区分正负极。

        接好线之后检查没有问题,可以先给开发板上电,没有问题之后再给开关电源上电。

过程中效果如下图所示:

微信图片_20260131215642_83_368.jpg

上电没问题之后接下来就可以用USB连接开发板和电脑进行软件编写,调试和开发了,详细的过程比较麻烦就不详细说明了。

主要的控制代码程序如下:

// 变量定义
TIM_HandleTypeDef htim2; // 你的PWM定时器句柄


// 宏定义,方便代码阅读和修改
#define MOTOR_AIN1_PIN GPIO_PIN_7
#define MOTOR_AIN1_PORT GPIOA
#define MOTOR_AIN2_PIN GPIO_PIN_9
#define MOTOR_AIN2_PORT GPIOA
// 电机状态控制函数
void MotorA_Stop(void) {    
// 设置AIN1=0, AIN2=0 (短路刹车)    
HAL_GPIO_WritePin(MOTOR_AIN1_PORT, MOTOR_AIN1_PIN, GPIO_PIN_RESET);    
HAL_GPIO_WritePin(MOTOR_AIN2_PORT, MOTOR_AIN2_PIN, GPIO_PIN_RESET);   
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 0); // PWM占空比设为0
}

void MotorA_Brake(void) { // 刹车和Stop一样    
   MotorA_Stop();
}
void MotorA_Forward(uint16_t speed) {    
// 设置AIN1=1, AIN2=0 (正转)    
    HAL_GPIO_WritePin(MOTOR_AIN1_PORT, MOTOR_AIN1_PIN, GPIO_PIN_SET);    
    HAL_GPIO_WritePin(MOTOR_AIN2_PORT, MOTOR_AIN2_PIN, GPIO_PIN_RESET);   
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed); // 设置PWM占空比
}
void MotorA_Backward(uint16_t speed) {    
    // 设置AIN1=0, AIN2=1 (反转)    
    HAL_GPIO_WritePin(MOTOR_AIN1_PORT, MOTOR_AIN1_PIN, GPIO_PIN_RESET);    
    HAL_GPIO_WritePin(MOTOR_AIN2_PORT, MOTOR_AIN2_PIN, GPIO_PIN_SET);   
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed); // 设置PWM占空比
}
int main(void) {    
    HAL_Init();    
    SystemClock_Config();    
    MX_GPIO_Init();    
    MX_TIM2_Init(); // 初始化PWM定时器
    // 启动PWM信号输出    
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
    // 确保电机初始状态为停止    
    MotorA_Stop();
    while (1) {        // 示例:电机正转,50%速度 (ARR=999, 50%速度即 500)        
        MotorA_Forward(500);        
        HAL_Delay(2000);
        // 刹车停止        
        MotorA_Brake();        
        HAL_Delay(500);
        // 电机反转,30%速度        
        MotorA_Backward(300);        
        HAL_Delay(2000);
        // 平滑停止(滑行),将方向设为刹车状态,PWM设为0        
        MotorA_Stop();        
        HAL_Delay(2000);
        // 还可以做一个加速循环        
        for (int i = 0; i < 1000; i += 10) {            
            MotorA_Forward(i);            
            HAL_Delay(50);       
        }        
        MotorA_Brake();        
        HAL_Delay(1000);   
    }
}

    最终实现了有刷电机的控制旋转。

    通过此次活动,不仅收获了NXP的开发板,,也对开发板和开发环境有了一个整体的了解,也说有刷电机的控制有了一个基本的了解,为以后工作中要用到开发板开发产品提供了便利。

   最后总结一下, 总之是收获满满。在此表示非常的感谢,感谢EEPW举办的这次活动,也感谢得捷电子为这次活动提供开发用的开发板,电机驱动板和开关电源。



工程师
2026-02-01 09:48:52     打赏
2楼

这代码看着像是使用stm32开发的


共2条 1/1 1 跳转至

回复

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