我們已經(jīng)講述了PID控制器的實(shí)現(xiàn),包括位置型PID控制器和增量型PID控制器。但這個(gè)實(shí)現(xiàn)只是最基本的實(shí)現(xiàn),并沒有考慮任何的干擾情況。在本節(jié)及后續(xù)的一些章節(jié),我們就來討論一下經(jīng)典PID控制器的優(yōu)化與改進(jìn)。這一節(jié)我們首先來討論針對(duì)積分項(xiàng)的積分分離優(yōu)化算法。
1、基本思想
我們已經(jīng)講述了PID控制引入積分主要是為了消除靜差,提高控制精度。但在過程的啟動(dòng)、結(jié)束或大幅度增減設(shè)定值時(shí),短時(shí)間內(nèi)系統(tǒng)輸出有很大偏差,會(huì)造成PID運(yùn)算的積分累積,引起超調(diào)或者振蕩。為了解決這一干擾,人們引入了積分分離的思想。其思路是偏差值較大時(shí),取消積分作用,以免于超調(diào)量增大;而偏差值較小時(shí),引入積分作用,以便消除靜差,提高控制精度。
具體的實(shí)現(xiàn)步驟是:根據(jù)實(shí)際情況,設(shè)定一個(gè)閾值;當(dāng)偏差大于閾值時(shí),消除積分僅用PD控制;當(dāng)偏差小于等于閾值時(shí),引入積分采用PID控制。則控制算法可表示為:

其中β稱為積分開關(guān)系數(shù),其取值范圍為:

由上述表述及公式我們可以知道,積分分離算法的效果其實(shí)與ε值的選取有莫大關(guān)系,所以ε值的選取實(shí)際上是實(shí)現(xiàn)的難點(diǎn),ε值過大則達(dá)不到積分分離的效果,而ε值過小則難以進(jìn)入積分區(qū),ε值的選取存在很大的主觀因素。
對(duì)于經(jīng)典的增量式PID算法,似乎沒有辦法由以上的公式推導(dǎo)而來,因?yàn)棣码S著err(k)的變化在不是修改著控制器的表達(dá)式。其實(shí)我們可以換一種角度考慮,每次系統(tǒng)調(diào)節(jié)未定后,偏差應(yīng)該為零,然后只有當(dāng)設(shè)定值改變時(shí),系統(tǒng)才會(huì)響應(yīng)而開始調(diào)節(jié)。設(shè)定值的改變實(shí)際上是一個(gè)階躍變化,此時(shí)的控制輸出記為U0,開始調(diào)節(jié)時(shí),其調(diào)節(jié)增量其實(shí)與之前的一切沒有關(guān)系。所以我們就可以以變化時(shí)刻開始為起點(diǎn),而得到帶積分分離的增量算法,以保證在啟動(dòng)、停止和快速變化時(shí)防止超調(diào)。公式如下:

其中β的取值與位置型PID算法一致??赡苡腥藭?huì)擔(dān)心偏差來回變化,造成積分作用的頻繁分離和引入,進(jìn)而使上述的增量表達(dá)式無法實(shí)現(xiàn)。其實(shí)我們分析一下就能發(fā)現(xiàn),在開始時(shí),由于設(shè)定值變化引起的偏差大而分離了積分作用,在接近設(shè)定值時(shí),偏差變小就引入了積分,一邊消除靜差,而后處于穩(wěn)態(tài),直到下一次變化。
2、算法實(shí)現(xiàn)
這一部分,我們根據(jù)前面對(duì)其基本思想的描述,來實(shí)現(xiàn)基于積分分離的PID算法實(shí)現(xiàn),同樣是包括位置型和增量型兩種實(shí)現(xiàn)方式。首先我們來看一下算法的實(shí)現(xiàn)過程,具體的流程圖如下:

