通过Excel学习PID算法(一步步理解它的KP,KI,KD)

 PID原理

 PID控制算是应用非常广泛的经典控制算法。但是怎么理解PID这三个参数呢?在参考了别人的文章之后,我还是有点一知半解,这时候发现不自己动手算一算是很难理解PID了,但是我又不想做这种重复的计算,于是想到了通过Excel来举个例子。

接下来,我们通过一个很简单的例子来表示一个PID控制,并用Excel来计算PID带来的好处等等。这个例子就是,我们要往桶里倒水,并且我们的目标是把水位维持在1米高,初始水位为0.5米,只能往桶里一次一次的倒水。那么我们开始我们的学习吧。

比例控制算法

对于比例控制算法,我们可以简单的理解为,每次倒入水前计算当前的误差(error),然后给这个误差乘以一个比例系数kp。那么我们水位的改变量u与error之间的关系为:u=kp*error。然后就不停的计算误差,不停的往桶里倒水。在这里,通过excel表格计算可很直观的看出来,误差越来越小的,实际越来越接近1。

 

目标 1 1 1 1 1
实际(=上一次实际+kp*当前的error) 0.5 0.5 0.75 0.875 0.9375
error(上一次的目标-上一次的实际)   0.5 0.25 0.125 0.0625
kp 0.5 0.5 0.5 0.5 0.5

我们的比例算法很好的完成了它的任务,随着倒的次数越来越多,那么我们实际也更加接近于我们的目标值。那么我们为什么还需要使用到KI和KD呢?那么我们接下来提出一个假设,假设桶在漏水,每次往桶里倒水的同时,桶都会流失0.1米水高的水。因此每次的变化量为u=kp*error-0.1,继续用excel进行一次计算吧。

目标 1 1 1 1 1 多次后 1
实际(=上一次实际+kp*当前的error-0.1) 0.5 0.4 0.55 0.675 0.7375 0.799939
error(上一次的目标-上一次的实际)   0.5 0.45 0.325 0.2625 0.200061
kp 0.5 0.5 0.5 0.5 0.5 0.5

可以看到,我们每次往桶里加水之后,由于我们的桶漏水了,所以导致在多次倒水之后,我们的实际水高维持到0.8m附近,所以导致了一个稳态误差,这意味着我们通过比例控制算法是永远都不能实现到1米水高的愿望。 (在实际情况中,这种类似水缸漏水的情况往往更加常见,比如控制汽车运动,摩擦阻力就相当于是“漏水”,控制机械臂、无人机的飞行,各类阻力和消耗都可以理解为本例中的“漏水”)所以,单独的比例控制,在很多时候并不能满足要求。

积分控制算法

由于比例控制算法在实际应用过程中的局限性很大,因此我们就需要想个办法去消除这个稳态误差,而如何去消除这个稳态误差呢?我们可以想一个办法,我们把每次计算出来的误差累加起来,当如果遇到了稳态误差,那我们这个数据就会越来越大,因此每次更新数据时,就可以把它添加上去,就能把稳态误差解决啦。每次添加的水量的计算公式为u=kp*error-0.1+ ki∗积分

目标 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
实际(=上一次实际+kp*当前的error-0.1+ki*积分) 0.5 0.45 0.705 1.0145 1.19505 1.201345 1.097231 0.980245 0.917293 0.921104 0.964281 1.009124 1.031466 1.02824 1.011019
error(上一次的目标-上一次的实际)   0.5 0.55 0.295 -0.0145 -0.19505 -0.20135 -0.09723 0.019755 0.082707 0.078896 0.035719 -0.00912 -0.03147 -0.02824
kp 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
ki 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
积分(=上一次的积分+本次的误差) 0 0.5 1.05 1.345 1.3305 1.13545 0.934105 0.836875 0.856629 0.939336 1.018232 1.053951 1.044828 1.013361 0.985121

这里我们取了一段很长的数据来分析一下,可以看到我们的实际值在1m附近不断的波动。我们的想法是,无限的趋进于1。但是看图表中的第九次(标红)和第十次(标红),我们可以发现我们的误差不是在缩小反而还更大了。那么为什么会有这种问题呢?这个肯定不是kp*error的问题,因为error非常小了。我们可以看到,由于积分维持在0.8左右,因此每次改变的量对于趋紧稳定后的数值来说,其变化量是很大的,因此其稍微改变一点,就会导致其误差变大。

同时可以看到在初期,对于使用积分控制算法来说,其超过了我们的目标值(超调量),最大达到了1.2m,如果我们的桶只有1.1m高,那么可能就会导致我们的水往外溢出来,这是我们不想看到的情况。如果在实际过程中,可能就因为温度过高或者电压过高,发生不可逆的后果。

而且我们可以看到u=kp*error-0.1+ki∗积分。当error趋紧为0时,那么每次添加的u为0。那么ki∗积分≈0.1。因此积分趋进于1。

通过百度百科我们可以知道:

1.比例环节 即时成比例的反映控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减少偏差。通常随着值的加大,闭环系统的超调量加大,系统响应速度加快,但是当增加到一定程度,系统会变得不稳定。

2.积分环节 主要用于消除静差,提高系统的无差度(型别)。 [1]  积分作用的强弱取决于积分常数,积分常数越大,积分作用越弱,反之越强。闭环系统的超调量越小,系统的响应速度变慢。

微分控制算法

引进了积分项之后,我们的控制模型虽然解决了稳态误差,但是还是有问题。这个问题就是实际值在不断的波动。同时它还有一个超调量的东西。这是我们不希望看到的,那么我们该如何去解决这个问题呢?这里就需要引进微分的概念了。其理解可以想象成在往桶里加水时,我们可能能够预感到其会超过我们想要的数值,然后在加水之前,把一部分水给倒掉,从而达到降低其超调量的作用。微分在这里可以用相邻的error的差值进行表示,因此微分可以表示为:kd*(error(t)-error(t-1)),在这里我们的u=kp*error-0.1+ ki∗积分+kd*(error(t)-error(t-1))。值得注意的是,由于误差是越来越小的,因此其微分的值一般为负值。

 

目标 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
实际(=上一次实际+kp*当前的error-0.1+ki*积分+kd*微分) 0.5 0.45 0.71 0.993 1.1444 1.15302 1.084916 1.011683 0.971846 0.968102 0.983857 1.001148 1.010293 1.010578 1.006119
error(上一次的目标-上一次的实际)   0.5 0.55 0.29 0.007 -0.1444 -0.15302 -0.08492 -0.01168 0.028154 0.031898 0.016143 -0.00115 -0.01029 -0.01058
kp 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
ki 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
kd 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1
积分(=上一次的积分+本次的误差) 0 0.5 1.05 1.34 1.347 1.2026 1.04958 0.964664 0.952981 0.981135 1.013033 1.029176 1.028029 1.017735 1.007157
微分(=本次的误差-上次的误差)     0.05 -0.26 -0.283 -0.1514 -0.00862 0.068104 0.073233 0.039837 0.003744 -0.01575 -0.01729 -0.00915 -0.00029

其最大值为1.15,超调量得到了减小。至此,PID的每个过程的功能能够简单的理解到了。

excel文件:https://github.com/zengqz98/excelforpid

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章