夏天到了,天太热了,我想把空调设定在26℃,凉凉快的,太舒服了。然鹅原本我以为能将空调温度设置在26℃的主要原因是在遥控器,再通过不断地学习之后,才发现最最最核心的就是今天的主角PID算法。那么问题来了,什么是PID呢?
一、PID的定义
PID(proportion integration differentiation)其实就是指比例(Kp),积分(Ki),微分(Kd)控制。话不多说,上干货!
从框图上我们能得到的东西是有限的,这不,表达式说到就到。
其中:Kp刚才说过了时比例参数,e(t)表示误差,Tt积分时间,Td微分时间。
把这个表达式丢出来各位看官老爷们一定还是云里雾里的,这是什么呀,每个字母都认识,连在一起就看不懂了。嘿嘿,各位稍安勿躁,我讲一个故事来帮助大家进行理解。
一个人要把水缸里的水加到要求的位置,他刚开始用瓢去接水,一趟有一趟的过了好久才漫过缸底,他说不行,我要用桶接水,结果两桶水下去,差点水就溢了出来,于是他又换用盆去接水。就这样它圆满的完成了任务,而他所用的瓢呀桶呀盆呀就是我们所说的比例系数Kp。
好巧不巧,这个桶有个洞,在不停的漏水,这也就是我们所说的误差,他想着我每隔十分钟来加一次水,结果他发现十分钟水并没有少多少,于是他决定半个小时来一趟,结果半个小时过去了,水缸里的水全没了,他把加水的时间调整到每二十分钟来一趟。这个时间就是我们的采样时间。
他就每低于水位的时候加一盆水进去,后果可想而知吧,没错,水溢出来了把他的鞋也给浇湿了,于是他想到了每次被直接把水加进水缸里,而是用漏斗一点点的往水缸里漏,尝试了好多次,选用了一个口径合适的漏斗,其中漏斗漏水的时间又被称为积分时间
他正在暗自庆幸自己聪明的时候,任务又来了,水低于水位的是时候必须加水,他又想到了可以在水位线上面凿一个洞,按上一个水管,然后直接加一盆水,把多余的水从存在木桶里。这样从水管里流水的时间又被称为微分时间。
通过这个小故事,相信大家对这个表达式又有了更深一步的认识。但是如何对这些参数进行调试又成了一个新的问题。
二、参数的调试
遇到事情不要慌,躺平是不可能躺平的,先容我给大家说一个顺口溜。
由着一个顺口溜我们可以发现,调试的顺序是Kp,然后是Ki,最后是Kd。
首先我们先聊聊Kp的调试,我们调Kp的时候,把另外两个参数先放在一边,依旧是那个水缸,依旧是要往水缸里加水1m,最初水缸里有0.2m的水,所以误差是0.8m,如果单纯的用比例控制算法,就是指加入的水量u和误差error是成正比的。即u=kp*error ,假设Kp=0.5,那么t=1的时候,u=0.5*0.8=0.4。所以此时缸里已经有了0.6m的水了;继续加水t=2时,此时误差是0.4,u=0.4*0.5=0.2,所以第二次加水的时候缸里就有了0.8m的水了。依次往下继续加水,我们会发现在第n次的时候我们加满了。这就是比例控制算法的运行方法。
但是正如我们所说的,桶上有个洞,每加一次会漏出0.1m的水,这时候我们会发现t=1时,u=0.6,桶里的水则只有0.5m;依次往下加水会发现,如果不进行改变的话,水位会永远停在一个固定的值,永远到不了1m,这就说明系统已经到达了稳态,而由此产生的误差被称为稳态误差。我们生活中最常见的就是阻力。所以单单改变Kp值,有时候并不能满足要求。
为了解决有稳态误差引起的问题,我们引入了一个新的控制算法叫积分控制算法。原理是在积分控制中控制器的输出与输入误差信号的积分成正比关系。如果系统进入稳态后存在稳态误差,必须引入积分环节以消除误差。积分项为误差对时间的积分,即便误差很小,随着时间的增加积分项也会增大,引导控制器增大输出使稳态误差减小,直至稳态误差为0。
由上图不难发现如果只增大Ki时,波形会发生剧烈的波动,就像一辆小车在路上缓慢的行使着,突然一脚油门冲到了100迈然后又一脚刹车刹到了10迈,那么里面的乘客一定会被猝不及防的加速刹车搞得想吐,所以为了消除引进积分是带来的剧烈波动,我们会再引进另一个参数Kd进行平衡。
在没有微分项时,由于积分项是对误差进行累积,所以Kp和Ki所产生的信号会很大,有时会超过我们想要的预设值,然后在预设值附近来回振荡,所以我们需要一个反方向的信号来抵消Kp和Ki所带来的影响,这是微分项就有了很实用意义。当误差累计越快,微分项的绝对值也就越大。误差增加时,微分项的值为正;误差减小时,微分项的值为负,只有误差为常数时,微分项为0。
总结
比例(P)+积分(I)控制器可以使系统在进入稳态后无稳态误差;
比例(P)+微分(D)控制器能改善系统在调节过程中的动态特性;
总的来说,PID控制其实是对反馈的误差进行控制的过程,如果误差为0,则比例环节不起作用,只有误差存在才进行比例调节;积分环节是用来消除稳态误差;微分环节根据误差信号的变化趋势进行超前调节。