何敏龍,肖 峻
(武漢理工大學 機電工程學院,湖北 武漢 430070)
PID控制一直是工業(yè)生產(chǎn)中應用最廣泛,最成熟的控制手段[1]。據(jù)調(diào)查,工業(yè)控制中有84%的策略采取PID控制,若算上基于PID的各種智能算法,這一數(shù)據(jù)將超過90%[2]。
在工程實際中具體應用PID控制時,使用微控制器設計數(shù)字PID控制器是一種行之有效的方式[3]。筆者使用可編程邏輯門陣列(field programmable gate array,FPGA)設計了數(shù)字PID控制器。由于FPGA是并行器件[4],使用其內(nèi)部的邏輯資源搭建出PID控制器,可以按照需求與AD采集、數(shù)據(jù)傳輸?shù)瘸S媚K連接匹配,彼此之間互相獨立,運算效率高,使用方便。
筆者詳細闡述了利用FPGA設計數(shù)字PID控制器的具體過程。首先通過Matlab進行必要的仿真,得到整個運算的數(shù)值范圍要求與數(shù)值精度要求,以此為依據(jù)設計有符號定點加法器和乘法器。然后在Quartus II軟件中以Verilog HDL語言編寫有限狀態(tài)機(finite state machine,FSM)來實現(xiàn)PID運算過程,并建立testbench,同樣以狀態(tài)機的方式構建了被控對象的仿真模型。最終在ModelSim仿真軟件中進行開環(huán)仿真、閉環(huán)仿真,保證了PID算法在RTL(real time logistics)級數(shù)字邏輯電路上的正確性,具有重要的工程應用價值。
數(shù)字PID控制器中通常采用經(jīng)過限幅的增量式PID算法,其中限幅作用可以避免執(zhí)行機構因過大的動作而損壞,而將控制量增量的形式表達則易于編程實施[5-6]。其時域表達式如式(1)~式(3)式所示。
du(k)=kp[e(k)-e(k-1)]+kie(k)+kd[e(k)-2e(k-1)+e(k-2)]
(1)
dumax≥du(k)≥dumin
(2)
u(k)=u(k-1)+du(k)
(3)
式中:du(k)為控制量的增量;kp,ki,kd分別為比例系數(shù)、積分系數(shù)、微分系數(shù);e(k),e(k-1),e(k-2)分別為當前誤差、上一時刻誤差和上兩時刻誤差;dumax為控制量最大限幅值;dumin為控制量最小限幅值;u(k)為控制器輸出的控制量。
考慮被控對象以T=0.001 s進行Z變換,最終得到輸出量的時間序列為:
y(k)=0.000 196 7u(k-1)+0.000 195 1u(k-2)+1.951y(k-1)-0.951 2y(k-2)
(4)
圖1 閉環(huán)仿真曲線
圖2 閉環(huán)仿真框圖
從圖1中可知,響應過程無超調(diào),調(diào)整時間ts≈0.4 s。同時記錄運算過程中的各項數(shù)據(jù),絕對值最大的為10,絕對值最小的非負數(shù)為0.000 001,這就決定了微控制器中的數(shù)據(jù)范圍要求及數(shù)據(jù)精度要求。
數(shù)字PID控制器基于原Altera公司CycloneIV FPGA EP4CE10F17C8芯片設計,主要包括PID控制模塊、加法器模塊、乘法器模塊。其核心是利用單進程的Moore狀態(tài)機實現(xiàn)式(1)~式(3)的運算。
由式(1)~式(3)可知,所有的運算都可以分解為加法和乘法。而FPGA屬于數(shù)字邏輯器件,正整數(shù)之間的加法運算由內(nèi)部加法器實現(xiàn),而正整數(shù)之間的乘法運算則通過芯片內(nèi)部已經(jīng)設計好的嵌入式硬件乘法單元實現(xiàn)[8-9]。然而,本設計過程中涉及到了分數(shù)、負數(shù)的相關運算,因此需要自行設計加法器、乘法器以滿足要求。
根據(jù)前文所述,運算過程中絕對值最大的為10,絕對值最小的非負數(shù)為0.000 001,因此整數(shù)部分至少用4位二進制數(shù)表示(24=16),小數(shù)部分至少用20位二進制數(shù)表示(2-20=0.000 000 953 7),才能滿足計算的范圍及精度要求。最終選取32位的數(shù)制,其中最高位表示正負(1表示正,0表示負),第2位到第12位表示整數(shù),第13位到第32位表示小數(shù),則可以在[-2 048,2 047]內(nèi)進行運算,運算精度達0.000 001。
按照上述方法設計了32位定點有符號加法器、乘法器,現(xiàn)在通過簡單的例子來說明其計算過程。例如:利用FPGA分別計算下面兩個式子,在ModelSim中進行仿真,其結果如圖3和圖4所示。
-60.125+50.25=-9.875
-24.5×(-12.5)=306.25
圖3 加法器計算結果界面圖
圖4 乘法器計算結果界面圖
由圖3和圖4可知,-60.25,50.25,-9.875,-24.5,-12.5,306.25分別用本文所述的32位數(shù)據(jù)格式表示為32’h83c20000,32’h03240000,32’h809e0000,32’h81880000,32’h80c80000,32’h13240000。故知仿真結果與理論值一致。
PID控制模塊的核心實現(xiàn)式(1)~式(3)的運算。筆者采取狀態(tài)機的思路進行設計有3個優(yōu)點:①狀態(tài)機結構穩(wěn)定,不易出錯,適合系統(tǒng)中的關鍵模塊設計。②可通過外部驅(qū)動定時器,在不影響其余連接模塊的情況下改變PID運算的采樣周期。③能夠增減狀態(tài)數(shù)目,從而實現(xiàn)PID控制的相關變形算法,例如積分分離的PID控制、變速積分PID控制等[10]。實際上筆者所設計的帶有限幅的增量式PID控制就是PID控制的一種變形。
所設計的是PID控制模塊一個6位的Moore狀態(tài)機,每個狀態(tài)都有相應的計算操作,當該狀態(tài)持續(xù)了一定時間就會跳轉(zhuǎn)至下一個狀態(tài),而從進入狀態(tài)st1開始算起,直至回到狀態(tài)st1所需的時間剛好是1 ms,這就與系統(tǒng)采樣周期為1 ms對應起來。
該狀態(tài)機使用了3個乘法器(Multiplier)和2個加法器(Adder)。進入狀態(tài)機之前需要進行系統(tǒng)復位,對相關寄存器的值進行初始化;狀態(tài)機的工作過程如下:
(1)st1,持續(xù)100 μs。將e(k)與kp+ki+kd的值賦給Multiplier1,將e(k-1)與kp+2kd的值賦給Multiplier2,將e(k-2)與kd的值賦給Multiplier3,分別計算(kp+ki+kd)e(k),(kp+2kd)e(k-1),kde(k-2)。
(2)st2,持續(xù)100 μs。將Multiplier1的輸出及Multiplier2的輸出賦給Adder1,注意Multiplier2的輸出需要加上32’h80000000,使加法變?yōu)闇p法,計算(kp+ki+kd)e(k)-(kp+2kd)e(k-1)。
(3)st3,持續(xù)200 μs。將Adder1的輸出及Multiplier3的輸出賦給Adder2,計算du(k)。
(4)st4,持續(xù)200 μs。對Adder2的輸出進行限幅,即實現(xiàn)10≥du(k)≥-10。
(5)st5,持續(xù)200 μs。將st4的輸出加到u(k),實現(xiàn)u(k)=u(k-1)+du(k)。
(6)st6,持續(xù)200 μs。內(nèi)部寄存器移位,并從外界讀取最新的誤差。
設計完成后,進行開環(huán)仿真。令誤差恒為1,通過FPGA計算實際值與MATLAB計算的理論值進行對比,結果如表1所示。由表1可知,理論數(shù)據(jù)和計算數(shù)據(jù)基本吻合。
表1 PID控制開環(huán)仿真數(shù)據(jù)對比
為了進一步驗證PID算法的準確性,采取有限狀態(tài)機編寫了被控對象的模型,并在Quartus II軟件中得到仿真文件testbench。首先針對被控對象模塊單獨進行仿真驗證,然后將PID控制模塊與被控對象模塊聯(lián)合形成閉環(huán)進行了仿真驗證。
被控對象的時域輸出由式(4)決定,據(jù)此編寫了一個6位的有限狀態(tài)時實現(xiàn)相應的運算,以1 ms為一個周期進行循環(huán)。其中用到了兩個乘法器(Multiplier)與兩個加法器(Adder)。工作過程如下:
(1)st1,持續(xù)100 μs。將1.951與y_1賦給Multiplier1,將-0.951 2與y_2賦給Multiplier2,分別計算1.95y(k-1),-0.951 2y(k-2)。
(2)st2,持續(xù)100 μs。將Multiplier1與Multiplier2的結果賦給Adder1,計算1.95y(k-1)-0.951 2y(k-2);同時將0.000 196 7與u(k-1)賦給Adder1,將0.000 193 5與u(k-2)賦給Adder2,計算0.000 196 7u(k-1)與0.000 193 5u(k-2)。
(3)st3,持續(xù)200 μs。將Adder1的結果保存至中間變量Middle,將Multiplier1與Multiplier2的輸出賦給Adder1,計算0.000 196 7u(k-1)+0.000 193 5u(k-2)。
(4)st4,持續(xù)200 μs。將中間變量Middle與Adder1的輸出賦給Adder1,計算y(k)。
(5)st5,持續(xù)200 μs。將Adder1的輸出賦給yout,計算輸出量。
(6)st6,持續(xù)200 μs。寄存器移位,并從外界讀取最新的控制量u(k)。
設計完成后,進行開環(huán)仿真。令控制量恒為1,通過FPGA計算實際值與MATLAB計算的理論值進行對比,結果如表2所示。由表2可知,理論數(shù)據(jù)和計算數(shù)據(jù)基本吻合。
表2 Gs被控對象開環(huán)仿真數(shù)據(jù)對比
單獨設計了數(shù)字PID控制器、被控對象的模型之后,在頂層文件中還需要加入誤差計算、復位等簡單的邏輯,然后將其聯(lián)合起來進行閉環(huán)仿真。如圖5所示,是將其聯(lián)合起來后生成的RTL數(shù)字邏輯頂層原理視圖。
圖5 閉環(huán)控制系統(tǒng)RTL視圖
進行閉環(huán)聯(lián)合仿真,關鍵是時序上的匹配。即控制器輸出u(k)后,被控模塊才會主動讀取u(k);反之,當被控模塊輸出yout,頂層模塊計算出誤差之后,才會被控制器模塊主動讀取。按照本文的設計,相關時序圖如圖6所示。
在進行閉環(huán)仿真之前,還要在tesebench中加入數(shù)據(jù)轉(zhuǎn)換模塊,將du(k)、u(k)、yout分別與0.1相加,使這三個變量都為正值,易于在ModelSim中觀測。同時ModelSim的仿真是ps級別,從圖1可知,系統(tǒng)的調(diào)節(jié)時間ts≈0.4 s,對于仿真而言時間過長,考慮等比例縮短狀態(tài)機時間,將一輪運算周期由1 ms縮短至1 us。進行閉環(huán)仿真,如圖7所示。
圖6 狀態(tài)機時序圖
圖7 閉環(huán)系統(tǒng)仿真
可以發(fā)現(xiàn),圖7中的響應曲線yout_show與圖1中基本一致。且系統(tǒng)大概在0.42 s進入穩(wěn)定,在7.2 s誤差被完全消除,此時控制量u(k)=-0.004 706。
詳細闡述了數(shù)字PID控制器的設計思路、方法及步驟,完成了各個模塊的開環(huán)仿真與最終的閉環(huán)仿真。主要工作包括數(shù)據(jù)格式的確定、PID控制狀態(tài)機的設計、Gs被控對象狀態(tài)機的設計以及閉環(huán)仿真。
在PID狀態(tài)機中,整體框架不變,改變狀態(tài)數(shù)目,并相應地增加輔助功能,可以設計諸如積分分離的PID、變速積分PID等各種不同的PID控制器。且效果穩(wěn)定,易于實施,具有良好的工程應用價值。