前面我們討論了經典的數字PID控制算法及其常見的改進與補償算法,基本已經覆蓋了無模型和簡單模型PID控制經典算法的大部。再接下來的我們將討論智能PID控制,智能PID控制不同於常規意義下的智能控制,是智能算法與PID控制算法的結合,是基於PID控制器的智能化優化。
在本章我們首先來探討一下專家PID算法。正如前面所說,專家PID算法是專家系統與PID算法的結合與應用優化,所以我們接下來先簡單了解專家控制。
1、專家控制的基本思想
專家控制是智能控制的一個分支,是專家系統的理論和技術同控制理論、方法與技術相結合,在無對象模型的情況下,模仿領域專家的經驗來實現對被控對象的控制。
專家控制一般由知識庫和推理機構構成主體框架,按照某種策略及時選用恰當的規則進行推理輸出,實現控制。其基本結構如下:
有上圖我們不難發現影響專家控制器控制精確性的主要是知識庫表達的准確性以及推理機的正確性。知識庫越完備、越准確那么對你被控對像的狀態識別也就越准確。當然,推理機設計的差別也會對控制結果有影響。
專家控制器一般來說分為2中實現形式,被稱之為直接型專家控制器和間接型專家控制器。所謂直接型專家控制器就是用專門設計的專家控制器直接對被控對象進行控制的方法。該控制器任務和功能都比較簡單,一般都是實時在線運行,直接對被控對象進行控制。其結構圖如下:
而所謂間接型專家控制器是指專家控制器作為其他控制器的輔助方式或者相互結合的控制方式來實現的一種控制器。專家系統通過高層決策來影響控制器輸出,而這種高層決策可以是在線也可以是離線,器不會直接控制被控對象。其結構圖如下:
所以我們所要討論的專家PID算法應該是一種直接型專家控制器,因為專家系統決策與PID算法是結合在一起的,並沒有獨於PID算法的專家控制器,而是專家決策直接決定PID算法機器輸出,這與直接型專家控制的定義是相符的。
2、專家PID的設計思路
專家PID控制就是基於被控對象和控制規律的各種知識,而不需要知道被控對象的精確模型,利用專家經驗來設計PID參數。怎么來實現這一過程呢?我們來分析並推導這一算法。
我們假設當前為第k采樣,當前偏差為e(k),同樣前一采樣時刻的偏差為e(k-1),而前兩個采樣時刻的偏差為e(k-1),則可以得到兩次的偏差增量為:
清楚了以上公式,我們再設定偏差的一個極大值,記為Mmax;設定一個偏差較大的中間值,記為Mmid;設定一個偏差的極小值,記為Mmin。根據以上偏差、偏差增量以及偏差極值的設定,我們分析如下:
(1)如果|e(k)|>Mmax
這種情況說明偏差的絕對值已經很大了,不論偏差變化趨勢如何,都應該考慮控制器的輸入應按最大(或最小)輸出,以達到迅速調整偏差的效果,使偏差絕對值以最大的速度減小。
這種情況下其實相當於實施開環控制,是一種對偏差出現極限情況的快速響應。
(2)如果|e(k)|≤Mmax
這種情況我們需要更具系統的變化趨勢來分析,具體的情況實施不同的控制方式,我們引入偏差增量來協助分析。
(2.1)當e(k)*∆e(k)>0或者∆e(k)=0時
這種情況說明偏差在朝向偏差絕對值增大的方向變化,或者偏差為某一固定值,此時我們再判斷偏差的絕對值與偏差的中間值Mmid之間的關系。
(2.1.1)此時如果|e(k)|>Mmid,說明偏差也較大,可考慮由控制器實施較強的控制作用,以達到扭轉偏差絕對值向減小的方向變化,並迅速減小偏差的絕對值。
(2.1.2)此時如果|e(k)|≤Mmid,說明盡管偏差是向絕對值增大的方向變化,但是偏差絕對值本身並不是很大,可以考慮控制器實施一般的控制作用,只需要扭轉偏差的變化趨勢,使其向偏差絕對值減小的方向變化即可。
(2.2)當e(k)*∆e(k)<0且∆e(k)*∆e(k-1)>0或者e(k)=0時,說明偏差的絕對值向減小的方向變化,或者已經達到平衡狀態,此時保持控制器輸出不變即可。即:U(k)=U(k-1)。
(2.3)當e(k)*∆e(k)<0且∆e(k)*∆e(k-1)<0時,說明偏差處於極限狀態。如果此時偏差的絕對值較大,|e(k)|>Mmid,可以考慮實施較強控制作用。
如果此時偏差絕對值較小,|e(k)|<Mmid,可以考慮實施較弱控制作用。
其中,k1為增益放大系數,k1取大於1的值;k2為增益抑制系數,取大於0而小於1的值。
(3)如果|e(k)|<Mmin
這種情況實際上說明偏差絕對值很小,這種偏差有可能是系統靜差引起的,此時必須要引入積分作用,實施PID控制或者PI控制。
Kp和Ki可以適當減小,以減小控制作用。當偏差小到一定程度后,甚至可以引入死區的概念,是系統穩定下來而不需要去進行調節。
3、專家PID算法實現
前面我們了解了專家PID控制器的基本原理,並分析了一個較為常見的專家PID的控制規則。分析規則的過程其實也是一個推理的基本過程,所以我們得到了基本的規則庫同時也有相應的推理機,接下來我們就來實現這一算法。
首先定義一個專家PID的結構體對象:
1 /*定義結構體和公用體*/ 2 typedef struct 3 { 4 float setpoint; /*設定值*/ 5 float kp; /*比例系數*/ 6 float ki; /*積分系數*/ 7 float kd; /*微分系數*/ 8 float lasterror; /*前一拍偏差*/ 9 float preerror; /*前兩拍偏差*/ 10 float result; /*PID控制器結果*/ 11 float output; /*輸出值,0-100,為百分比值*/ 12 float maximum; /*輸出值上限*/ 13 float minimum; /*輸出值下限*/ 14 float errorabsmax; /*偏差絕對值最大值*/ 15 float errorabsmid; /*偏差絕對值中位值*/ 16 float errorabsmin; /*偏差絕對值最小值*/ 17 }EXPERTPID;
在上面分析的基礎上我們很容易寫出來一個專家PID的控制器如下:
1 void ExpertPID(EXPERTPID vPID,float pv) 2 { 3 float thiserror; 4 float deltaerror; 5 float lastdeltaerror; 6 float result;//本次調節輸出值 7 8 thiserror=vPID->setpoint-pv; 9 deltaerror=thiserror-vPID->lasterror; 10 lastdeltaerror=vPID->lasterror-vPID->preerror; 11 12 if(abs(thiserror)>=vPID->errorabsmax) 13 {/*執行規則1*/ 14 if(thiserror>0) 15 { 16 result=vPID->maximum; 17 } 18 19 if(thiserror<0) 20 { 21 result=vPID->minimum; 22 } 23 } 24 25 if((thiserror*deltaerror>0)||(deltaerror==0)) 26 {/*執行規則2*/ 27 28 if(abs(thiserror)>=vPID->errorabsmid) 29 { 30 result=vPID->result+2.0*(vPID->kp*deltaerror+vPID->ki*thisError+vPID->kd*(deltaerror-lastdeltaerror); 31 } 32 else 33 { 34 result=vPID->result+0.4*(vPID->kp*deltaerror+vPID->ki*thisError+vPID->kd*(deltaerror-lastdeltaerror); 35 } 36 } 37 38 if(((thiserror*deltaerror<0)&&(deltaerror*lastdeltaerror>0))||(thiserror==0)) 39 {/*執行規則3*/ 40 result=vPID->result; 41 } 42 43 if((thiserror*deltaerror<0)&&(deltaerror*lastdeltaerror<0)) 44 {/*執行規則4*/ 45 if(abs(thiserror)>=vPID->errorabsmid) 46 { 47 result=vPID->result+2.0*output+vPID->kp*thiserror; 48 } 49 else 50 { 51 result=vPID->result+0.6*output+vPID->kp*thiserror; 52 } 53 } 54 55 if((abs(thiserror)<=vPID->errorabsmin)&&(abs(thiserror)>0)) 56 {/*執行規則5*/ 57 result=vPID->result+0.5*vPID->kp*deltaerror+0.3*vPID->ki*thiserror; 58 } 59 60 /*對輸出限值,避免超調*/ 61 if(result>=vPID->maximum) 62 { 63 result=vPID->maximum; 64 } 65 66 if(result<=vPID->minimum) 67 { 68 result=vPID->minimum; 69 } 70 71 vPID->result=result; 72 vPID->preerror=vPID->lasterror; 73 vPID->lasterror=thiserror; 74 vPID->output=(result/(vPID->maximum-vPID->minimum))*100; 75 }
4、專家PID總結
本節我們實現了一個專家PID控制器,這是一種專家規則直接與PID算法相結合的直接型專家控制器。通過分析PID的調節過程總結了5條規則,以這5條規則為基礎實現了上述的算法。當然這只是一個普遍型的規則庫,對於不同的被控對象和控制要求,我們可以采用不同的判斷規則,而且各參數的選取需依賴於專家經驗,所以規則的獲取和使用也會有不同方式。
歡迎關注: