STM32实战:PWM精准调速直流电机驱动方案
1. TB6612电机驱动芯片深度解析TB6612FNG这款驱动芯片在小型电机控制领域堪称瑞士军刀我经手过的机器人项目中80%的直流电机驱动都选用它。相比传统的L298N它的优势非常明显体积只有指甲盖大小效率却提升近40%最关键的是发热量大幅降低。记得有一次做四足机器人用L298N驱动电机半小时就能煎鸡蛋换成TB6612后连续工作两小时也只是微温。芯片内部集成了两路H桥电路每路可输出1.2A持续电流峰值3.2A这个驱动能力对常见的N20减速电机、370电机都绰绰有余。引脚布局也很有规律控制端PWMA/PWMB接PWM信号AIN1/AIN2和BIN1/BIN2控制转向输出端AO1/AO2和BO1/BO2直接接电机电源端VM接电机电源建议4.5-10VVCC接逻辑电源2.7-5.5V实际接线时有个容易踩坑的地方STBY待机引脚必须接高电平否则电机完全不工作。我有次调试两小时才发现是这个引脚没接血泪教训啊2. 硬件电路设计要点电机驱动电路看似简单但细节决定成败。根据我的项目经验推荐这个黄金组合STM32F103C8T6最小系统板TB6612模块AMS1117-3.3V稳压电路。电源部分要特别注意建议采用双电源方案电机电源18650锂电池两节7.4V经DC-DC降压到6V逻辑电源AMS1117-3.3V给STM32供电滤波电容的配置很关键我在电机电源输入端会并联100μF电解电容滤低频0.1μF陶瓷电容滤高频再加个1N5819二极管防反接PCB布局时要注意将大电流路径电机供电和小信号路径PWM控制分开走线避免干扰。实测证明良好的布局能让电机运行噪音降低30%以上。3. STM32的PWM配置详解PWM配置是调速的核心我用TIM2的CH3通道生成PWM波关键参数这样设置TIM_TimeBaseInitStructure.TIM_Period 100 - 1; // ARR值 TIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1; // 72MHz/721MHz这样得到的PWM频率1MHz/(100)10kHz这个频率既能保证调速平滑又不会让MOS管过度发热。在电机控制中占空比分辨率很重要。ARR设为99时最小调速步长1/(991)1%对应到12V电机每步电压变化约0.12V有个实用技巧在PWM_Init()后加一句TIM_CtrlPWMOutputs(TIM2, ENABLE)可以避免上电时电机意外抖动。这个坑我踩过三次才长记性4. 电机控制软件架构设计好的代码结构能让后期调试轻松很多。我的项目通常这样组织电机驱动代码/motor_driver ├── bsp_tb6612.c // 硬件抽象层 ├── motor_ctrl.c // 控制算法层 └── app_motor.c // 应用层在bsp_tb6612.c中封装最底层操作void TB6612_SetPWM(uint8_t ch, int16_t duty) { duty constrain(duty, -100, 100); if(ch CH_A) { TIM3-CCR1 abs(duty); GPIO_WritePin(AIN1_PORT, duty0 ? HIGH:LOW); GPIO_WritePin(AIN2_PORT, duty0 ? LOW:HIGH); } //...CH_B类似处理 }控制算法层实现PID调速void Motor_PID_Update(Motor_t* motor) { float err motor-target_speed - motor-actual_speed; motor-i_term ki * err; motor-i_term constrain(motor-i_term, -100, 100); float output kp * err motor-i_term kd * (err - motor-last_err); TB6612_SetPWM(motor-ch, (int16_t)output); motor-last_err err; }5. 调试技巧与性能优化示波器是调试PWM的利器。我习惯先观察GPIO引脚波形确认PWM信号正常后再接驱动芯片。常见问题排查电机不转先查STBY引脚再测VM电压电机振动降低PWM频率到5kHz左右转速不稳在电机两端并联104电容速度闭环控制时编码器接线要特别注意AB相建议用双绞线上拉电阻取值4.7kΩ-10kΩ信号线远离电机电源线对于要求高动态响应的场合可以将PWM频率提高到20kHz以上使用硬件PWM模式TIMx_CHyN启用DMA传输减少CPU开销6. 实战案例智能小车调速系统去年给大学生智能车竞赛做指导时我们实现的调速系统包含霍尔编码器测速100线二阶互补滤波算法模糊PID控制器关键代码片段void SpeedControl_Task(void) { static uint32_t last_tick 0; if(HAL_GetTick() - last_tick 10) return; float speed Encoder_GetSpeed(MOTOR_L); Filter_Update(speed_filter, speed); FuzzyPID_Update(fpid, target_speed, speed_filter.output); TB6612_SetPWM(MOTOR_L, fpid.output); last_tick HAL_GetTick(); }这个系统最终实现了±1rpm的转速控制精度小车匀速行驶时速度波动小于2%。调试中发现电机参数会随温度变化后来增加了在线参数自整定功能效果立竿见影。