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