PID算法總結

嵌入式控制必須掌握的算法:PID。
寫這篇文章希望儘可能多的記錄關於PID的思考,以及在學習PID過程中的各種疑問,文章不會結束,非常希望看到文章的諸位積極指出錯誤,或積極留下你們的疑問、思考方式,幫助我本人及其他人加以理解。

另一篇,PID算法C語言模擬演示

PID理論講解:
在這裏插入圖片描述
上圖的通俗表示:
在這裏插入圖片描述
連續PID公式:
連續控制系統的PID公式
離散化PID公式:
可在實際處理器中運算的離散化PID公式(位置式PID)
比例環節的理解:
通俗理解:

偏差一旦產生,比例項立刻去減小偏差,它在整個PID調節中起主導作用。
比例項的輸出大小與誤差成正比,誤差越大,比例項輸出就越大。
實際應用中,往往會添加一個比例係數 Kp,爲什麼呢?因爲,如果真的只是單單把誤差值
直接代入計算,往往並不能達到理想效果,一個PID系統剛剛做出來,雖然它已經帶有PID,
並且已經在那裏發揮作用,但此時PID各個環節輸出量肯定不是剛剛能完美的讓系統穩定到
我們期望的目標值上,世上沒有那麼巧的事。所以,我們需要在不斷調試中,讓各個環節輸
出一個最合適的值,如何調節呢?在比例環節中,就是通過這個比例係數 Kp 調節。從第一
個圖中可以看到,比例環節的輸出量  P=Kp*e,也就是說,通過改變 Kp 的大小,可以改變
輸出值。
在實際應用中,Kp越小,P就越小,Kp越大,P就越大。而過大過小都不是好事, Kp 越大,
被控單元面對誤差值做出的反應就越激烈,雖可以很快的修復出現的差值,但過激反應一定
是造成修復偏差值之後繼續偏離目標,系統會表現出忽高忽低的震盪;Kp值越小被控單元
的反應就越平穩,但是不能很快修復差值;所以,這需要我們不斷修改 Kp 值,找到一個
合適的範圍。

理論理解:

暫無內容。

上面只是直觀的描述了比例控制的原理效果,下面再說一些不那麼直觀的問題:

1、比例控制的靜態誤差。
單用比例控制時,理論上也能達到最終目標值,但事情往往不是理想的,任何系統都會因
爲種種原因存在干擾,實際比例控制時,系統總會達不到目標值,如果理解不動,在這裏
我引用一個別人的描述例子說明下爲什麼存在穩態誤差:
舉例水桶加水過程,我們希望把水加到1m,現水位高度爲0.2m,比例係數Kp=0.5,比例
控制過程如下:
第一次計算誤差:1-0.2=0.8
第一次輸出值:0.5*0.8=0.4
此時水位:0.2+0.4=0.6

第二次計算誤差:1-0.6=0.4
第二次輸出值:0.5*0.4=0.2
此時水位:0.6+0.2=0.8

第三次計算誤差:1-0.8=0.2
第三次輸出值:0.5*0.2=0.1
此時水位:0.8+0.1=0.9

第四次計算誤差:1-0.9=0.1
第四次輸出值:0.5*0.1=0.05
此時水位:0.9+0.05=0.95

這樣循環下去,總有一天會把水桶加滿,但如果考慮到干擾呢?比如因爲蒸發、水桶漏水,
水總以0.1m的速度流失,此時你將總加不滿,因爲你從0.9m開始往後,只能加0.05m的水,
此時加水速度已經趕不上漏水速度,而且比例項越到目標值附近,每次加的水越少,而且,
比例項本來就落後於誤差,因爲你是先看到水位確實不夠,而後才採取加水行動,只要持
續漏水,即使漏水速度很小,也永遠不能加滿,而水也不至於漏完,畢竟你一直在加水,
水桶最終會到達一個加水與漏水的平衡點,目標水位1m減去這個平衡點,這就是“穩態誤差”。

(關於比例控制還有什麼問題,歡迎留言評論。)

比例控制的靜態誤差
那麼既然有個靜差,我們就要想辦法消除這個靜差,這時候,就需要積分控制了。

積分環節的理解:
通俗理解:

上面我們提到了靜差,如何消除靜差呢?靜差一般是很小的,就差一點就能達到目標值,
但就是上不去,怎麼辦?想個辦法額外增加一些輸出唄。如何額外增加呢?這就要靠積分
思想了。網上的資料大多都只在講,積分控制就是對誤差的積分求和,然後乘上個積分系
數,再然後就說這樣就能消除靜差了,想了很久纔想明白這裏的“求和”到底是什麼意思。
積分在實際系統中也是一樣,前面多加個方便我們以後實際調參的係數,這裏稱爲積分系
數 Ki:

j積分項計算公式
所謂的“通過對歷史誤差積分求和,以達到消除靜差的目的”應該這樣理解更方便些,下面用這個圖表示下積分是如何消除靜差的:
積分項消除穩態誤差過程
不知道這樣解釋對不對,希望讀者指正。

理論理解:

微分環節的理解:
通俗理解:

微分項可以在系統有波動時,提前調整輸出量,從而減小波動幅度。
公式:Kd * ((ek)-(ek-1)),其中 Kd 爲微分系數,跟 Kp、Ki 一樣,也是實際調參中需要去調整的值。
微分項只關注差值的差值,就是:本次誤差值-上次誤差值=兩次誤差值的差值。
關注這個值有什麼用呢?其實在連續PID公式中,微分項算出來的其實就是斜率,這個斜率
可以反映出輸出量的變化幅度(或者說目標值出現偏差的幅度),特別是出現突然變大/變小
時,可以削弱這種變化,好讓下次的輸出不再那麼“突然”,使系統平穩的達到它想達到的目
標,而不是繼續放任這個突然變化,給系統帶去更多不穩定。那麼他是如何做到的呢?

如下圖:
微分作用

如圖,水位已經穩穩的停留在了1m,但突然因爲某些干擾,把水加到了1.5m,此時會怎樣?
如果放任不管,系統可能還是會沿着粉紅色軌跡重新穩定到1m,但所需時間是很長的,這時
就需要微分控制來幫助比例控制沿着黑色線儘快使系統回到目標值,再看下微分計算公式:
Kd * ((ek)-(ek-1))
我們看下此時的“差值之差”:
它等於= ((ek)-(ek-1)) = -0.5-0 = -0.5
設 Kd=0.5
則此時微分輸出值 = Kd * (-0.5)
                              = 0.5 * -0.5
                              = -0.25
可以看到微分項算出來是負值,跟總輸出量相加後,總輸出量會減少0.25,也就是說,微
分項減少了總輸出量,讓系統波動儘快“剎車”,而不至於任由比例控制項衝到粉紅色軌跡。
(特別是慣性大的系統,雖然此時比例項輸出其實也並不猛烈,但由於系統本身的慣性,
一般都是會衝過頭的)
這樣說明不知道是否準確,望讀者指正。

理論理解:

微分項其實計算的就是誤差曲線的斜率,我們看下斜率公式:
百度上的斜率公式

微分時間
積分時間
連續函數中的Ti,Ti越大,積分速度越慢,效果越弱,Ti越小,積分速度越快,效果越強,如何理解?是不是是指Ti越小,不斷相加的誤差值數量就越多?
積分對誤差的累加過程何時調整,當目標值改變,積分累加是怎樣的
積分項是從開機一直在加誤差嗎,還是隻將跟當前偏差值之前的歷史偏差的其中一部分相加?如果從開機就一直加,剛開機那端的巨大偏差如何能消除呢?

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