前陣子需要用到PID算法控制電機轉速,因為之前學的概念都模糊了,所以在網上查了一圈資料,重新學習了下,不過發現很多都是基於文字的描述,很少有通過例子展現算法過程的。這里算是記錄,也是給新手理解PID提供多一種思路.
目的:
PID 的重要性應該無需多說了,這個控制領域的應用最廣泛的算法了.
本篇文章的目的是希望通過一個例子展示算法過程,並解釋以下概念
(1)簡單描述何為PID, 為何需要PID,PID 能達到什么作用
(2)理解P(比例環節)作用:基礎比例環節
缺點: 產生穩態誤差.
疑問: 何為穩態誤差 為什么會產生穩態誤差.
(3)理解I(積分環節)作用:消除穩態誤差.
缺點: 增加超調
疑問: 積分為何能消除穩態誤差?
(4) 理解D(微分環節)作用:加大慣性響應速度,減弱超調趨勢
疑問: 為何能減弱超調
(5)理解各個比例系數的作用

好的下面就開始進入正題吧
一: 何為PID以及為何需要PID
以下即PID 控制的整體框圖,過程描述為: 設定一個輸出目標,反饋系統傳回輸出值,如與目標不一致,則存在一個誤差,PID 根據此誤差調整輸入值,直至輸出達到設定值.

疑問:那么我們為什么需要PID 呢,比如我控制溫度,我不能監控溫度值,溫度值一到就停止嗎?
這里必須要先說下我們的目標,因為我們所有的控制無非就是想輸出能夠達到我們的設定,即如果我們設定了一個目標溫度值,那么我們想要一個什么樣的溫度變化呢.
比如設定目標溫度為30度, 目標無非是希望達到圖1 希望其能夠快速而且沒有抖動的達到30度.
那這樣大家應該就明白,如果使用溫度一到就停止的辦法,當然如果要求不高可能也行,當肯定達不到圖1 這樣的要求,因為溫度到了后余溫也會讓溫度繼續升高.而且溫度自身也會通過空氣散熱的.

總結: 我們需要PID 的原因無非就是普通控制手段沒有辦法使輸出快速穩定的到達設定值.
如果你扔對此感到疑問,我們就開始用一個常用的例子來具體說明吧
二 一個例子
在開始前,我們需要將我們的公式搬出

咋一看,這個公式挺唬人的.其實你只要知道微分和積分的基本定義就可以理解.而且最終我們所有的努力也都是能夠理解這個公式,否則再精妙的比喻也無法使你真正的明白和使用.
這里我們將其離散化.(如果這步驟有些太快的話,后面再加入對此的解釋)

Kp-------比例常數
Ki= (Kp*T)/Ti------積分常數
Kd=(Kp*Td)/T------微風常數
以下我就通過一個例子具體暫時這個方程是如何工作的.
(1) 小明接到一個任務: 有個水桶,需要時刻保持1m 的高度,目前水桶里有0.2m 的水
那么小明采用P(比例) 的方法加水:即每次測量與1m 的誤差,並加入與誤差成比例的水量
比如設Kp=0.5.
第一次,誤差是 1-0.2=0.8m,那么加入水量是 Kp*0.8= 0.4mm.
第二次, 誤差是1-0.4 =0.6m 那么加入水量是 Kp*0.6=0.3m


我們發現這太完美了,那么比例環節就能夠完美的解決問題了,可是等等,在下這個結論前,我們看小明的新任務
(2)小明的新任務: 有個水桶,但桶底漏了個洞,仍需保持1m 的高度,目前水桶里有0.2m 的水,但每次加水都會流出0.1m. 這個例子就接近我們實際工程的例子了,比如電機摩擦的阻力,損耗.
我們還是來給小明解決問題吧,
第一次仍是使用P (比例控制) u= Kp* e
仍然設Kp=0.5. 則u= 0.5*e
L(最終水位) = 本次輸入u 加上上一次水位
第一次,誤差是 1-0.2=0.8m,那么加入水量是 Kp*0.8= 0.4mm.最終水位時是0.4+0.2-0.1=0.5
第二次, 誤差是1-0.5 =0.5mm 那么加入水量是 Kp*0.5=0.25mm,最終水位是0.5+0.25-0.1=0.65


