1. 从零搭建STM32编码器电机PID闭环系统
第一次接触电机PID控制时,我被各种专业术语绕得头晕。直到亲手用STM32实现了一个编码器电机的闭环控制,才发现原来PID调参可以这么直观有趣。这次就带大家用HAL库快速搭建系统,配合VOFA+这个神器实现波形可视化调试。
先说几个关键硬件:一块STM32F103C8T6核心板(俗称"蓝 pill")、带编码器的直流减速电机(我用的JGA25-370)、电机驱动模块(比如L298N)。编码器每转输出11个脉冲,经过4倍频和30:1的减速箱,最终分辨率是1320脉冲/转。这个参数会直接影响速度计算的准确性。
在CubeMX里配置时,重点注意三个定时器:
- TIM2:编码器接口模式,捕获AB相脉冲
- TIM3:PWM输出,控制电机转速
- TIM4:基础定时器,产生10ms中断用于PID计算
有个坑我踩过:编码器接口要选"Encoder Mode",而不是普通的输入捕获。第一次配置时没注意,导致脉冲计数方向错误,电机转速忽正忽负。另外PWM频率建议设在10kHz左右,既能保证驱动效果,又不会让MOS管太烫。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 手把手编写增量式PID算法
PID控制的核心就是三个"魔法系数":Kp、Ki、Kd。我习惯用增量式算法,相比位置式更不容易积分饱和。代码里定义了这个结构体:
c复制typedef struct {
float Kp, Ki, Kd;
float Error_Last1; // 上次误差
float Error_Last2; // 上上次误差
float Out_Last; // 上次输出
} PID_Increment_Struct;
实际计算时有个细节:当误差较大时(比如刚启动),我会暂时去掉积分项,防止输出突变:
c复制if(err<=40 && err>-40)
out = Out_Last + Kp*(err-Error_Last1) + Ki*err + Kd*(err-2*Error_Last1+Error_Last2);
else
out = Out_Last + Kp*(err-Error_Last1) + Kd*(err-2*Error_Last1+Error_Last2);
速度计算函数要注意编码器
