PID控制器改进笔记之三:改进PID控制器之正反作用
前面我們發(fā)布了一系列PID控制器相關(guān)的文章,包括經(jīng)典PID控制器以及參數(shù)自適應(yīng)的PID控制器。這一系列PID控制器雖說實現(xiàn)了主要功能,也在實際使用中取得了良好效果,但還有很多的細(xì)節(jié)部分可以改進(jìn)以提高性能和靈活性。所以在這篇中我們來討論改進(jìn)PID控制器以實現(xiàn)正反作用轉(zhuǎn)換。
1、提出問題
到目前為止我們討論的情況都是在增大輸出而控制變量也隨之增加的情況,而實際的情況并非完全如此。有些系統(tǒng)當(dāng)我們增加輸出時,控制變量會隨之減小,這就是我們在此要討論的問題。在前面的PID控制器開發(fā)中我們并未考慮這一問題,為了增強PID控制器使用的適應(yīng)性和方便性,我們需要添加上控制PID輸出方向的功能,這就是所說的正反作用控制。
事實上,PID控制器分為正作用和反作用兩種,這本身并沒有什么本質(zhì)上的區(qū)別。但需要使用者自己清楚,是希望輸出增加時輸入也增加還是輸出增加時輸入減小,并以此來確定控制器的正反作用。
2、分析設(shè)計
我們要添加上正反作用的功能該如何實現(xiàn)呢?首先我們需要明白,所謂正作用實際就是輸出增加輸入值也隨之增加的控制方式;而反作用就是輸出增加輸入值隨之減小的控制方式。一個系統(tǒng)選擇什么樣的作用方式是由系統(tǒng)本身的特性決定的,這包括被控對象的屬性,執(zhí)行機構(gòu)的操作特性等。換句話說我們沒辦法要通過對輸入的處理實現(xiàn)作用方式,但可以從輸出的角度來實現(xiàn)我們的要求。
首先,我們需要為PID對象添加一個描述正反作用的屬性。這個屬性的取值決定了控制器對象采用何種作用方式。
/*定義正反作用枚舉類型*/ typedef enum ClassicPIDDR {DIRECT,?????? //正作用REVERSE?????? //反作用 }ClassicPIDDRType;/*定義PID對象類型*/ typedef struct CLASSIC {float *pPV;?????????????????? //測量值指針float *pSV;?????????????????? //設(shè)定值指針float *pMV;?????????????????? //輸出值指針float *pKp;?????????????????? //比例系數(shù)指針float *pKi;?????????????????? //積分系數(shù)指針float *pKd;?????????????????? //微分系數(shù)指針uint16_t *pMA;??????????????? //手自動操作指針float setpoint;?????????????? //設(shè)定值float lasterror;????????????? //前一拍偏差float preerror;?????????????? //前兩拍偏差float deadband;?????????????? //死區(qū)float result;???????????????? //PID控制器計算結(jié)果float output;???????????????? //輸出值0-100%float maximum;??????????????? //輸出值上限float minimum;??????????????? //輸出值下限float errorabsmax;??????????? //偏差絕對值最大值float errorabsmin;??????????? //偏差絕對值最小值float alpha;????????????????? //不完全微分系數(shù)float deltadiff;????????????? //微分增量float integralValue;????????? //積分累計量float gama;?????????????????? //微分先行濾波系數(shù)float lastPv;???????????????? //上一拍的過程測量值float lastDeltaPv;??????????? //上一拍的過程測量值增量ClassicPIDDRType direct;????? //正反作用 }CLASSICPID;其次,我們要在初始化對象時,對這一屬性進(jìn)行初始化。至于初始化的值,就需要根據(jù)實際使用需求選擇枚舉。
最后還需要在PID控制器中實現(xiàn)這部分的操作。實現(xiàn)這一操作的方式有兩種。一種方法是將PID的三個參數(shù)取反變?yōu)樨?fù)值,這樣就可以實現(xiàn)反作用。第二種方法是我們正常使用PID的三個參數(shù)計算而將增量部分取反,這樣也可實現(xiàn)反作用。顯然第一種方法便于理解,而第二種方法更便于操作,這里我們使用第二種方法來實現(xiàn)。
3、軟件實現(xiàn)
我們已經(jīng)設(shè)計好使用參數(shù)正常計算增量,在正作用時將增量取加,而在反作用時將增量取為減,這樣就實現(xiàn)了正反作用的轉(zhuǎn)換。這里所說的“加”與“減”是純粹的數(shù)學(xué)運算,不用考慮增量本身的符號是正是負(fù)。正反作用與手自動轉(zhuǎn)換的性質(zhì)不同,并不需要在線修改,在系統(tǒng)確定后就已經(jīng)確定,所以我們需要在初始化中設(shè)定它。而在PID控制器中我們根據(jù)正反作用這一屬性的取值來決定對增量部分是做“加”運算還是“減”運算。據(jù)此,我們修改PID控制器為:
/* 通用PID控制器,采用增量型算法,具有變積分,梯形積分和抗積分飽和功能,微分項采用不完全微分,一階濾波,alpha值越大濾波作用越強*/ void PIDRegulator(CLASSICPID *vPID) {float thisError;float result;float factor;float increment;float pError,dError,iError;if(*vPID->pMA<1)????? //手動模式{vPID->output=*vPID->pMV;//設(shè)置無擾動切換vPID->result=(vPID->maximum-vPID->minimum)*vPID->output/100.0+-vPID->minimum;*vPID->pSV=*vPID->pPV;vPID->setpoint=*vPID->pSV;}else????????????????? //自動模式{vPID->setpoint=*vPID->pSV;thisError=vPID->setpoint-(*vPID->pPV); //得到偏差值result=vPID->result;if (fabs(thisError)>vPID->deadband){pError=thisError-vPID->lasterror;iError=(thisError+vPID->lasterror)/2.0;dError=thisError-2*(vPID->lasterror)+vPID->preerror;//變積分系數(shù)獲取factor=VariableIntegralCoefficient(thisError,vPID->errorabsmax,vPID->errorabsmin);//計算微分項增量帶不完全微分vPID->deltadiff=(*vPID->pKd)*(1-vPID->alpha)*dError+vPID->alpha*vPID->deltadiff;increment=(*vPID->pKp)*pError+(*vPID->pKi)*factor*iError+vPID->deltadiff;?? //增量計算}else{if((fabs(vPID->setpoint-vPID->minimum)<vPID->deadband)&&(fabs((*vPID->pPV)-vPID->minimum)<vPID->deadband)){result=vPID->minimum;}increment=0.0;}//正反作用設(shè)定if(vPID->direct==DIRECT){result=result+increment;}else{result=result-increment;}/*對輸出限值,避免超調(diào)和積分飽和問題*/if(result>=vPID->maximum){result=vPID->maximum;}if(result<=vPID->minimum){result=vPID->minimum;}?vPID->preerror=vPID->lasterror;? //存放偏差用于下次運算vPID->lasterror=thisError;vPID->result=result;vPID->output=(vPID->result-vPID->minimum)/(vPID->maximum-vPID->minimum)*100.0;*vPID->pMV=vPID->output;} }4、總結(jié)
我們在PID控制器中增加了正反作用的處理,經(jīng)驗證與我們預(yù)期的結(jié)果是一致的。其實正反作用并不復(fù)雜,就是要在我們期望輸入增加時,如何控制輸出的方向。如果輸入輸出的變化趨勢一致,我們就需要采用正作用;如果輸入輸出的變化趨勢相反,則我們就需要選擇反作用。
關(guān)于如何確定一個控制器的正反作用,這里我們不妨舉一個例子。我們設(shè)想我們需要控制一個水槽的液位,怎么樣確定這個控制器的正反作用呢?我們說過,確定控制器的正反作用需要考慮被控對象的特性和執(zhí)行機構(gòu)的特性。對于這個例子,被控對象我們要考慮是入水口可控還是出水口可控,執(zhí)行機構(gòu)是常閉還是常開,所以有四種情況:
所謂常閉型和常開型是指在沒有信號輸入的時候,執(zhí)行機構(gòu)所處的狀態(tài)。所以常開型給的信號越大開度越小,常閉型給的信號越大開度越大。當(dāng)然,這只是一個簡單的例子,實際使用中會更復(fù)雜,但都可從被控對象和執(zhí)行機構(gòu)的特性入手來選取控制器的正反作用。
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的PID控制器改进笔记之三:改进PID控制器之正反作用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逆向调试完成端口回包实践总结
- 下一篇: openssl c++实现bouncyc