有上圖我們知道,與普通的PID算法的區(qū)別,只是判斷偏差的大小,偏差大時(shí),為PD算法,偏差小時(shí)為PID算法。于是我們需要一個(gè)偏差檢測(cè)與積分項(xiàng)分離系數(shù)β的函數(shù)。
1 static uint16_t BetaGeneration(float error,float epsilon) 2 3 { 4 5 uint16_t beta=0; 6 7 if(abs(error)<= epsilon) 8 9 { 10 11 beta=1; 12 13 } 14 15 return beta; 16 17 }
(1)位置型PID算法實(shí)現(xiàn)
根據(jù)前面的分析我們可以很輕松的編寫程序,只需要在編寫程序時(shí)判斷偏差以確定是否引入積分項(xiàng)就可以了。同樣先定義PID對(duì)象的結(jié)構(gòu)體:
1 /*定義結(jié)構(gòu)體和公用體*/
2
3 typedef struct
4
5 {
6
7 float setpoint; //設(shè)定值
8
9 float proportiongain; //比例系數(shù)
10
11 float integralgain; //積分系數(shù)
12
13 float derivativegain; //微分系數(shù)
14
15 float lasterror; //前一拍偏差
16
17 float result; //輸出值
18
19 float integral;//積分值
20
21 float epsilon; //偏差檢測(cè)閾值
22
23 }PID;
接下來實(shí)現(xiàn)PID控制器:
1 void PIDRegulation(PID *vPID, float processValue)
2
3 {
4
5 float thisError;
6
7 thisError=vPID->setpoint-processValue;
8
9 vPID->integral+=thisError;
10
11 uint16_t beta= BetaGeneration(error, vPID->epsilon);
12
13 if(beta>0)
14
15 {
16
17 vPID->result=vPID->proportiongain*thisError+vPID->derivativegain*(thisError-vPID->lasterror);
18
19 }
20
21 else
22
23 {
24
25 vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+vPID->derivativegain*(thisError-vPID->lasterror);
26
27 }
28
29
30
31 vPID->lasterror=thisError;
32
33 }
與普通的PID算法的區(qū)別就是上述代碼中增加了偏差判斷,來決定積分項(xiàng)的分離與否。
(2)增量型PID算法實(shí)現(xiàn)
對(duì)于增量型PID控制,我們也可以采取相同的處理。首先定義PID對(duì)象的結(jié)構(gòu)體:
1 /*定義結(jié)構(gòu)體和公用體*/
2
3 typedef struct
4
5 {
6
7 float setpoint; //設(shè)定值
8
9 float proportiongain; //比例系數(shù)
10
11 float integralgain; //積分系數(shù)
12
13 float derivativegain; //微分系數(shù)
14
15 float lasterror; //前一拍偏差
16
17 float preerror; //前兩拍偏差
18
19 float deadband; //死區(qū)
20
21 float result; //輸出值
22
23 float epsilon; //偏差檢測(cè)閾值
24
25 }PID;
接下來實(shí)現(xiàn)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;
18
19 dError=thisError-2*(vPID->lasterror)+vPID->preerror;
20
21 uint16_t beta= BetaGeneration(error, vPID->epsilon);
22
23 if(beta>0)
24
25 {
26
27 increment=vPID->proportiongain*pError+vPID->derivativegain*dError; //增量計(jì)算
28
29 }
30
31 else
32
33 {
34
35 increment=vPID->proportiongain*pError+vPID->integralgain*iError+vPID->derivativegain*dError; //增量計(jì)算
36
37 }
38
39 vPID->preerror=vPID->lasterror; //存放偏差用于下次運(yùn)算
40
41 vPID->lasterror=thisError;
42
43 vPID->result+=increment;
44
45 }
這就實(shí)現(xiàn)了增量型PID控制器積分分離算法,也沒有考慮任何的干擾條件,僅僅只是對(duì)數(shù)學(xué)公式的計(jì)算機(jī)語言化。
3、總結(jié)
積分分離算法的思想非常簡(jiǎn)單。當(dāng)然,對(duì)于β的取值,很多人提出了改進(jìn)措施,例如分多段取值,設(shè)定多個(gè)閾值ε1、ε2、ε3、ε4等,不過這些閾值也需要根據(jù)實(shí)際的系統(tǒng)來設(shè)定。除了分段取值外,甚至也有采用函數(shù)關(guān)系來獲取β值。當(dāng)然,這樣處理后就不再是簡(jiǎn)單的積分分離了,特別是在增量型算法中,實(shí)際上已經(jīng)演變?yōu)橐环N變積分算法了。已經(jīng)偏離了積分分離算法的設(shè)計(jì)思想,在后面我們會(huì)進(jìn)一步說明。
編輯:hfy
-
算法
+關(guān)注
關(guān)注
23文章
4759瀏覽量
97109 -
PID控制器
+關(guān)注
關(guān)注
2文章
173瀏覽量
19571 -
PD控制器
+關(guān)注
關(guān)注
0文章
37瀏覽量
16853
發(fā)布評(píng)論請(qǐng)先 登錄
Aerodiode高帶寬激光鎖定PID控制器
CW32電機(jī)控制基礎(chǔ)——PID控制原理
改進(jìn)粒子群算法的永磁同步電機(jī)PID控制器
改進(jìn)的BP網(wǎng)絡(luò)PID控制器在無刷直流電機(jī)中的應(yīng)用
永磁同步直線電機(jī)的粒子群PID空間矢量控制
限時(shí)免積分下載:增量式與位置式PID算法的C語言實(shí)現(xiàn)分享
用硬件電路去實(shí)現(xiàn)PID的控制
PID控制詳解(可下載)
資料免費(fèi)下!PID電機(jī)控制系統(tǒng)(控制原理+控制算法+程序范例)
PID發(fā)展趨勢(shì)分析
PID控制算法的C語言實(shí)現(xiàn):PID算法原理
PID控制器介紹
比例諧振(PR)控制器的學(xué)習(xí)過程記錄

經(jīng)典PID控制器的積分分離優(yōu)化算法
評(píng)論