PID控制器开发笔记之五:变积分PID控制器的实现
????????在普通的PID控制算法中,由于積分系數(shù)Ki是常數(shù),所以在整個(gè)控制過(guò)程中,積分增量是不變的。然而,系統(tǒng)對(duì)于積分項(xiàng)的要求是,系統(tǒng)偏差大時(shí),積分作用應(yīng)該減弱甚至是全無(wú),而在偏差小時(shí),則應(yīng)該加強(qiáng)。積分系數(shù)取大了會(huì)產(chǎn)生超調(diào),甚至積分飽和,取小了又不能短時(shí)間內(nèi)消除靜差。因此,如何根據(jù)系統(tǒng)的偏差大小改變積分速度,對(duì)提高系統(tǒng)的品質(zhì)是有必要的。變積分PID算法正好可以滿足這一要求。
1、變積分的基本思想
????????變積分PID的基本思想是設(shè)法改變積分項(xiàng)的累加速度,使其與偏差大小相對(duì)應(yīng):偏差越大,積分越慢; 偏差越小,積分越快。設(shè)定系數(shù)為f(err(k)),它是err(k)的函數(shù)。當(dāng)|err(k)|增大時(shí),f減小,反之增大。變積分的PID積分項(xiàng)表達(dá)式為:
????????其中f(err(k))與|err(k)|的函數(shù)關(guān)系可根據(jù)具體情況設(shè)定,可以是線性的也可以是非線性的,通常比較簡(jiǎn)單的設(shè)置如下:
????????由以上公式可知,f(err(k))的值在[0,1]區(qū)間變化,當(dāng)偏差值|err(k)|大于分離區(qū)間A+B時(shí),不對(duì)當(dāng)前偏差err(k)進(jìn)行累加;當(dāng)偏差值|err(k)|小于B時(shí),加入當(dāng)前偏差err(k)進(jìn)行累加;介于B和A+B的區(qū)間時(shí),按一定函數(shù)關(guān)系隨err(k)變化。于是變積分PID算法可以表示為:
????????上述的f(err(k))函數(shù)只是我們列舉的一種,事實(shí)上可以采取任何可行的方式,甚至是非線性函數(shù),只要更符合控制對(duì)象的特性。
????????對(duì)于用增量型PID算法的變積分表示如下:
????????看到這個(gè)公式,很多人可能會(huì)發(fā)覺(jué)與前面的積分分離算法的公式很象。特別是在增量型算法中,它們的形式確實(shí)是一樣的,但表達(dá)的意思確是有一定區(qū)別,那么我們來(lái)看看有什么不同呢?在后面我們?cè)僮骺偨Y(jié)。
2、算法實(shí)現(xiàn)
????????變積分實(shí)際上是通過(guò)對(duì)偏差的判斷,讓積分以不同的速度累計(jì)。這一系數(shù)介于0-1之間,可以通過(guò)多種方式實(shí)現(xiàn),在這里我們按線性方式實(shí)現(xiàn)。變積分的控制流程圖如下:
????????首先實(shí)現(xiàn)一個(gè)處理f(e(k))的函數(shù),有前面的函數(shù)關(guān)系表達(dá)式,實(shí)現(xiàn)為響應(yīng)的編碼就很簡(jiǎn)單了:????
/* 變積分系數(shù)處理函數(shù),實(shí)現(xiàn)一個(gè)輸出0和1之間的分段線性函數(shù)???????????*/ /* 當(dāng)偏差的絕對(duì)值小于最小值時(shí),輸出為1;當(dāng)偏差的絕對(duì)值大于最大值時(shí),輸出為0?? */ /* 當(dāng)偏差的絕對(duì)值介于最大值和最小值之間時(shí),輸出在0和1之間現(xiàn)行變化??? */ /* float error,當(dāng)前輸入的偏差值???????????????????????????????????????? */ /* float absmax,偏差絕對(duì)值的最大值????????????????????????????????????? */ /* float absmin,偏差絕對(duì)值的最小值????????????????????????????????????? */ static float VariableIntegralCoefficient(floaterror,float absmax,float absmin) {floatfactor=0.0;if(abs(error)<=absmin){factor=1.0;}elseif(abs(error)>absmax){factor=0.0;}else{factor=(absmax-abs(error))/(absmax-absmin);}returnfactor; }2.1、位置型PID算法實(shí)現(xiàn)
變積分基于位置型PID的實(shí)現(xiàn)就是更具偏差絕對(duì)值的大小獲取變積分的系數(shù)。然后再實(shí)現(xiàn)PID算法,同樣首先定義PID對(duì)象的結(jié)構(gòu)體:
/*定義結(jié)構(gòu)體和公用體*/ typedef struct {float setpoint;?????? //設(shè)定值float proportiongain;???? //比例系數(shù)float integralgain;????? //積分系數(shù)float derivativegain;??? //微分系數(shù)float lasterror;???? //前一拍偏差float result; //輸出值float integral;//積分值float errorabsmax;? //偏差絕對(duì)值最大值float errorabsmin;? //偏差絕對(duì)值最小值 }PID;接下來(lái)實(shí)現(xiàn)PID控制器:
void PIDRegulation(PID *vPID, float processValue) {float thisError;float factor;thisError=vPID->setpoint-processValue;factor=VariableIntegralCoefficient(thisError, vPID->errorabsmax,vPID->errorabsmin);vPID->integral+= factor*thisError;vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);vPID->lasterror=thisError; }2.2、增量型PID算法實(shí)現(xiàn)
同樣變積分基于增量型PID的實(shí)現(xiàn)也是一樣的。首先定義PID對(duì)象的結(jié)構(gòu)體:
/*定義結(jié)構(gòu)體和公用體*/ typedef struct {float setpoint;?????? //設(shè)定值float proportiongain;???? //比例系數(shù)float integralgain;????? //積分系數(shù)float derivativegain;??? //微分系數(shù)float lasterror;???? //前一拍偏差float preerror;???? //前兩拍偏差float deadband;???? //死區(qū)float result; //輸出值float errorabsmax;? //偏差絕對(duì)值最大值float errorabsmin;? //偏差絕對(duì)值最小值 }PID;接下來(lái)實(shí)現(xiàn)PID控制器:
void PIDRegulation(PID *vPID, float processValue) {floatthisError;floatincrement;floatpError,dError,iError;floatfactor;thisError=vPID->setpoint-processValue; //得到偏差值factor=VariableIntegralCoefficient(thisError, vPID->errorabsmax,vPID->errorabsmin);pError=thisError-vPID->lasterror;iError=factor*thisError;dError=thisError-2*(vPID->lasterror)+vPID->preerror;increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError;?? //增量計(jì)算vPID->preerror=vPID->lasterror;?//存放偏差用于下次運(yùn)算vPID->lasterror=thisError;vPID->result+=increment; }3、總結(jié)
????????變積分實(shí)際上有一定的專(zhuān)家經(jīng)驗(yàn)在里面,因?yàn)橄拗档倪x取以及采用什么樣的函數(shù)計(jì)算系數(shù),有很大的靈活性。
????????我們?cè)谇懊孀隽朔e分分離的算法,這次又說(shuō)了變積分的算法。他們有相通的地方,也有不同的地方,下面對(duì)他們進(jìn)行一些說(shuō)明。
????????首先這兩種算法的設(shè)計(jì)思想是有區(qū)別的。積分分離的思想是偏差較大時(shí),取消積分;而偏差較小時(shí)引入積分。變積分的實(shí)現(xiàn)是想是設(shè)法改變積分項(xiàng)的累加速度,偏差大時(shí)減弱積分;而偏差小時(shí)強(qiáng)化積分。有些所謂改進(jìn)型的積分分離算法實(shí)際已經(jīng)脫離了積分分離的基本思想,而是動(dòng)態(tài)改變積分系數(shù)。就這一點(diǎn)而言,特別是在增量型算法中,已經(jīng)屬于變積分的思想了。
????????其次,對(duì)于積分分離來(lái)說(shuō),該操作是針對(duì)整個(gè)積分項(xiàng)操作,這一點(diǎn)在位置型PID算法中,表現(xiàn)的尤為明顯。而對(duì)于變積分來(lái)說(shuō),是針對(duì)當(dāng)前偏差的積分累計(jì),就是說(shuō)只影響當(dāng)前這次的積分部分。再者,具體的實(shí)現(xiàn)方式也存在區(qū)別,特別是在位置型PID方式下尤為明顯。
????????我們?cè)谶@里討論它們的區(qū)別原因,佷顯然就是我們沒(méi)辦法同時(shí)采用這兩種優(yōu)化方式,只能分別實(shí)現(xiàn),在后面我們將實(shí)現(xiàn)基于積分項(xiàng)的優(yōu)化。
?歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的PID控制器开发笔记之五:变积分PID控制器的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: STM32F0使用LL库实现PWM输出
- 下一篇: 阿里云服务器安装JDK指南