020 PID控制器的C语言实现(二):抗积分饱和
从一次电机冒烟说起
去年调试一个直流有刷电机的位置环,PID参数整定得差不多了,空载跑得挺顺。结果一挂上负载,电机开始剧烈抖动,然后——一股焦糊味飘出来。赶紧断电,手摸电机外壳,烫得能煎鸡蛋。
查日志,发现积分项在负载突变时疯狂累积,峰值达到了设定限幅的3倍。等负载恢复,积分项释放的能量直接让电机冲过了头,来回震荡几次就过热了。这就是典型的积分饱和——积分项“撑死”了,系统失去控制能力。
从那以后,我写PID代码第一件事就是问自己:积分饱和处理了吗?
积分饱和是怎么发生的
先看一个标准的位置式PID:
floatpid_update(pid_t*pid,floatsetpoint,