PID原理及調參經驗

謂之不二發表於2020-12-05

什麼是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調節。

相關文章