基于STM32与TB6612FNG的PID电机调速系统设计与实现

张开发
2026/4/18 4:40:47 15 分钟阅读

分享文章

基于STM32与TB6612FNG的PID电机调速系统设计与实现
1. 项目背景与核心功能用STM32和TB6612FNG驱动模块搭建的PID电机调速系统本质上是一个微型工业控制系统的简化版。我去年给本地一家自动化工厂做设备改造时就用了类似方案来替代老旧的继电器控制模块。这种组合最大的优势是成本不到专业PLC的十分之一但能实现90%以上的基础运动控制需求。这个系统的核心功能可以类比汽车的定速巡航设定目标转速后无论负载如何变化比如上坡时阻力增大电机都能自动维持稳定转速。实现这一功能的关键在于三个部分STM32F103C8T6作为大脑负责运行PID算法和处理编码器反馈TB6612FNG相当于肌肉提供最大1.2A的驱动电流AB相编码器如同神经系统实时反馈电机实际转速实测中发现采用20kHz的PWM频率能完美避开人耳敏感频段彻底消除电机的高频啸叫声。这比常见的1kHz PWM方案体验好很多建议所有涉及电机驱动的项目都优先考虑高频PWM。2. 硬件选型与电路设计2.1 主控芯片选择STM32F103C8T6俗称蓝 pill是这个项目的性价比之王。它有3个关键优势内置硬件编码器接口可以直接读取AB相编码器信号多达11个定时器其中TIM4专门用于生成电机PWM波72MHz主频足够运行PID计算实测单次PID运算仅需8us有个坑要注意这款芯片的TIM2和TIM3通道默认与JTAG引脚复用必须通过GPIO_PinRemapConfig函数重映射后才能正常使用编码器功能。我当初调试时就在这里卡了整整两天。2.2 电机驱动模块对比TB6612FNG相比传统的L298N有三大改进效率提升采用MOSFET而非三极管导通电阻仅0.4Ω体积缩小模块尺寸仅24x15mm保护完善内置短路保护和过热关断接线时需要特别注意VM电机电源和VCC逻辑电源必须分开供电。有次偷懒共用了5V电源结果电机启动瞬间就把单片机搞复位了。推荐电路设计如下引脚名称连接目标电压范围VM18650电池组6-12VVCCSTM32的3.3V2.7-5.5VPWMA/BTIM4_CH3/CH43.3V PWMAIN1/2GPIOB_12/13高低电平2.3 编码器选型要点带AB相输出的霍尔编码器是速度闭环的关键。选购时要注意三个参数PPR每转脉冲数常见值在11-1024之间本项目用的11线编码器经过30:1减速箱和4倍频后实际分辨率为1320脉冲/转输出类型推荐选择集电极开路输出长距离传输更稳定安装方式优先选择轴套式安装比法兰式更容易对齐实测发现在电机轴与编码器连接处加装柔性联轴器可以减少机械振动导致的计数误差。这是很多教程里没提到的实用技巧。3. PID算法实现细节3.1 位置式PID的优化写法原始代码中的PID实现有个潜在问题当bias_integral持续累积时可能导致整型溢出。我的改进方案是加入积分限幅#define INTEGRAL_LIMIT 1000 // 积分限幅值 if(bias_integral INTEGRAL_LIMIT) bias_integral INTEGRAL_LIMIT; if(bias_integral -INTEGRAL_LIMIT) bias_integral -INTEGRAL_LIMIT;另一个实用技巧是对输出值做死区补偿。当PWM占空比小于5%时电机实际上无法启动if(Motor_Pwm_Out 180) Motor_Pwm_Out 180; // 3500对应100%180≈5%3.2 参数整定实战经验调参顺序应该是先P后I最后D。我的土方法调试流程将Ki和Kd设为0逐渐增大Kp直到电机出现等幅振荡取振荡时Kp值的60%作为初始P参数增加Ki直到负载突变时能快速回归设定值最后加少量Kd抑制超调实测典型参数范围Kp150-300对应200Ki0.5-5对应2Kd0-10本项目设为0有个快速验证方法用手突然捏住电机轴好参数应该能在1秒内恢复转速且超调量不超过10%。4. 关键代码解析4.1 编码器四倍频实现TIM_EncoderInterfaceConfig函数的第三个参数很关键TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, // 捕获上升沿 TIM_ICPolarity_Rising); // 双沿触发实现四倍频这种配置下计数器会在A相的上升沿和下降沿都触发计数相当于把11PPR的编码器提升到22线分辨率再结合AB相正交解码最终实现44计数/转。4.2 速度计算技巧在50ms的中断周期内用脉冲数换算转速的公式为RPM (脉冲数 × 1200) / 1320其中1320是电机转一圈的总脉冲数11×30×41200是将50ms换算到1分钟的系数60/0.051200。4.3 PWM输出配置TIM4的ARR设置为3599时20kHz PWM的计算过程PWM频率 72MHz / (35991) / 1 20kHz占空比调节范围0-3500对应0-100%输出这是为了避免100%占空比导致MOSFET无法关断。5. 系统优化与故障排查5.1 抗干扰设计遇到编码器计数异常时可以尝试在编码器信号线上加10kΩ上拉电阻并联100pF电容滤波使用双绞线传输信号曾有个案例是电机启停导致计数器跳变最后发现是地线阻抗过大。解决方法是在驱动板和单片机间加粗地线并增加10uF退耦电容。5.2 动态参数调整当负载惯量变化较大时可以实时修改PID参数if(Speed_A setpoint/2) { MotorA_kp 300; // 启动阶段加大P值 } else { MotorA_kp 200; // 正常运行时恢复 }5.3 常见问题速查表现象可能原因解决方案电机抖动不转PWM频率低于1kHz提高ARR值至3599转速持续波动积分项过大减小Ki值或加入积分限幅编码器计数反向AB相接线错误交换A与A-或B与B-高速时计数丢失中断处理时间过长优化代码或降低编码器分辨率这个项目最让我惊喜的是STM32的编码器接口稳定性。在连续72小时老化测试中计数误差不超过±2个脉冲完全满足工业级应用要求。建议初次接触电机控制的同学可以从这个方案入手积累实战经验。

更多文章