1. 从零搭建STM32电机控制系统的核心思路第一次接触电机PID控制时很多人会被各种专业术语吓到。其实拆解开来整个系统就像骑自行车保持匀速眼睛编码器观察当前速度大脑PID算法比较实际速度和目标速度的差距双手PWM输出调整踏板力度。基于STM32的实现本质上就是把这套生理反应数字化。TT编码器电机是最理想的入门选择。这种带双路正交信号输出的直流电机价格不到20元却能完整演示闭环控制原理。我用的是一款13线编码器电机四倍频后单圈产生2496个脉冲相当于把圆周运动分解成毫米级位移检测。实际接线时要注意AB相必须连接到定时器的CH1和CH2通道如TIM5的PA0/PA1其他通道无法触发编码器模式。硬件搭建有个容易踩坑的细节电机驱动电路必须与STM32共地。曾经调试两小时发现PWM无输出最后发现是驱动板独立供电时忘了接GND连线。建议初学者直接使用TB6612这类集成驱动模块比L298N发热量小得多。下图是典型接线方案[电机] ---- [编码器] ---- [STM32定时器] | | [驱动芯片] -- [PWM输出]2. 编码器脉冲捕获的实战技巧定时器配置是第一个技术难点。以TIM5为例关键配置项就像设置摄像机参数不分频Prescaler0保证原始精度65535的计数范围Period足够记录10ms内的剧烈转速变化。滤波器ICFilter10特别重要能消除电机换向时的毛刺脉冲但值太大会导致响应延迟。转速换算要注意单位统一陷阱。假设目标转速50RPM编码器分辨率2496PPR采样周期10ms则理论脉冲数应为50转/分钟 × 2496脉冲/转 ÷ (60秒/分钟 × 100次/秒) 20.8脉冲/10ms实际代码里要用整数计算所以先乘后除避免精度损失#define SetPointA SetRPMA*2496/6000读取编码器值时有个隐蔽的bug直接读取CNT寄存器会得到有符号16位数而STM32的寄存器是32位的。必须用强制类型转换Encoder_TIM (short)TIM5-CNT; // 正确获取-32768~32767范围值 TIM5-CNT 0; // 每次读取后立即清零3. PID算法在电机控制中的魔改实践标准PID公式在电机场景需要三项调整1) 微分项改用测量值变化而非误差变化避免设定值突变导致的微分冲击2) 积分项增加抗饱和处理3) 输出做速度限幅。这是我优化后的算法int SPEED_PID(int now, int set) { static int LastSpeed; // 上次实际速度 int Error set - now; static int Integral 0; // 积分抗饱和 if(abs(Error) 500) { // 只在较小误差时积分 Integral Error; Integral constrain(Integral, -2000, 2000); // 限制积分上限 } // 改用速度微分 int Derivative LastSpeed - now; LastSpeed now; return (Kp*Error Ki*Integral Kd*Derivative)/1000; // 系数放大1000倍避免浮点 }参数整定有个暴力但有效的方法先设KpKiKd0然后逐步增加Kp直到出现等幅振荡此时临界增益Ku约为该值的70%振荡周期Tu用于确定Ki1.2Ku/TuKd3KuTu/40。实测某TT电机参数为Kp1200, Ki35, Kd8500注意系数已放大1000倍。4. PWM输出与电机响应的优化策略TIM8的PWM配置要注意三点1) 计数周期设为10000便于直观调节2) 输出极性要匹配驱动芯片逻辑3) 死区时间根据MOS管参数设置。我的电机在CCR13000时开始转动因此做了死区补偿if(Motor_A 0){ MotorA1 0; MotorA2 1; TIM8-CCR1 3000 myabs(Motor_A); // 突破静摩擦阈值 }else{ MotorA1 1; MotorA2 0; TIM8-CCR1 3000 - myabs(Motor_A); }遇到电机抖动时先检查电源容量。我用4节18650电池供电时电机加速瞬间电压会跌落1V以上导致控制紊乱。后来并联了4700μF电容才稳定。另一个常见问题是编码器线太长引入干扰解决方法是用网线中的双绞线对并在STM32输入端加100Ω电阻和100nF电容滤波。调试时建议用串口实时输出数据格式化为CSV后用Excel绘图分析。这是我的打印函数printf(%d,%d,%d\r\n, Encoder_A, SetPointA, Motor_A); // 分别对应实际脉冲、目标脉冲、PWM输出最后分享一个实用技巧用按键调节目标转速时要加入渐变处理。直接突变设定值会导致超调可以每10ms增加5RPM的斜坡变化。对于需要精确停车的场景当误差小于5%时切换为位置式PID能让轮子稳稳停在指定角度。