首頁 - 關于我們 - 新聞活動 - 重溫經典PID算(suàn)法

重溫經典PID算(suàn)法

2020-3-13新聞

image.png

PID算(suàn)法可(kě)以說是在自動控制原理(lǐ)中比較經典的(de)一套算(suàn)法,在現實生活中應用(yòng)的(de)比較廣泛。


大(dà)學參加過電子競賽的(de)朋友都應該玩過電機(或者說循迹小車),我們要控制電機按照(zhào)設定的(de)速度運轉,PID控制在其中起到了(le)關鍵的(de)作用(yòng)。


說來(lái)慚愧,大(dà)學這(zhè)門課程學的(de)不咋滴,老師講的(de)課基本沒聽(tīng)進去過。直到後面接觸競賽,算(suàn)是對(duì)PID有了(le)很基礎的(de)一點點認識,直到現在工作實際應用(yòng)的(de)比較廣泛才知道它的(de)重要性。所以,這(zhè)裏特地回顧一下(xià)。


什(shén)麽是PID

PID,即比例Proportion積分(fēn)Integral和(hé)微分(fēn)Derivative三個(gè)單詞的(de)縮寫。


閉環自動控制技術是基于反饋的(de)概念以減少不确定性在閉環自動控制原理(lǐ)中,我們把它叫做(zuò)“PID控制器”,拿控制電機來(lái)說,參考下(xià)面模型:

image.png

下(xià)面引用(yòng)一段網上經典的(de)話(huà):

在工業應用(yòng)中PID及其衍生算(suàn)法是應用(yòng)最廣泛的(de)算(suàn)法之一,是當之無愧的(de)萬能算(suàn)法,如果能夠熟練掌握PID算(suàn)法的(de)設計與實現過程,對(duì)于一般的(de)研發人(rén)員(yuán)來(lái)講,應該是足夠應對(duì)一般研發問題了(le),而難能可(kě)貴的(de)是,在我所接觸的(de)控制算(suàn)法當中,PID控制算(suàn)法又是最簡單,最能體現反饋思想的(de)控制算(suàn)法,可(kě)謂經典中的(de)經典。經典的(de)未必是複雜(zá)的(de),經典的(de)東西常常是簡單的(de),而且是最簡單的(de),想想牛頓的(de)力學三大(dà)定律吧,想想愛(ài)因斯坦的(de)質能方程吧,何等的(de)簡單!簡單的(de)不是原始的(de),簡單的(de)也(yě)不是落後的(de),簡單到了(le)美(měi)的(de)程度。


PID原理(lǐ)

常規的(de)模拟 PID 控制系統原理(lǐ)框圖如下(xià):

image.png

該系統由模拟 PID 控制器和(hé)被控對(duì)象組成。


上面框圖中, r(t) 是給定值, y(t) 是系統的(de)實際輸出值,給定值與實際輸出值構成控制偏差e(t) = r(t) − y(t).


e(t) 作爲 PID 控制的(de)輸入, u(t)作爲 PID 控制器的(de)輸出和(hé)被控對(duì)象的(de)輸入。 所以模拟 PID 控制器的(de)控制規律爲:

image.png


三個(gè)重要的(de)參數

Kp:控制器的(de)比例系數.

Ti:控制器的(de)積分(fēn)時(shí)間,也(yě)稱積分(fēn)系數.

Td:控制器的(de)微分(fēn)時(shí)間,也(yě)稱微分(fēn)系數.


1、P - 比例部分(fēn)

比例環節的(de)作用(yòng)是對(duì)偏差瞬間作出反應。偏差一旦産生控制器立即産生控制作用(yòng), 使控制量向減少偏差的(de)方向變化(huà)。 控制作用(yòng)的(de)強弱取決于比例系數Kp, 比例系數Kp越大(dà),控制作用(yòng)越強, 則過渡過程越快(kuài), 控制過程的(de)靜态偏差也(yě)就越小; 但是Kp越大(dà),也(yě)越容易産生振蕩, 破壞系統的(de)穩定性。 故而, 比例系數Kp選擇必須恰當, 才能過渡時(shí)間少, 靜差小而又穩定的(de)效果。


2、I  - 積分(fēn)部分(fēn)

從積分(fēn)部分(fēn)的(de)數學表達式可(kě)以知道, 隻要存在偏差, 則它的(de)控制作用(yòng)就不斷的(de)增加; 隻有在偏差e(t)=0時(shí), 它的(de)積分(fēn)才能是一個(gè)常數,控制作用(yòng)才是一個(gè)不會增加的(de)常數。 可(kě)見,積分(fēn)部分(fēn)可(kě)以消除系統的(de)偏差


積分(fēn)環節的(de)調節作用(yòng)雖然會消除靜态誤差,但也(yě)會降低系統的(de)響應速度,增加系統的(de)超調量。積分(fēn)常數Ti越大(dà),積分(fēn)的(de)積累作用(yòng)越弱,這(zhè)時(shí)系統在過渡時(shí)不會産生振蕩; 但是增大(dà)積分(fēn)常數Ti會減慢(màn)靜态誤差的(de)消除過程,消除偏差所需的(de)時(shí)間也(yě)較長(cháng), 但可(kě)以減少超調量,提高(gāo)系統的(de)穩定性。


當 Ti 較小時(shí), 則積分(fēn)的(de)作用(yòng)較強,這(zhè)時(shí)系統過渡時(shí)間中有可(kě)能産生振蕩,不過消除偏差所需的(de)時(shí)間較短。所以必須根據實際控制的(de)具體要求來(lái)确定Ti 。


3、D - 微分(fēn)部分(fēn)

實際的(de)控制系統除了(le)希望消除靜态誤差外,還(hái)要求加快(kuài)調節過程。在偏差出現的(de)瞬間,或在偏差變化(huà)的(de)瞬間, 不但要對(duì)偏差量做(zuò)出立即響應(比例環節的(de)作用(yòng)), 而且要根據偏差的(de)變化(huà)趨勢預先給出适當的(de)糾正。爲了(le)實現這(zhè)一作用(yòng),可(kě)在 PI 控制器的(de)基礎上加入微分(fēn)環節,形成 PID 控制器。


微分(fēn)環節的(de)作用(yòng)使阻止偏差的(de)變化(huà)。它是根據偏差的(de)變化(huà)趨勢(變化(huà)速度)進行控制。偏差變化(huà)的(de)越快(kuài),微分(fēn)控制器的(de)輸出就越大(dà),并能在偏差值變大(dà)之前進行修正。微分(fēn)作用(yòng)的(de)引入, 将有助于減小超調量, 克服振蕩, 使系統趨于穩定, 特别對(duì)髙階系統非常有利, 它加快(kuài)了(le)系統的(de)跟蹤速度。但微分(fēn)的(de)作用(yòng)對(duì)輸入信号的(de)噪聲很敏感,對(duì)那些噪聲較大(dà)的(de)系統一般不用(yòng)微分(fēn), 或在微分(fēn)起作用(yòng)之前先對(duì)輸入信号進行濾波。



PID算(suàn)法代碼

 PID 控制算(suàn)法可(kě)以分(fēn)爲位置式 PID 和(hé)增量式 PID 控制算(suàn)法。


兩者的(de)區(qū)别

(1)位置式PID控制的(de)輸出與整個(gè)過去的(de)狀态有關,用(yòng)到了(le)誤差的(de)累加值;而增量式PID的(de)輸出隻與當前拍(pāi)和(hé)前兩拍(pāi)的(de)誤差有關,因此位置式PID控制的(de)累積誤差相對(duì)更大(dà);


(2)增量式PID控制輸出的(de)是控制量增量,并無積分(fēn)作用(yòng),因此該方法适用(yòng)于執行機構帶積分(fēn)部件的(de)對(duì)象,如步進電機等,而位置式PID适用(yòng)于執行機構不帶積分(fēn)部件的(de)對(duì)象,如電液伺服閥。


(3)由于增量式PID輸出的(de)是控制量增量,如果計算(suàn)機出現故障,誤動作影(yǐng)響較小,而執行機構本身有記憶功能,可(kě)仍保持原位,不會嚴重影(yǐng)響系統的(de)工作,而位置式的(de)輸出直接對(duì)應對(duì)象的(de)輸出,因此對(duì)系統影(yǐng)響較大(dà)。



下(xià)面給出公式直接體現的(de)C語言源代碼(請結合項目修改源代碼):

1.位置式PID

image.png

typedef struct
{
 float Kp;                       //比例系數Proportional  float Ki;                       //積分(fēn)系數Integral  float Kd;                       //微分(fēn)系數Derivative  float Ek;                       //當前誤差  float Ek1;                      //前一次誤差 e(k-1)  float Ek2;                      //再前一次誤差 e(k-2)  float LocSum;                   //累計積分(fēn)位置
}PID_LocTypeDef;

/************************************************ 函數名稱 : PID_Loc 功    能 : PID位置(Location)計算(suàn) 參    數 : SetValue ------ 設置值(期望值)            ActualValue --- 實際值(反饋值)            PID ----------- PID數據結構 返 回 值 : PIDLoc -------- PID位置 作    者 : strongerHuang *************************************************/
float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID) {
 float PIDLoc;                                  //位置  PID->Ek = SetValue - ActualValue;  PID->LocSum += PID->Ek;                         //累計誤差  PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);  PID->Ek1 = PID->Ek;  return PIDLoc; }


2.增量式PID

image.png


typedef struct
{
 float Kp;                       //比例系數Proportional  float Ki;                       //積分(fēn)系數Integral  float Kd;                       //微分(fēn)系數Derivative  float Ek;                       //當前誤差  float Ek1;                      //前一次誤差 e(k-1)  float Ek2;                      //再前一次誤差 e(k-2)
}PID_IncTypeDef;

/************************************************ 函數名稱 : PID_Inc 功    能 : PID增量(Increment)計算(suàn) 參    數 : SetValue ------ 設置值(期望值)            ActualValue --- 實際值(反饋值)            PID ----------- PID數據結構 返 回 值 : PIDInc -------- 本次PID增量(+/-) 作    者 : strongerHuang *************************************************/
float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID) {
 float PIDInc;                                  //增量  PID->Ek = SetValue - ActualValue;  PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);  PID->Ek2 = PID->Ek1;  PID->Ek1 = PID->Ek;  return PIDInc; }