我們發現了問題,水位最終在0.8m 處穩定了,這個也很好理解,當誤差是0.2m 時,加水量時0.1,每次加入的剛好等於漏掉的.
這里就引入了穩態誤差的概念:即當系統到達穩態時與目標的誤差.
那么我們加大Kp 呢.

我們發現誤差變小了,那我們繼續增大吧

我們發現系統開始震盪了.
此處使用excel 折線圖,大家可以調節參數觀察變化
結論: 比例控制引入了穩態誤差,且無法消除.比例常數增大可以減小穩態誤差,但如果太大則引起系統震盪,不穩定.
為了消除穩態誤差,第二次加入積分,使用PI(比例積分控制) u=
積分控制就是將歷史誤差全部加起來乘以積分常數.
這個式子什么意思呢,為啥就能消除穩態誤差呢.
還是先設Kp=0.5,Ki= 0.3(這個值我這里是隨意設置的)
第一次: 誤差為0.8, 比例部分 Kp*0.8=0.4, 積分部分 Ki*(e(1))= 0.24,加入水量u為0.4+0.24=0.64. 最終水位0.2+0.64-0.1= 0.74m
第二次: 誤差為0.26,比例部分Kp0.26=0.13,積分部分Kp*(e(1)+e(2))= 0.318,加入水量u為 0.13+0.318=0.448.最終水位 0.74+0.448-0.1=1.088m


我們發現,雖然過程曲折,但是最終可以穩定到設定值了.
如果 加大Ki 呢

此處使用excel 折線圖,大家可以調節參數觀察變化
結論:
1 只要存在偏差,積分就不停的累計,直到誤差為0, 積分項不再累加,變成一個常數,可以抵消穩態誤差.
大家可以看到表2 中系統穩定后,積分項約是0.1.
2 引入積分可以消除穩態誤差,但會增加超調,且Ki 增大,超調量也增大.
為了消除超調,我們引入微分作用
現在式子變成了 u=
還是先設Kp=0.5,Ki= 0.5,Kd=0.3
第一次: 誤差為0.8, 比例部分 Kp*0.8=0.4, 積分部分 Ki*(e(1))= 0.24,微分部分 =0 (因為沒加水前水位差就是0.8) 加入水量u為0.4+0.4=0.8. 最終水位0.2+0.8-0.1= 0.9m
第二次: 誤差為0.1,比例部分Kp*0.1=0.5,積分部分Kp*(e(1)+e(2))= 0.45,微分部分為Kd*(e(2)-e(1))加入水量u為 0.5+0.45-0.21=0.29.最終水位 0.9+0.29-0.1=1.09m


我們發現對比 上面那張Kp= 0.5,Ki=0.5 的圖,這張圖的震盪減輕了,這正是微分發生了作用,
大家可以看到表3中 當第2次 誤差為0.1 時,上一次誤差為0.8 時,微分是一個負數,阻止結果快速的變化.
結論: 微分能夠減弱超調趨勢.
可是,這個波形還是在震盪啊,是的,別忘了,這個值是我隨手設置的,我們不能指望我們隨便設一個值 就能使 PID 完美的工作起來,如果你自己用excel 模擬一下你就會發現,如果Ki,Kd 設置大些,這個系統會大幅度震盪起來.
因此我們就需要對Kp,Ki,Kd 整定,其實就是試 怎么使輸出達到圖1 的要求
當然這個例子其實使用PI 就可以了,我們這里是為了理解其作用的原理.
以上,如果有錯誤的地方請大家及時的指出.