楊興旺, 胡黃水, 卿金暉
(長春工業(yè)大學 計算機科學與工程學院, 吉林 長春 130012)
無刷直流電機[1]廣泛應(yīng)用在航空航天、自動化、工農(nóng)業(yè)生產(chǎn)等領(lǐng)域,所以對電機的控制精度有較高要求,PID算法由于結(jié)構(gòu)清晰,可根據(jù)實際情況對被控對象實時調(diào)節(jié),滿足對電機控制的要求,故在電機控制中常采用PID控制算法進行控制。
現(xiàn)階段PID控制器通常采用單片機、DSP等控制芯片實現(xiàn)算法[2],采用單片機實現(xiàn)PID控制,但受其自身計算速度限制,無法進行復雜控制算法的計算與實現(xiàn);采用DSP同樣可以實現(xiàn)PID控制,但其自身資源有限,同時需要設(shè)計大量的外圍電路,這會對系統(tǒng)內(nèi)部造成干擾影響,從而降低系統(tǒng)的精度。隨著EDA技術(shù)的發(fā)展,F(xiàn)PGA芯片與其他芯片相比具有集成度高、體積小、設(shè)計電路靈活等優(yōu)點,適合應(yīng)用于各種場合[3-4]。文中針對傳統(tǒng)PID控制器存在響應(yīng)速度較慢、精度低等問題,設(shè)計了基于FPGA的無刷直流電機PID控制器,仿真結(jié)果表明,其具有響應(yīng)時間短、精度高等優(yōu)點。
PID控制器的輸入是給定輸出值r(t)與實際輸出值y(t)之間的誤差e(t),并對輸入的誤差e(t)進行比例、積分及微分運算,控制調(diào)節(jié)輸出u(t),對無刷直流電機進行實時控制[5],其原理如圖1所示。
輸入誤差值可表示為
e(t)=r(t)-y(t)。
(1)
連續(xù)域內(nèi)的PID控制算法數(shù)學表達式
(2)
式中:Kp----比例系數(shù);
Ti----積分系數(shù);
Td----微分系數(shù)。
因在硬件數(shù)字電路系統(tǒng)是對數(shù)據(jù)進行周期性采樣,無法得到需要的連續(xù)數(shù)據(jù),很難實現(xiàn)積分和微分,所以需要采用離散化的方式將式(2)改寫成差分方程的形式
u(k)=u(k-1)+
Kp[e(k)-e(k-1)]+Kie(k)+
Kd[e(k)-2e(k-1)+e(k-2)],
(3)
式中:u(k)----第k次采樣時刻的輸出值;
u(k-1)----第k-1次采樣時刻的輸出值;
e(k)----當前采樣時刻輸入與輸出的誤差值;
e(k-1)----上一次采樣時刻輸入與輸出的誤差值;
Kp,Ki,Kd----分別表示比例、積分和微分系數(shù),它們是PID控制器性能的主要決定因素。
對式(3)進一步整理,可得
u(k)=u(k-1)+Δu(k)=
u(k-1)+K0e(k)+
K1e(k-1)+K2e(k-2),
(4)
式中:Δu(k)----控制量的增量;
K0,K1,K2----系數(shù)。
K0,K1,K2可通過下式求得
K0=Kp+Ki+Kd,
K1=Kp-2Kd,
(5)
K2=Kd。
通過式(5)可知,只要知道k時刻及前兩個時刻的誤差,即可計算出k時刻的增量,所以式(4)也可稱作增量式PID控制。由于增量式PID控制算法在計算時僅與近兩次的誤差采樣值有關(guān),從而避免了多次的累加計算,因此占用資源較少、計算速度快,在控制領(lǐng)域應(yīng)用廣泛[6]。
通過FPGA實現(xiàn)PID控制器,F(xiàn)PGA芯片采用Altera公司 Cyclone Ⅳ系列的EP4CE115芯片,在Quartus Ⅱ 15.0中通過Verilog HDL對系統(tǒng)控制器進行設(shè)計,采用自頂至下的設(shè)計方案,主要分為賦值模塊、誤差模塊、輸出模塊以及控制模塊[7-8]。
賦值模塊的目的是在程序運行前對程序中各個變量進行初始賦值與計算,如圖2所示。
其中,clk表示時鐘信號,rst_n表示復位信號,當復位信號為高電平時,賦值模塊進行工作,在賦值模塊中,對控制器中的各個參數(shù)進行估值,在賦值完成后,根據(jù)式(5)計算K0,K1,K2的值,輸出A、B、C分別對應(yīng)K0,K1,K2,計算完成后,將完成信號init_flag_on的值置為“1”,并送入控制模塊中。
誤差模塊是計算給定值r(t)與輸出值y(t)之間的誤差值e(t),如圖3所示。
其中,輸入引腳rt、yt分別表示無刷直流電機的期望轉(zhuǎn)速與實際轉(zhuǎn)速,當接收到控制模塊信號init_flag_on_ctrl為高電平時進行工作,根據(jù)式(1),計算PID控制器的誤差,輸出ek0、ek1、ek2分別對應(yīng)式(4)中的e(k)、e(k-1)、e(k-2),計算完成后將輸出完成信號error_flag_on置為高電平,并送入控制模塊。
輸出模塊計算PID控制器的實際輸出,如圖4所示。
其中,輸入引腳Aek0、Bek1、Cek2分別對應(yīng)式(4)中的K0e(k)、K1e(k-1)、K2e(k-2),在接收到控制模塊信號error_flag_crtl后,將式(4)中的各個參數(shù)進行輸入計算,在計算過增量后與上一時刻的輸出值進行相加,得到實際的輸出yt,輸出引腳yt_n將此時刻的數(shù)值送入寄存器中,以便下次計算使用,其在數(shù)值上與輸出yt相同,計算完成功能,輸出信號yt_flag_on置為1,送入控制模塊中。
控制模塊主要對賦值模塊、誤差模塊以及輸出模塊進行控制,如圖5所示。
輸入為上述各個模塊的完成信號,輸出為進入下個模塊的控制信號。整個PID控制器的設(shè)計采用狀態(tài)機進行設(shè)計,各個模塊之間的時序通過狀態(tài)機控制。
程序狀態(tài)機的狀態(tài)遷移如圖6所示。
首先對設(shè)計的各個信號變量進行初始化,全部置為低電平,當信號start_flag_on為高電平時,跳轉(zhuǎn)到賦值模塊,否則繼續(xù)停在Idle狀態(tài);當信號init_flag_on為高電平時,表示賦值結(jié)束,此時跳轉(zhuǎn)至誤差模塊,否則,繼續(xù)在賦值模塊中執(zhí)行賦值程序;在誤差模塊中,當信號error_flag_on置為“1”時,表示計算完成,跳轉(zhuǎn)到輸出模塊,否則一直在誤差模塊中進行計算,與此同時,當公式中的參數(shù)計算完成后,通過乘法IP核對公式進行計算,并作為輸出模塊的輸入;當輸入模塊計算完成,將信號yt_flag_on置為高電平并跳轉(zhuǎn)到Idle狀態(tài),表示一次數(shù)據(jù)計算完成,否則繼續(xù)在輸出模塊中計算。
通過Testbench在ModelSim中對編寫的程序進行仿真分析[9-10],在Testbench假設(shè)期望轉(zhuǎn)速為2 000 r/min,Kp,Ki,Kd分別設(shè)置為0.5、0.3以及0.2,硬件系統(tǒng)時鐘周期為50 MHz。
ModeSim中的電機轉(zhuǎn)速仿真結(jié)果如圖7所示。
圖7 ModeSim中的電機轉(zhuǎn)速仿真結(jié)果
其中,yt_n表示電機的轉(zhuǎn)速值,通過Matlab對PID控制器的輸出數(shù)據(jù)進行擬合得到的控制轉(zhuǎn)速曲線如圖8所示。
從圖中可以看出,在0.24 s之前,無刷直流電機轉(zhuǎn)速持續(xù)增加,大約在0.24 s時,電機轉(zhuǎn)速達到最大值,最終大約在 0.3 s電機轉(zhuǎn)速達到穩(wěn)定轉(zhuǎn)速值2 000 r/min。
設(shè)計了基于FPGA的無刷直流電機PID控制器,首先通過分析無刷直流電機的PID控制原理,利用FPGA實現(xiàn)PID控制器的設(shè)計,主要包括賦值模塊、誤差模塊、輸出模塊以及控制模塊,在Quartus Ⅱ中采用Verilog HDL對上述各模塊編程實現(xiàn),最后通過Testbench在ModelSim對程序驗證分析,結(jié)果表明,采用FPGA設(shè)計的PID控制器相比于傳統(tǒng)控制器具有響應(yīng)速度快、穩(wěn)定性好的優(yōu)點。