019、PID控制器的C语言实现(一):基础框架
上个月调一个直流有刷电机的速度环,板子跑起来电机嗡嗡响,转速在目标值上下疯狂震荡,示波器一看,速度曲线像心电图。我盯着代码里的PID结构体看了半天,发现积分项没做限幅,误差累积到天上去了。这种问题在嵌入式PID实现里太常见了——理论公式谁都会背,但落到C语言结构体、定时器中断、定点数运算这些具体工程细节上,坑一个接一个。
今天这篇笔记,咱们从最基础的PID控制器C语言框架开始搭。不扯虚的,直接上代码,边写边聊那些年我踩过的坑。
先搭一个能用的PID结构体
PID控制器在数学上就三个部分:比例、积分、微分。但在嵌入式里,你得考虑数据怎么存、参数怎么调、输出怎么限幅。我习惯用一个结构体把PID相关的变量全包起来,这样每个控制回路实例化一个结构体,清晰好维护。
typedefstruct{floatKp;// 比例系数float