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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)