6.2 PID基本原理

PID简介

PID是比例(Proportional)、积分(Integral)、微分(Differential)的缩写 。这里的微积分只用到了很浅显的概念,理解起来不需要太多数学知识。

PID是一种闭环控制算法,它动态改变施加到被控对象的输出值(Out),使得被控对象某一物理量的实际值(Actual),能够快速、准确、稳定地跟踪到指定的目标值(Target)。

PID是一种基于误差(Error)调控的算法,其中规定:误差=目标值-实际值,PID的任务是使误差始终为0。

PID对被控对象模型要求低,无需建模,即使被控对象内部运作规律不明确,PID也能进行调控。

PID原理

开环与闭环

开环(Open Loop):控制器单向输出值给被控对象,不获取被控对象的反馈,控制器对被控对象的执行状态不清楚。

闭环(Closed Loop):控制器输出值给被控对象,同时获取被控对象的反馈,控制器知道被控对象的执行状态,可以根据反馈修改输出值以优化控制。 

PID公式与系统框图

定义误差:

PID输出值:error(t)+Ti分之一倍的error(t)从0~t的积分+Td倍的error(t)对t求微分。Kp是比率系数,Ti是积分时间常数,Td是微分时间常数。(此公式不常用,我们比较常用的是下面的公式!)

PID输出值:Kp*error(t)+Ki*error(t)从0~t的积分+Kd*error(t)对t求微分。

其实下面的公式就是把Kp乘进去,上面的公式,改变Kp会同时影响里面的3项,不便于参数的调节,而下面的公式就更加独立,Kp调节第一项,Ki调节第二项,Kd调节第三项。这3项的计算,就分别叫做P(比例)、I(积分)、D(微分)。

这些公式是咋来的?设计者是咋想的?为什么会想到这些公式呢?我们接下来的任务,就是要分析这些公式是什么意思,我要提前说一下,PID公式更多的是类似“经验”公式,就像和面一样,水多了加面,面多了加水。

比例项(P)

只含有比例项的PID输出值: out(t)=Kp∗error(t)

比例项的输出值仅取决于当前时刻的误差,与历史时刻无关。当前存在误差时,比例项输出一个与误差呈正比的值,当前不存在误差时,比例项输出0。

Kp越大,比例项权重越大,系统响应越快,但超调也会随之增加;比如当前误差是10,意思是实际值比目标值低10,那么输出肯定要进行正向调控,让实际值高一些,然后,如果Kp给0.1,那么输出值是1,那么意思就是正向调控1(0.1*10)这么大的力度,如果Kp给1,那么意思就是正向调控10(1*10)这么大的力度,所以Kp越大,调控的力度就越大。但是Kp不能太大,否则只有一点很小的误差,P项就很猛的调,显然会导致超调,甚至会导致系统自激振荡。

但是纯比例项控制时,会有一个问题,那就是纯比例项控制时,系统一般会存在稳态误差,Kp越大,稳态误差越小。但我们刚才说了,Kp不能无限加大,会导致超调,所以通过使劲加大Kp来消除稳态误差是不现实的,那么稳态误差是什么?为什么会有稳态误差?我们来看看图:

我们可以看到,Kp从0.25到1之间的波形,我们的红线是设定值,紫线是实际值,红线和紫线的差值就是“稳态误差”,我们可以看到,Kp越大,稳态误差越小,但同样的会出现越来越严重的超调现象。当Kp为1时,超调现象已经很严重,但稳态误差仍然没有被消除,所以所以通过使劲加大Kp来消除稳态误差是不现实的。

PID稳态误差:系统进入稳态时,实际值和目标值存在始终一个稳定的差值。

稳态误差产生原因:纯比例项控制时,若误差为0,则比例项结果也为0。被控对象输入0时,一般会自发地向一个方向偏移,产生误差。产生误差后,误差非0,比例项负反馈调控输出,当调控输出力度和自发偏移力度相同时,系统达到稳态。

说白了,我们这个实验是通过PWM调节的,你想,PID的的输出值为0,那么驱动力就相当于是0,电机就不会维持原来的速度旋转了,因为电机有摩擦力,如果不持续的给驱动力,电机肯定会自发的减速,电机只要一减速,误差就不是0了,此时电机的实际速度低于目标速度,误差为正,比例项输出值是正的,随着电机持续减速,PWM占空比会逐渐增大,也就是电机驱动力度会逐渐加大,直到电机驱动力度和摩擦力的力度平衡,系统达到稳态:

1 假设没有稳态误差,则电机速度 = 目标速度。

2 此时误差为0,PID输出为0,电机没有驱动力。

3 电机必然由于摩擦力减速,产生误差。

4 误差越大,比例项输出越大,电机驱动力度越大。

5 电机驱动力度和摩擦力平衡,电机不再减速,误差不再增大,驱动力不再增大,系统达到稳态。

 

判断是否会产生稳态误差:给被控对象输入0,判断被控对象会不会自发偏移。

判断稳态误差的方向:给被控对象输入0,自发偏移方向即为稳态误差方向。

大家的疑惑:

