通過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

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