1. 程式人生 > >PID演算法(上)

PID演算法(上)

最近由於要寫嵌入式實驗報告,我就偶然間瞭解到了PID控制演算法,發現小的一個燈泡亮暗的控制,大到控制無人機飛行姿態,飛行速度等等,都和PID控制演算法有著不可隔分的聯絡。於是懷著好奇心,我在youtue上看到一個講PID控制演算法很好的視訊,不能翻牆的童鞋也可以在B站上看到前三節。

B站地址:https://www.bilibili.com/video/av6451899/?spm_id_from=333.788.videocard.0
youtube地址:
https://www.youtube.com/watch?v=nDZf_tJZks0&list=PLuBO1RvnSkLEwH17JYdEmyfi08WXfEgpU

下面是我針對視訊做的一些筆記:

我們先來談談傳統的控制演算法:

一. 二位式控制演算法

我簡單的畫了一下流程圖,方便我們理解:

二位式控制演算法

使用者設定:使用者通過可調電阻或者是按鈕,輸出一個使用者所期望的值,我們稱為設定著Sv。比如是溫度控制的話,這個設定值就是溫度,比如使用者通過熱水器控制開關調到100度,此時傳遞的Sv值就是100

位式控制演算法:它輸出一個控制訊號,我們稱之為out,這個輸出的訊號就加到我們的執行器件上。位式控制演算法的輸入訊號主要來自於兩個,一個是使用者設定的值Sv,一個是控制物件當前的值Pv。我們控制物件當前的溫度值通過一個感測器,把這個控制物件當前的值獲取,然後傳送回位式控制演算法的輸入端,稱為Pv。

執行部件:一般屬於開關型部件,比如說莫斯管,繼電器或者是可控矽之類的開關型部件。其輸出的訊號加到我們的控制物件上。

控制物件:就是我們例子中講的加熱器,或者是步進電機,或者說是這個電磁閥這些。

Sv和Pv這兩個值,在位式控制演算法中,通過一些比較,或者說是放大縮小,做一個判斷處理後,將輸出訊號作用到執行部件,然後這個執行部件就去控制我們的控制物件,使其當前值發生改變。

位式控制演算法的基本特點:

輸出訊號比較單一,一般來說只有兩種狀態,高電平或者是低電平,其對應的驅動我們的控制物件也就只有兩種狀態,要不是工作,要不就是不工作。因為它輸出的是一個開關訊號。

位式控制演算法輸出訊號out的依據:就是把Sv和Pv進行比較。
Pv < Sv 則輸出高電平,開啟開關
Pv >= Sv 則輸出低電平,關閉開關

位式控制演算法的缺點:

1.其輸出值只有兩種狀態。意味著這個執行部件的開關器件要麼處於一個接通狀態,要麼處於一個斷開狀態。那假如說控制物件是加熱器的話,那有一個電源來給其加熱。而我們的控制部件就控制著電源的通和斷。控制演算法過於簡單,單純的吧Pv和Sv比較。則控制物件要麼一直處於高功率運作,要不就是處於一個0W的情況下工作。最終導致我們感測器傳回來的溫度值,總是在這個設定值100度上下浮動。

產生這種波動的原因,主要是因為控制物件,它本身具有一定慣性。就是電已經加上了溫度卻還一直往下掉,而電已經斷開了,溫度還一直往上升。

2.最大的缺點就是,其只考察控制物件當前這個感測器回來的值與目標值之間相差了多少。

因為位式控制演算法其不能把我們的溫度控制到100度,其溫度實際上會在上下幾十度波動。很難達到理想的控制效果,在這種情況下,我們就引入另一種控制演算法PID演算法。

二. PID控制演算法

PID演算法可以說是在這個位式控制演算法上做了很多的調整和優化。
1. 不僅考略你當前的值有沒有達標,其還考慮你之前有沒有達標過
2. 對輸出做了調整,不僅僅只輸出兩種可能。擺脫了位式控制演算法輸出的不平滑,要麼是很大功率的滿負荷工作,要麼是徹底停下來。

PID控制演算法的流程圖我繪製如下:

PID控制演算法

Sv是使用者的設定值,也就是目標值。
Pv是控制物件的當前值。
偏差訊號(通常用E來表示) = Sv – Pv
歷史偏差:我們其實可以理解為一個儲存器,即從這個裝置一通電開始,得到的所有的偏差值用這個儲存器來存起來。
當前誤差:存的是當前時刻的偏差值
最近偏差:存的是距離很近的,最近兩三次的偏差值

把這三個誤差值進行線性疊加。疊加之後輸出一個控制訊號。

PID演算法的形成原理:
(1) 資料序列

用x1來代表開機的第一個時間點,用x2來代表開機的第二個時間點,以此類推可以得到資料序列即:
從開機以來,感測器所有的取樣點的資料序列(當然是時間間隔越短越好):
x1 x2 x3 … xK-2 xK-1 xK

分析這個取樣點的資料序列,可以挖掘出三個方面的資訊(即PID演算法中的一個P 一個I 一個D)

(2) 資訊一:比例演算法分析

我們把當前從感測器得到的值Pv,也就是資料序列裡的xK,與使用者輸入的期望值進行偏差運算:

  Ek = Sv – xk (Ek表示現在這個時間點感測器回來的值與我們目標值之間的這樣一個偏差程度)
  這個Ek分析則可以取三個值:
  Ek 值  >0  當前控制未達標
      =0  說明正好達標
     < 0. 說明已經超標

然後我們將這個值放大或縮小。即把Ek乘一個數Kp(kp可以理解為一個衰減器或者是放大器,來調整我們感測器回來的偏差值) 把這個乘積的結果作為out輸出