你可能认为,这里实验PID的输出值直接给到PWM占空比这样不对,你应该error *Kp += PWM,赋值给当前的占空比,意思就是,比例项输出正,我先读取原来的PWM占空比,然后我在原来PWM占空比的基础上,加上比例项的输出,作为新的PWM占空比,这样就能实现,误差为正时,我加大占空比,必然是加速,误差为负时,我减小占空比,必然是减速,这样不就好啦?

这样的操作,确实没有稳态误差,但是会出现两个问题:

1.“比例项的输出值仅取决于当前时刻的误差,与历史时刻无关”,意思就是对于比例项来说,上一次的输出值,我们是不知道的,既然不知道上一次输出了什么,那么我们这次的运算结果,就没办法+=赋值给上一次的结果了。

2.error乘以一个系数,然后+=赋值给上一个输出值,这正是积分I的作用,你想的方法不是不可行,而是这个想法本来就是PID中的积分项!你的想法和PID的想法是一样的!

积分项(I)

含有比例项和积分项的PID输出值:

这就是PI控制,I在程序中就是累加操作,从程序开始就进行累加,就是积分。

积分项的输出值取决于0~t所有时刻误差的积分,与历史时刻有关。积分项将历史所有时刻的误差累积,乘上积分项系数Ki后作为积分项输出值。意思是,每次积分项调控时,积分项都读取当前的error,然后累加到之前所有error之和上,所以在写积分项的程序时,程序中要单独定义一个变量,用来存储error累加的和,之后这个error累加的和,乘上一个系数Ki,就是积分项的输出。

积分项用于弥补纯比例项产生的稳态误差,若系统持续产生误差,则积分项会不断累积误差,直到控制器产生动作,让稳态误差消失。也就是说,只要有积分项,系统就不会有稳态误差,因为系统输入一直存在稳态误差,则积分项会一直累计这个误差,然后积分项输出的控制力度就会不断地加大,一直加大,最终这个不断加大的驱动力,肯定会减少误差,直到误差为0。误差为0时,比例项直接输出为0,所以此时比例项没有驱动力,但是积分项,误差为0,只是表示积分项的驱动力不再变化,而之前积分项累计的驱动力不会归0,所以误差为0时,积分项可以有恒定的驱动力,这个力就可以对抗系统的自发偏移(例如摩檫力),所以有了积分项,系统不会有稳态误差。另外,这个公式里累计的是误差,所有误差的累计后,再乘以系数Ki才是输出。

那你可能又有疑问,既然积分项那么好,没有稳态误差,那还要比例项干什么?我直接纯积分项调节不叫好了吗?

实际情况是,积分项虽然好,但它本身也是有弊端的:

Ki越大,积分项权重越大,稳态误差消失越快,但系统滞后性也会随之增加。这个系统滞后性就是积分项最大的弊端,因为积分项每次的输出值,都在上次的输出值的基础上累计的,假如说,对于电机控速的例子,如果只使用积分项控制,我先让电机正转到指定速度,过段时间后,积分项累积到了正转这个速度的驱动力,然后我突然需要电机反转,那么积分项就不能立刻输出反转的驱动力,他必须首先负向累计,然后把正向的驱动力消掉,然后才能反向累计,产生反向的驱动力,这样的话,积分项的输出就慢了,这就是滞后性。

滞后性带来的问题,并不是说慢一点就慢一点影响不大,而是系统的滞后会导致不稳定,尤其是一些平衡控制的项目,积分项太大,系统根本不能稳定控制,另外,积分项还有一些其它弊端,比如积分饱和等问题。(积分饱和我们后续讲)

然后我们反观比例项,误差为正,比例项输出正向驱动力,误差一旦变为负,比例项立刻就输出反向驱动力,比例项反应是最快的,而且比例项的结果只取决于当前时刻的误差,与历史无关,比例项也不会累积,不会产生饱和的问题。

根据综上所述,积分项一般不会单独拿出来使用,而是组成PI控制器。

微分项(D)

含有比例项、积分项和微分项的PID输出值:

微分项一般配合PI使用,或者单独配合P来使用,组成PD或者PID控制器。

我们知道,微分实际上就是求导,而求导之际上就是求当前点切线的斜率,当前点切线的斜率,当前点的斜率实际上就是当前误差变化的速度,所以D项的作用,就是输出相反的力,阻碍误差的急剧变化。比如说误差非常稳定,一点也不变,那么斜率为0,D项输出为0,如果误差向一个方向变化,那么D项就会输出一个反向作用力,阻碍这个变化,且变化的速度越快,阻碍的力度越大。注意,D项输出的力,是阻碍误差变化,而和误差本身的大小没关系。

斜率一定程度上反映了误差未来的变化趋势,这使得微分项具有 “预测未来,提前调控”的特性。

微分项给系统增加阻尼,可以有效防止系统超调,尤其是惯性比较大的系统。在实战项目中,尤其是平衡类的项目,比如倒立摆、平衡车,要维持平衡,D项就非常重要。

Kd越大,微分项权重越大,系统阻尼越大,但系统卡顿现象也会随之增加。

我们先来看看微分项的波形:

实际值(蓝线)都快要到目标值了,但是斜率越来越大,就是想要一头扎进去的感觉,一看就会超调,这时微分项的作用就非常大了,让他的斜率放缓。