1. 程式人生 > >PID控制器開發筆記之六:不完全微分PID控制器的實現

PID控制器開發筆記之六:不完全微分PID控制器的實現

沒有 pan IV bsp 算法 濾波器 process 位置 之間

  從PID控制的基本原理我們知道,微分信號的引入可改善系統的動態特性,但也存在一個問題,那就是容易引進高頻幹擾,在偏差擾動突變時尤其顯出微分項的不足。為了解決這個問題人們引入低通濾波方式來解決這一問題。

1、不完全微分的基本思想

  微分項有引入高頻幹擾的風險,但若在控制算法中加入低通濾波器,則可使系統性能得到改善。方法之一就是在PID算法中加入一個一階低通濾波器。這就是所謂的不完全微分,其結構圖如下:

技術分享圖片

或者是另一種形式:

技術分享圖片

在這裏我們考慮第一種結構形式。在這種情況下,微分與一階慣性環節結合,其微分部分的計算公式可表示如下:

技術分享圖片

其中α的取值在0和1之間,有濾波常數和采樣周期確定。據此我們將其增量化,則可以得到為不完全微分的增量計算公式:

技術分享圖片

或者表示為:

技術分享圖片

這兩種表示方式是等價的,第二種表示法與我們的完全微分PID算法增量型式表示更接近,好理解。而且與位置型的表示法也更為一致,所以我們選擇第二種表示法。

2、算法實現

經過前面的分析及公式推導,我們想要實現不完全微分其實已經相當容易了。為了便於理解,我們保持比例和積分為基本的格式,只對微分部分采用不完全微分算法。

1)位置型PID算法實現

位置型PID實現過程與前面的一樣,所不同的是需要增加前一個Ud值。首先定義PID對象的結構體:

 1 /*定義結構體和公用體*/
 2 
 3 typedef struct
 4 
 5 {
 6 
 7   float setpoint;       //
設定值 8 9 float proportiongain; //比例系數 10 11 float integralgain; //積分系數 12 13 float derivativegain; //微分系數 14 15 float lasterror; //前一拍偏差 16 17 float lastdev; //前一拍時的微分項值 18 19 float alpha; //不完全微分系數 20 21 float result; //輸出值 22 23 float integral;//積分值 24 25 }PID;

  接下來實現PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)
 2 
 3 {
 4 
 5   float thisError;
 6 
 7   float thisDev;
 8 
 9   thisError=vPID->setpoint-processValue;
10 
11   vPID->integral+=thisError;
12 
13   thisDev= vPID->derivativegain*(1- vPID-> alpha)*(thisError-vPID->lasterror)+ vPID-> alpha* vPID-> lastdev;
14 
15  
16 
17   vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+ thisDev;
18 
19   vPID->lasterror=thisError;
20 
21   vPID->lastdev = thisDev;
22 
23 }

  這就實現了一個最簡單不完全微分的位置型PID控制器,當然沒有考慮任何幹擾條件,僅僅只是對數學公式的計算機語言化。

2)增量型PID算法實現

  增量型不完全微分PID控制器的實現就是以前面的增量型公式為基礎。首先定義PID對象的結構體:

 1 /*定義結構體和公用體*/
 2 
 3 typedef struct
 4 
 5 {
 6 
 7   float setpoint;       //設定值
 8 
 9   float proportiongain;     //比例系數
10 
11   float integralgain;      //積分系數
12 
13   float derivativegain;    //微分系數
14 
15   float lasterror;     //前一拍偏差
16 
17   float preerror;     //前兩拍偏差
18 
19   float lastdeltadev;      //前一拍時的微分項增量
20 
21   float alpha;       //不完全微分系數
22 
23   float deadband;     //死區
24 
25   float result; //輸出值
26 
27 }PID;

  接下來實現PID控制器:

 1 void PIDRegulation(PID *vPID, float processValue)
 2 
 3 {
 4 
 5   float thisError;
 6 
 7   float increment;
 8 
 9   float deltaDev;
10 
11   float pError,dError,iError;
12 
13  
14 
15   thisError=vPID->setpoint-processValue; //得到偏差值
16 
17   pError=thisError-vPID->lasterror;
18 
19   iError=thisError;
20 
21   dError=thisError-2*(vPID->lasterror)+vPID->preerror;
22 
23  
24 
25   deltaDev= vPID->derivativegain*(1- vPID-> alpha)*dError+ vPID-> alpha* vPID-> lastdeltadev;
26 
27   increment=vPID->proportiongain*pError+vPID->integralgain*iError+ deltaDev;   //增量計算
28 
29  
30 
31   vPID->preerror=vPID->lasterror;  //存放偏差用於下次運算
32 
33   vPID->lasterror=thisError;
34 
35   vPID-> lastdeltadev = deltaDev;
36 
37   vPID->result+=increment;
38 
39 }

  這就實現了一個最簡單的增量型不完全微分PID控制器,也沒有考慮任何的幹擾條件,僅僅只是對數學公式的計算機語言化。

3、總結

  不完全微分方式在微分環節采用了低通濾波有效地提高了微分項的特性。其中α的取值是一個0~1之間的數。兩個極限值,在0時其實就是沒有濾波的普通微分環節;而取1時,則沒有微分作用。所以α的取值對不完全微分的效果是至關重要的,一般要根據被控對象的特性來確定。

歡迎關註:

技術分享圖片

PID控制器開發筆記之六:不完全微分PID控制器的實現