Eout = Kp * Ek + out0

用這兩個數相乘來控制這個輸出訊號的控制,我們稱之為比例控制。比例控制的特點:就是輸出訊號的大小OUT與我們當前的偏差值Ek成比例。PID演算法輸出訊號不再只有高和低兩種,其輸出的為PWM訊號。

PWM訊號:

就是指的是我們算一個PWM為一個訊號控制週期(這一個週期中,有高電平也有低電平,不同的是其脈寬可以不同,即可以有90/100s輸出高電平,10/100s輸出低電平)這樣以來就可以使控制物件的功率在1/100到100/100之間波動。而不會出現只有滿功率和不功率。而具體是哪個功率呢,就看我PID演算法所輸出的值的大小,輸出的值越大,其脈寬就越寬,那麼控制物件在一定時間內得到加電時間就會加長。

也就是說通過改變控制物件在一個週期內這個工作與停止的時間比例來調整。所以總而言之,比列控制就是根據當前偏差值比例大小輸出控制訊號

比例調節缺點為:

當Ek = 0的時候,out就變成0了。
輸出訊號等於0的意思是我不輸出控制訊號了,也就是我不控制你了,那這個時候我的這個負載就是處於失控的狀態。缺點是有誤差我才控制,沒有誤差我就不起作用了。所以導致這個比例算法系統在工作的時候總是有誤差,因為沒誤差的時候不工作了啊。

為了改善這個。可以在out = Kp’ * Ek 後面加一個常數,叫 OUT零

所以我們把這個輸出叫Pout比例

Pout = Kp' * Ek + out0

(2)資訊二:積分演算法分析(Sk說明歷史情況,Ek說明當前情況)

我們把資料序列中的每一項都和使用者所設定的期待值作差運算,分別得到E1,E2,等等。

E1 = Sv -x1 E2 = Sv-x2以此類推得到歷史的偏差序列:

E1  E2  E3 … Ek-2 Ek-1 Ek

很明顯我們知道這個序列中有些值為正數,有些值為負數,還有極少量為0。然後我們把這個偏差序列求一個代數和即:

Sk = E1 + E2 +….+Ek(每一項可正可負,所以不會無窮大)
這樣我們得到的Sk也有三種結果:
  Sk > 0  說明比設定值小的數多於比設定值大的數。 說明過去這段時間,大多數時候未達標。
  Sk = 0  說明平均下來都達標了
  Sk < 0  說明大多數時候已經超標了
  此時輸出訊號OUT 訊號= Kp’ * Sk(因為其把歷史上的資料都加起來了,就可以理解為一種積分。積分實際上就是偏差求和)

這裡也有一個問題,當Sk為0時,即只要歷史上是好的,我就不管你了,所以也要在後面加一個OUT零

Sout = Kp' * Sk + out0

(3)資訊三:微分演算法分析(有一種預見性趨勢)

這個演算法只考慮前一個時刻和這個時刻,這兩個時間點,所以我們把最近兩次的偏差相減得到如下:

Dk = Ek – Ek-1

當然Dk也有三種取值,不過這三種取值都不太好了解,我們可以藉助畫x y座標軸分析,也可以將其想象成物理中的單位速率,然後來理解

Dk >0  偏差變化率越大 變的越快 在這兩個時間點之間產生了劇烈的變化
說明這個偏差有增大的趨勢,我們由此可以預測出下一個時間點也會有一個大的突變(因此此時要大幅度調整輸出訊號,來應對這種突變)
Dk = 0  
Dk < 0
我們的輸出同時也對其進行擴大處理:
Dout = Kp*Dp(誇大的目的為了更好的抑制它)

微分控制演算法的缺點:

當Dk = 0的時候,此時說明其兩次的偏差變化頻率是一樣的,但是,頻率一樣不代表沒有偏差。但是此時系統卻什麼也不做,所以我們說微分控制不能夠獨立行動。它獨立行動的話,系統肯定是有誤差的。

微分演算法的依據是偏差有沒有變化趨勢,偏差有了變化趨勢,我才控制,沒有變化趨勢,我就不去改變。也就是說無論你偏差多大,只要你一直很平穩的差著,這樣就不會對其進行矯正了。

所有有時候就希望在微分控制變化率沒有改變的情況下,我們還對系統持有控制,也會在它後面加上一個OUT零。

Dout = Dk * Kp'' + out0

讓我們來回顧一下:

積分演算法:
其總是根據歷史上的結果來進行判斷。積分演算法有時候給人一種很陳舊的感覺,也就是那些歷史上遺留的問題也會帶到我們的控制系統上來。所以,有時候產生的效果並不好。

其優點為:其考察了歷史因素,我們能走到今天,就是因為歷史上的這些因素,而導致的結果。我們可以考察歷史因素,但不能單單考慮。

微分演算法:
微分控制不能夠獨立行動,但它能檢測到突變,並且根據已知現象進行未來的預測比如,在前一刻將冷水突然倒在熱水器上,這種突變就能被微分演算法檢測出。此時我們就要加大電壓的輸入,以使它更快地恢復。

(4)PID演算法——三個演算法的綜合

PID演算法的數學模型:

PID的輸出 = Pout + Iout + Dout
= (Kp * Ek + out0) + (kp’ * Sk + out0) + (kp’’ * Dk + out0)
我們給其做一個歸併
PIDOut = Kp (Ek + Sk + Dk) + out0

這就形成了PID演算法的基本思想。

算出的數值就能控制我們的脈衝的寬度。比如我們算出的值為800,則輸出高電平800 低電平200

由此可見PID控制演算法已經很公正了。其實視訊後面還講解了關於Ek Sk Dk的確定問題。等看完了一定補一篇部落格~