四轮两驱小车(一):STM32与AS4950的电机驱动实战

张开发
2026/5/6 10:33:30 15 分钟阅读
四轮两驱小车(一):STM32与AS4950的电机驱动实战
1. 项目背景与硬件选型四轮两驱小车是很多嵌入式开发者的入门项目既能学习硬件设计又能掌握电机控制的核心技术。我在实际项目中选择了STM32F103C8T6作为主控芯片搭配AS4950电机驱动芯片来控制两个520直流减速电机。这种组合成本低、性能稳定特别适合学生和爱好者练手。STM32的定时器资源非常丰富我用TIM8来生成PWM信号。选择AS4950的一个重要原因是它内置了死区时间处理功能省去了软件配置的麻烦。电机选用的是常见的520减速电机额定电压6V带有霍尔编码器接口方便后期扩展速度闭环控制。硬件连接上需要注意几个关键点AS4950的VM引脚需要接电机电源我用的6V锂电池组VCC接3.3V逻辑电源IN1/IN2接STM32的GPIOOUT1/OUT2接电机两端GND必须共地2. AS4950驱动原理详解2.1 工作模式解析AS4950有四种工作模式通过IN1和IN2两个控制引脚的电平组合来实现IN1IN2工作模式输出状态任意任意停止高阻态00停止短路刹车01正转OUT1高, OUT2低10反转OUT1低, OUT2高11刹车OUT1OUT2低实际使用中发现当IN1接PWM、IN2接高电平时电机转速会随PWM占空比变化。这种模式下芯片发热量较小所以我最终采用了这种控制方式。2.2 硬件设计要点PCB设计时有几个坑需要注意电机电源要加100uF以上的电解电容滤波逻辑侧最好加0.1uF去耦电容走线要尽量短粗特别是大电流路径散热焊盘要足够大必要时加散热片我在第一版设计时没注意散热连续工作10分钟后芯片就过热保护了。后来重新布局把芯片放在板子边缘并加大铜箔面积问题就解决了。3. STM32定时器配置3.1 PWM输出配置使用TIM8的通道2(PC7)和通道3(PC8)输出PWM配置步骤如下使能TIM8和GPIOC时钟配置PC7/PC8为复用推挽输出初始化TIM8时基单元预分频值设为7172MHz主频下得到1MHz计数频率自动重装载值设为9991kHz PWM频率配置PWM模式1输出极性高使能预装载和定时器关键代码片段TIM_TimeBaseStructure.TIM_Period 999; TIM_TimeBaseStructure.TIM_Prescaler 71; TIM_TimeBaseInit(TIM8, TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; // 初始占空比0% TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC2Init(TIM8, TIM_OCInitStructure);3.2 GPIO控制逻辑PB0和PB1作为普通GPIO控制IN2引脚状态正转PB01, PWM输出到PC7反转PB00, PWM输出到PC7停止PB00, PC70刹车PB01, PC71这里有个小技巧用宏定义封装常用操作代码更简洁#define MOTOR_FWD(pwm) do{ \ GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); \ TIM8-CCR2 pwm; \ }while(0)4. 电机控制实战4.1 差速转向实现两轮差速的关键是左右轮速度差。我封装了一个转向函数void Turn(int16_t speed, int16_t turn) { int16_t left speed turn; int16_t right speed - turn; left constrain(left, -1000, 1000); right constrain(right, -1000, 1000); if(left 0) { MOTOR_LEFT_FWD(left); } else { MOTOR_LEFT_REV(-left); } // 右轮同理... }实测发现低速时线性度不好后来加了死区补偿if(abs(pwm) 200) pwm pwm 0 ? 200 : -200;4.2 保护机制电机驱动要特别注意保护上电延迟100ms再使能输出状态切换时加5ms延时用看门狗监控程序运行过流保护可以通过检测VM电压实现我在调试时遇到过电机突然卡死导致芯片烧毁的情况后来在软件里加了最大电流检测超过阈值立即切断输出。5. 调试技巧与常见问题5.1 示波器使用要点调试PWM时要注意探头接地要尽量短同时观察GPIO和PWM波形检查上升沿是否干净测量频率和占空比是否符合预期遇到过一个奇怪现象PWM输出不稳定最后发现是电源纹波太大。加了LC滤波后问题解决。5.2 典型问题排查电机不转检查VM电压测量IN1/IN2电平确认GND连接电机抖动降低PWM频率检查电源容量尝试不同的控制模式芯片发热检查散热设计降低PWM占空比测量实际电流6. 进阶优化方向基础功能实现后可以考虑加入PID速度闭环控制实现电流采样和过流保护增加CAN总线通信接口开发手机APP遥控功能我最近在尝试FOC控制发现AS4950虽然简单易用但要做高性能控制还是不如专用FOC驱动芯片。不过对于入门学习来说这个方案已经非常合适了。

更多文章