PID控制器开发笔记之三:抗积分饱和PID控制器的实现
積分作用的引入是為了消除系統(tǒng)的靜差,提高控制精度。但是如果一個系統(tǒng)總是存在統(tǒng)一個方向的偏差,就可能無限累加而進而飽和,極大影響系統(tǒng)性能。抗積分飽和就是用以解決這一問題的方法之一。這一節(jié)我們就來實現(xiàn)抗積分飽和的PID算法。
1、抗積分飽和的基本思想
所謂積分飽和就是指系統(tǒng)存在一個方向的偏差,PID控制器的輸出由于積分作用的不斷累加而擴大,從而導(dǎo)致控制器輸出不斷增大超出正常范圍進入飽和區(qū)。當(dāng)系統(tǒng)出現(xiàn)反響的偏差時,需要首先從飽和區(qū)退出,而不能對反向的偏差進行快速的響應(yīng)。
為了解決積分飽和的問題,人們引入了抗積分飽和的PID算法。所謂抗積分飽和算法,其思路是在計算U(k)的時候,先判斷上一時刻的控制量U(k-1)是否已經(jīng)超出了限制范圍。若U(k-1)>Umax,則只累加負(fù)偏差;若U(k-1)<Umin,則只累加正偏差。從而避免控制量長時間停留在飽和區(qū)。
2、算法實現(xiàn)
抗積分飽和的思想很簡單,解釋在控制器輸出的最大最小值附近限制積分的累積情況,以防止在恢復(fù)時沒有響應(yīng)。根據(jù)前面得分系我們可以得到如下的流程圖:
2.1、位置型PID算法實現(xiàn)
對于位置型PID的抗積分飽和算法其實就是在基本的PID基礎(chǔ)上加上抗積分飽和的操作,增加量個機鋒的極限值。首先定義PID對象的結(jié)構(gòu)體:
/*定義結(jié)構(gòu)體和公用體*/ typedef struct {floatsetpoint;?????? //設(shè)定值floatproportiongain;???? //比例系數(shù)floatintegralgain;????? //積分系數(shù)floatderivativegain;??? //微分系數(shù)floatlasterror;???? //前一拍偏差floatresult; //輸出值floatintegral;//積分值floatmaximum;//最大值floatminimum;//最小值 }PID;接下來實現(xiàn)PID控制器:
void PIDRegulation(PID *vPID, float processValue) {floatthisError;thisError=vPID->setpoint-processValue;if(vPID->result>vPID->maximum){if(thisError<=0){vPID->integral+=thisError;}}elseif(vPID->result<vPID->minimum){if(thisError>=0){vPID->integral+=thisError;}}else{vPID->integral+=thisError;}vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);vPID->lasterror=thisError; }2.2、增量型PID算法實現(xiàn)
增量型PID的抗積分飽和的實現(xiàn)也是一樣在最基本的增量型PID算法中引入極大極小的限值,并在算法中通過比較限值實現(xiàn)抗飽和的操作。
首先定義PID對象的結(jié)構(gòu)體:
/*定義結(jié)構(gòu)體和公用體*/ typedef struct {floatsetpoint;?????? //設(shè)定值floatproportiongain;???? //比例系數(shù)floatintegralgain;????? //積分系數(shù)floatderivativegain;??? //微分系數(shù)floatlasterror; ????//前一拍偏差floatpreerror;???? //前兩拍偏差floatdeadband;???? //死區(qū)floatresult; //輸出值floatmaximum;//最大值floatminimum;//最小值 }PID;接下來實現(xiàn)PID控制器:
void PIDRegulation(PID *vPID, float processValue) {floatthisError;floatincrement;floatpError,dError,iError;thisError=vPID->setpoint-processValue; //得到偏差值pError=thisError-vPID->lasterror;iError=0;dError=thisError-2*(vPID->lasterror)+vPID->preerror;if(vPID->result>vPID->maximum){if(thisError<=0){iError=thisError;}}elseif(vPID->result<vPID->minimum){if(thisError>=0){iError=thisError;}}else{iError=thisError;}increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;?? //增量計算vPID->preerror=vPID->lasterror;?//存放偏差用于下次運算vPID->lasterror=thisError;vPID->result+=increment; }3、總結(jié)
所謂抗積分飽和就是防止由于長期存在一個方向的偏差而對相反方向的偏差遲滯響應(yīng)。本文的方法是在達到極值后將不再對這一方向的偏差做出反應(yīng)相反只對另一方向的偏差做出反應(yīng)。事實上由于偏差的存在有可能造成輸出值超限的情況,所以還需要對輸出值作出限制。
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的PID控制器开发笔记之三:抗积分饱和PID控制器的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨模块中的分配内存问题
- 下一篇: c语言位运算八进制转二进制,C语言十进制