PID原理及调参经验

什么是PID以及为什么要用PID
PID是一种控制算法,举个比较简单的例子,给你一个任务,让一个漏水的水缸保持一半的水,在没有学习任何算法情况下,我们一般会一直去观察水位是高于还是低于中间水位,低于中间水位时你就会开水龙头,高于中间水位时你就会关水龙头,这样就可以让水位一直保持在中间水位附近。这也是一种控制。从上面的例子以及结合下图我们引入几个重要的概念。
在这里插入图片描述
在上面的例子中我们用眼睛去观察水位到了哪个位置,其实眼睛就是个测量元件,是用来观察的,输入就是中间水位,我们用眼睛去比较实际的水位是不是高于或者低于中间水位,在我们的大脑里面运算调节,通过执行机构也就是我们的,来调节水龙头的阀门也就是输出,从而使水位一直在中间水位附近,当然,肯定有人会问,为什么会漏水呢?因为在实际工程中都会有一些损耗,比如电机摩擦的阻力,电磁损耗等。
u(k)=Kp * e( k )+ Ki * e( r ) + Kd * [e(k)-e(k-1]
PID的离散公式如上,Kp为比例系数,ki为积分系数,Kd为微分系数,e(k)为本次偏差,e(k-1)为上次偏差,e( r )为系统开始运行到结束所累加的误差,u(k)为输出,具体的数学推导请读者自行百度。
既然是要学习,那么现在我们我们用PID算法来对水位进行具体的控制。我们规定中间水位为5m,将水龙头和水缸分离,以水缸的水位作为单位,水缸的刻度精度为0.01m,水缸每秒的漏水量为0.1m水位,每次加水的时间为1s。现在,我们先只使用比例控制,也就是,u(k)=Kpe(k),我们每次的加水量u(k)等于比例系数Kp当前的水位与设定水位的偏差e(k),我们让kp=0.4。假设现在水缸里没有水,根据上面的公式,我们第一次观察到的偏差为5-0=5m,所以我们第一次加水量为,5x0.4=2.0m,现在第一次加水完毕之后,减去漏水量0.1m,所以现在水缸里实际水量为2.0-0.1=1.9m,依次类推,我们得到下表,用MATLAB直接做图,如下图
在这里插入图片描述
在这里插入图片描述
通过观察表格我们发现,从第14次加水之后,也就是当水缸里的水位达到4.75m的时候,水缸的水位不再变化,为什么水位不再上升呢?我们来算一下,中间水位为5m,我们在第13次加水之后观察到的偏差为5-4.75=0.25,在乘以Kp,也就等于0.1m,到了这时候,我们加入的水刚好等于漏掉的水,水位不再上升。这里我们引入一个新的概念,稳态误差。简单理解就是当我们只采用了比例调节,我们的输出刚好等于损耗时,系统达到平衡,但是我们的输入和输出之间仍然有偏差的,我们就称之为稳态误差。
但是需要加13次水才可以到达平衡,响应速度慢,而且还存在稳态误差,那我们可不可以通过放大比例系数Kp来快速到达设定水位且消除稳态误差呢?这里我们让Kp=1.8,看看会发生什么
在这里插入图片描述在这里插入图片描述
结果显示,系统响应明显加快,稳态误差从0.25m减少到了5-4.93=0.07m,所以增大比例系数Kp可以减小稳态误差,但是不能消除,而且Kp过大输出会在设定值也就是我们的中间水位之间震荡,这样的结果显然不是我们想要的。
因为从公式中我们可以看出比例调节是一种有差调节,也就是只有当e(k)不等于零的时候,才会有输出值,当e(k)=0时,实际水位等于中间水位,系统输出为零,但是实际水位会一直中间水位吗?不会,因为会漏水。所以无论我们选取的Kp值有多大,稳态误差都会存在。那么我们应该在系统不震荡的情况下,尽量增大Kp的值,让系统的响应变快,减少稳态误差。最终选定了Kp=1.0,结果如下,稳态误差为0.11m,且只需加两次水就可以达到平衡。
在这里插入图片描述
在这里插入图片描述

所以我们对比三次实验可以得出结论:Kp越大,系统的响应越快,但是系统容易震荡,稳定性变差;Kp越小,响应时间越慢,调节时间变长,所以Kp的选取应该在系统不震荡,超调量不大的情况下往大调。
那么问题来了,稳态误差存在,水位还是没达到设定水位,怎么样才能正确地消除稳态误差呢?上面公式中的积分项e( r )为系统开始运行到结束所累加的误差,但是误差不能毫无限度的累加,需要对其限幅,我们需要根据系统的实际情况选择合适的限幅值,这里我们令e( r )=[-2,2],现在我们尝试看看加入积分项能不能消除稳态误差。我们将Kp=1.0,ki=0.1。如上例进行计算,我们得到表格。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过观察表格我们发现,最终实际水位最终会基本达到中间水位,在比例控制的基础上加入积分控制就可以消除稳态误差。但是加了37次水才可以让实际水位等于设定水位,而且会引起超调。我们试着把Ki增大,令Kp=1.0,ki=0.3,结果如下
在这里插入图片描述
在这里插入图片描述
结果我们发现,增大Ki之后,只需要加16次水就可以设定水位,但是超调量变大了。在将Ki增大,令Kp=1.0,Ki=0.5,结果如下
在这里插入图片描述
在这里插入图片描述
结果我们发现,继续增大Ki之后,只需要加11次水就可以设定水位,但是超调量变得更大了。我们对比三次实验可以得出结论,增大Ki会引起超调,Ki越大,超调量越大,但是回复更快,减小Ki超调量减小,但是回复变慢,所以Ki参数的选取应该根据系统的实际情况。
但是有没有办法能够让超调量减少呢?当然有,那就是微分项,微分的公式为Kd*[e(k)-e(k-1],e(k)为本次偏差,e(k-1)为上次偏差,从公式上理解为,当本次偏差大于上次偏差时,微分项就会输出来抑制这种偏差偏大的趋势,起到一种预判的作用,既然是这样,上例中积分超调变化算是一种误差变大的趋势,为了能够更好地让读者理解微分项的作用,我们直接对比没有微分项Kp=0.6,ki=0.5,Kd=0与有微分项时Kp=0.6,ki=0.5,Kd=0.1的数据与波形对比
在这里插入图片描述无微分项的表格
在这里插入图片描述
无微分项的波形
在这里插入图片描述
有微分项的表格
在这里插入图片描述
有微分项的波形
通过对比我们发现,加入微分项之后,超调量比之前小了,说明微分确实能够减少超调量,但是通过观察数据你会发现,没有微分项的时候,水位一直在平衡位置有小幅度的震荡,但是在加入微分项之后就消失了。这是因为加入微分项可以改善系统的动态性能,也就是当已经到达平衡之后又出现偏差时,当前偏差减去上次偏差不为零,微分项有输出,会去抑制这种变化,让系统保持平衡。
到这里,总结一下,在整定比例系数Kp时,Kp越大,系统的响应越快,但是系统容易震荡,稳定性变差;Kp越小,响应时间越慢,调节时间变长,所以Kp的选取应该在系统不震荡,超调量不大的情况下往大调;在整定积分系数Ki时,增大Ki会引起超调,Ki越大,超调量越大,但是回复更快,减小Ki超调量减小,但是回复变慢,所以Ki参数的选取应该根据系统的实际情况;增加微分项可以减少超调量,而且可以改善系统的动态性能。但在实际工程应用中,可以根据实际情况使用PI调节或者PID调节。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页