CAN协议学习不容易,今天虽然跳上了枝头,却终究还是没有变成凤凰···
嘛,不管怎么样,先前的美好没留心,眼前的苟且还是要继续,
```快乐就好,健康就是福```
今天简单讲讲PID控制算法。
从实践上说,学一种算法,从公式(理论)和编程(应用)两个方面来学习,效率更优。
PID简介:在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;控制点包含三种比较简单的PID控制算法,分别是:增量式算法,位置式算法,微分先行。
下面我们只关注增量式和位置式。
本文接下来分三部分:
-
位置式
-
增量式
-
贴点图
先放个用PPT做的简图,思考一下:怎么控加热器,让水温一直控在 60°?
Ⅰ. 位置式
我们来看一下原始公式:
解释一下:err(t)是误差,比如说err(t)=实际水温-目标水温;Kp为比例系数,TI为积分时间常数,TD为微分时间常数。
按照数学的原理,比列就是线性,积分相等与累积求和,连续微分约等于求斜率。那么,这个公式可以继续化简:
-
积分项ki可以按顺序化简为:
-
微分项kd可以化简为:
那么综合以上,原始公式就可以化简为:
现在我们看上面这个化简后的公式,是不是瞬间雨后天晴:
我们拿上面那个图片例子结合这个公式来做演示:假设 T_Target[k]:传感器当前实际输出温度;
T_Target[k-1]:传感器上一次实际输出温度;
T_Target[k-2]:传感器上上次实际输出温度;
以此类推······【保存的历史实际温度个数k越多,模型越精确,容易过冲】
T_Actually:目标温度;
out_Power:加热器输出功率;
那么 :偏差大于0,表示温度不够,继续加大功率;
err(k)=T_Actually - T_Target[k] ;当前偏差
err(k-1)=T_Actually - T_Target[k-1] ;上一次偏差
err(k-2)=T_Actually - T_Target[k-2] ;上上一次偏差;
·····
【实际上编程并不会这么做,因为一个变量自加就可以实现err(k)+ err(k-1)+ err(K-2)+ err(K-3)+ ...所以存储空间上也就一字节(int型)。】
out_Power =kp *err(k) + ki*{ err(k)+ err(k-1)+ err(K-2)+ err(K-3)+ ... }+kd*{err(K)-err(K-1)};
显然:err(k)、err(k-1)、err(K-2)、····这些偏差是已知的,out_Power是输出,接下来只需要确定kp、ki、kd三个系数就可以确定out_Power输出功率了。
问题来了,如何确定这几个系数?靠标定。一个数一个数试。
-
置ki=0、kd=0;则out_Power =kp *err(k) ,先调试从小到大试kp,比如T_Target[k]=10 、T_Actually=90 ;
置kp=0.3,err(k)=80,则out_Power= 24kw;
1秒后,若T_Target[k]=30,err(k)=50,重新计算out_Power= 15kw;
再1秒后,若T_Target[k]=100,err(k)=-10,重新计算out_Power= -3kw;
问题来了,有-3kw?没有。所以实际问题中,会有滤波,和惯性限幅。out_Power<0 ? : 0,out_Power.功率小于0,那就不输出了呗。
类推下去,这个偏差会达到一个稳定状态:偏差10,给10kw,偏差-12,给0kw,偏差12,给11kw,偏差-7,给0kw,.....一直循环,偏差不会为0,这个临界偏差被称为静态误差,引入ki后可以抵消部分静态误差。如果这个循环偏差很小,如2~-2之间循环,这个偏差被称为死区,一般达到死区,将默认已经到了90°,停止输出功率,省电。
那怎么知道kp=0.3是否合适了呢?看超调,响应时间,和静态误差等。如下从左至右:超调过大,响应太慢,超调且振荡
kp定了之后,就可以适当减一点kp,慢慢加ki上去,以减小静态误差。
像下面这个波形就好。
Ⅱ. 增量式
上面那个是位置式PID,你会发现这个公式,kp*err(k)为主导-即当前误差为主导,而积分项是与所有的历史误差的累加和线性相关,如果ki设置不合理,那么很容易造成积分饱和,超调。比如,初始温度为0°,目标温度为100°,误差为100,50,30,10,,往后ki部分累加误差就一直累加100,150,180,190,···如果ki=0.1,那么你会发现0.1*190=19kw,此时偏差只有10而已,系统却输出了19kw,这个系统设计就是不合理的。这个现象也被并入积分饱和的情形之一。为避免这种情况,可以限制误差累积的最大值。
增量式PID就可以大大减弱这种现象。
上面u(t)是当前输出功率,u(t-1)是上一次输出功率,两式相减
Δu(t) = kp*[err(k)-err(k-1)]+ki*err(k)+kd*[(err(k)-2err(k-1)+err(k-2)];
这个算出的Δu(t)是功率的增量,实际u(t)=u(t-1)+Δ(t),通俗说:现在偏差20°,上一个输出功率是10kw,基于偏差20°算出Δu(t)=5kw,那么实际我们应该输出15kw,接着偏差减到-10,算得Δu(t)=-10kw,那么实际输出5kw;
增量式PID和位置式PID:说有区别,实际上也没有什么区别,不过我个人比较喜欢增量式。上面的例子举得不好,因为没有负功率。如果拿一个阀门来说,就比较合适,要知道阀门式一般是靠输出占空比来控制电机的加电时间,而加电时间控制阀门开关增量,通过半桥或者全桥电路控制电流方向就可以实现正反转。
Ⅱ. 贴点图
话外事:以上说的都是闭环。开环闭环的区别就是有没有反馈,比如说,如果没有温度传感器的温度反馈那么这个系统就是开环的,而开环系统鲁棒性不好。举个例子:从0°加热到100°,你刚刚调好PID系数,发现现在输出的功率固定时间内可以精准实现加热到100度,但是这个PID参数只是针对0°-100°调的,如果下次起始温度是50°,你还输出这个功率,那肯定超了。
上面几张轨压图片来自《高压共轲i轨压PID控制算法自动代码生成应用研究--李启发,肖 然,周 明 》。
这几张图片是我从该论文截取的,觉得不错就弄来分享了。如侵,删。
1、喜欢的朋友,欢迎关注点赞,希望能给各位朋友带来灵感。
2、因本人水平有限,这些理解都是基于本人的经历写出,必有不足之处,请多多包涵。