從微積分的基本原理看,積分的實現是在無限細分的情況下進行的矩形加和計算。但是在離散狀態下,時間間隔已經足夠大,矩形積分在某些時候顯得精度要低了一些,於是梯形積分被提出來以提升積分精度。
1、梯形積分基本思路
在PID控制其中,積分項的作用是消除余差,為了盡量減小余差,應提高積分項的運算精度。在積分項中,默認是按矩形方式來計算積分,將矩形積分改為梯形積分可以提高運算精度。其計算公式為:
於是如果在位置型PID算法中引入梯形積分則可以修改計算公式如下:
同樣要在增量型PID算法中引入梯形積分則可以修改計算公式如下:
2、算法實現
從微積分的角度來說,當微分分到無限小時,矩形積分與梯形積分是沒有區別的。但事實上我們的采樣時間不可能無限小,而且也不可能是連續的,那么采樣周期越大,那么矩形近似於實際曲線間的偏差就越大,而梯形積分則可以更加接近實際曲線,所以采用梯形積分代替矩形積分就可以得到更高的精度。
(1)位置型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 result; //輸出值 18 19 float integral;//積分值 20 21 }PID;
接下來實現PID控制器:
1 void PIDRegulation(PID *vPID, float processValue) 2 3 { 4 5 float thisError; 6 7 8 9 thisError=vPID->setpoint-processValue; 10 11 vPID->integral+=(thisError+ vPID-> lasterror)/2; 12 13 vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror); 14 15 vPID->lasterror=thisError; 16 17 }
從上述實現我們不難看出,變化僅僅只是在做積分累計vPID->integral時,將累計量按梯形方式累計。
(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 deadband; //死區 20 21 float result; //輸出值 22 23 }PID;
接下來實現PID控制器:
1 void PIDRegulation(PID *vPID, float processValue) 2 3 { 4 5 float thisError; 6 7 float increment; 8 9 float pError,dError,iError; 10 11 12 13 thisError=vPID->setpoint-processValue; //得到偏差值 14 15 pError=thisError-vPID->lasterror; 16 17 iError=(thisError+ vPID-> lasterror)/2; 18 19 dError=thisError-2*(vPID->lasterror)+vPID->preerror; 20 21 increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError; //增量計算 22 23 24 25 vPID->preerror=vPID->lasterror; //存放偏差用於下次運算 26 27 vPID->lasterror=thisError; 28 29 vPID->result+=increment; 30 31 }
3、總結
積分項的引入目的就是為了消除系統的余差,那么積分項的計算精度越高,對消除系統的余差就越有利。梯形積分相較於矩形積分其精度有比較大的提高,所以對消除余差也就越有效。
歡迎關注: