PID控制算法:从公式到伪代码

      

CAN协议学习不容易,今天虽然跳上了枝头,却终究还是没有变成凤凰···嘛,不管怎么样,先前的美好没留心,眼前的苟且还是要继续,```快乐就好,健康就是福```

今天简单讲讲PID控制算法。

从实践上说,学一种算法,从公式(理论)和编程(应用)两个方面来学习,效率更优。

PID简介:在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;控制点包含三种比较简单的PID控制算法,分别是:增量式算法,位置式算法,微分先行。

下面我们只关注增量式和位置式。

本文接下来分三部分:

  1. 位置式

  2. 增量式

  3. 贴点图

 

 

 

先放个用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输出功率了。

问题来了,如何确定这几个系数?靠标定。一个数一个数试。

  1. 置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、因本人水平有限,这些理解都是基于本人的经历写出,必有不足之处,请多多包涵。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值