陳祖霖, 沈 英, 吳 靖
(福州大學(xué)機(jī)械工程及自動化學(xué)院, 福建 福州 350108)
步進(jìn)電機(jī)是一種簡單、 穩(wěn)定性良好的機(jī)電元件, 可以將電脈沖信號轉(zhuǎn)換為角位移輸出, 電機(jī)位移輸出的大小與脈沖嚴(yán)格同步, 具有瞬間啟動, 精確定位操作等特點(diǎn)[1]. 步進(jìn)電機(jī)轉(zhuǎn)動的位移由驅(qū)動脈沖的數(shù)量決定, 而轉(zhuǎn)動的速度快慢通過脈沖頻率的高低來表示, 因其只存在周期性的誤差, 沒有累積誤差而深受歡迎. 使用單片機(jī)、 DSP等處理器對步進(jìn)電機(jī)實(shí)現(xiàn)自動化控制, 能夠更好地應(yīng)用和服務(wù)于生活的各領(lǐng)域, 如數(shù)控系統(tǒng)、 醫(yī)療器械、 機(jī)械臂等, 但此類系統(tǒng)的資源消耗大且存在實(shí)時(shí)性差的問題. 現(xiàn)場可編程門陣列(field-programmable gate array, FPGA)是完全基于硬件的可編程, 相比于單片機(jī)FPGA具有多線程、 運(yùn)行速度快等優(yōu)點(diǎn), 使其在電機(jī)控制系統(tǒng)的應(yīng)用越來越廣泛[2].
本研究主要以光學(xué)及精密機(jī)械檢測系統(tǒng)中的光學(xué)位移臺為例, 結(jié)合單片機(jī)與FPGA技術(shù)設(shè)計(jì)一種步進(jìn)電機(jī)運(yùn)動控制系統(tǒng), 光學(xué)位移臺主要用于光學(xué)元件的位移, 使得在光學(xué)測試系統(tǒng)中達(dá)到調(diào)光、 調(diào)焦的目的. 通過對上位機(jī)和運(yùn)動程序的設(shè)計(jì), 使得光學(xué)位移臺能夠?qū)崿F(xiàn)速度、 位移的控制, 達(dá)到精準(zhǔn)定位, 運(yùn)行平穩(wěn)及低噪聲等控制要求. 采用FPGA可以同步或異步控制多個(gè)步進(jìn)電機(jī)運(yùn)動, 因此通過上位機(jī)界面可以控制多個(gè)光學(xué)位移臺的運(yùn)行. 光學(xué)位移臺可以與其他種類的臺子組成多維電動調(diào)整臺. 步進(jìn)電機(jī)控制系統(tǒng)借助增量式編碼器完成電機(jī)位置的反饋, 實(shí)現(xiàn)了閉環(huán)控制, 其中微處理器STM32作為控制系統(tǒng)數(shù)據(jù)收發(fā)的轉(zhuǎn)換模塊, FPGA作為步進(jìn)電機(jī)運(yùn)動控制的核心模塊. STM32和FPGA能各行其是, 完成系統(tǒng)對電機(jī)運(yùn)動狀態(tài)的控制及反饋. 經(jīng)過仿真和測試, 該控制系統(tǒng)的穩(wěn)定性良好, 達(dá)到所設(shè)定的要求. 本研究對系統(tǒng)的軟硬件分模塊進(jìn)行說明, 實(shí)現(xiàn)對單路步進(jìn)電機(jī)的控制, 為多路步進(jìn)電機(jī)控制系統(tǒng)的開發(fā)提供了一定的參考.
圖1 控制系統(tǒng)結(jié)構(gòu)框圖Fig.1 Control system block diagram
本系統(tǒng)使用的FPGA為Cyclone IV系列, 基于VS(visual studio)軟件設(shè)計(jì)了上位機(jī)人機(jī)交互界面; 利用串口通信, STM32F103把從上位機(jī)接收到的命令, 通過自帶的FSMC(flexible static memory controller)接口, 將命令轉(zhuǎn)化成FPGA能接收的方式. 控制系統(tǒng)結(jié)構(gòu)框圖如圖1所示.
在人機(jī)交互界面進(jìn)行步進(jìn)電機(jī)運(yùn)行參數(shù)的設(shè)置, 發(fā)送命令實(shí)現(xiàn)步進(jìn)電機(jī)的啟停、 速度等級選擇、 加減速、 方向控制等狀態(tài)轉(zhuǎn)化. FPGA采用異步復(fù)位, 同步釋放方式, 通過上位機(jī)復(fù)位按鈕發(fā)送復(fù)位指令即可實(shí)現(xiàn)FPGA的系統(tǒng)復(fù)位, 增加了系統(tǒng)復(fù)位的可靠性. 應(yīng)用Verilog編寫偶數(shù)分頻器, 實(shí)現(xiàn)脈沖的輸出; 采用編碼器完成電機(jī)的位置閉環(huán)控制, 在電機(jī)運(yùn)行時(shí), 可將電機(jī)運(yùn)行的狀態(tài)數(shù)據(jù)反饋到上位機(jī). 因此結(jié)合STM32和FPGA不需要復(fù)雜的硬件電路, 就可以實(shí)現(xiàn)合理的資源分配, 通過上位機(jī)達(dá)到實(shí)時(shí)控制步進(jìn)電機(jī)運(yùn)動狀態(tài)的目的, 提高整個(gè)系統(tǒng)數(shù)據(jù)傳遞與電機(jī)運(yùn)行的穩(wěn)定性和準(zhǔn)確性.
微處理器STM32與上位機(jī)用串口(usart)進(jìn)行通信, STM32負(fù)責(zé)接收上位機(jī)發(fā)送的命令、 數(shù)據(jù)并進(jìn)行轉(zhuǎn)換, 然后發(fā)送給FPGA, 從而實(shí)現(xiàn)對步進(jìn)電機(jī)的控制[3]. 同時(shí)STM32通過FSMC總線接收來自FPGA關(guān)于電機(jī)運(yùn)行的反饋數(shù)據(jù), 并通過串口通信在上位機(jī)界面顯示出來. STM32與FPGA能實(shí)現(xiàn)多種方式的通信, 如USART、 SPI、 IIC等, 本研究使用高速數(shù)據(jù)采集及傳輸?shù)腇SMC總線進(jìn)行并行通信[4].
圖2 FSMC總線通信圖Fig.2 FSMC bus communication diagram
FSMC是一種靈活的靜態(tài)存儲控制器, 單片機(jī)上有FSMC的接口, 通過數(shù)據(jù)線和地址線完成數(shù)據(jù)的發(fā)送和接收. 大規(guī)模FPGA設(shè)計(jì)基于SRAM結(jié)構(gòu), 對于外部SRAM的控制一般有: 地址線(A0~A18)、 數(shù)據(jù)線(D0~D15)、 寫信號(WR)、 讀信號(RD)、 片選信號(CS). 本研究使用3根地址線, 使用16根數(shù)據(jù)線一次傳輸2個(gè)字節(jié). STM32與FPGA采用FSMC總線通信如右圖2所示.
驅(qū)動器用于將FPGA發(fā)送的電脈沖信號轉(zhuǎn)換為角位移. 當(dāng)驅(qū)動器接收一個(gè)電脈沖信號時(shí), 就會驅(qū)動步進(jìn)電機(jī)轉(zhuǎn)動一個(gè)步距角. 二相混合式步進(jìn)電機(jī)的步距角為1.8°, 大小與驅(qū)動器所設(shè)定的細(xì)分?jǐn)?shù)有關(guān), 本研究設(shè)定驅(qū)動器為32細(xì)分, 因此細(xì)分后的步距角為0.056 25°, 轉(zhuǎn)動一圈需要6 400個(gè)脈沖. 細(xì)分?jǐn)?shù)的設(shè)定有利于減小電機(jī)的低頻振蕩和運(yùn)行時(shí)的噪音. 步進(jìn)電機(jī)的驅(qū)動器與FPGA采用的是共陰極接法, PUL+接脈沖信號、 DIR+接方向信號, 使信號能從ENA+接入, 將PUL-、 DIR-、 ENA-接公共地.
在步進(jìn)電機(jī)控制系統(tǒng)中, 微處理器STM32應(yīng)用Keil uvision5編程軟件和C語言進(jìn)行程序的設(shè)計(jì)編寫; 步進(jìn)電機(jī)運(yùn)行程序是基于Quartus II軟件和Verilog語言設(shè)計(jì)編寫的; 人機(jī)交互界面是借助Visual Studio軟件以C#語言為基礎(chǔ)進(jìn)行設(shè)計(jì)的.
分頻器利用一個(gè)高穩(wěn)定和高準(zhǔn)確度的基準(zhǔn)頻率產(chǎn)生一系列等間隔的離散頻率信號. 步進(jìn)電機(jī)的持續(xù)運(yùn)轉(zhuǎn)要通過一系列的脈沖來驅(qū)動, 通過對分頻器的設(shè)計(jì)可產(chǎn)生連續(xù)不斷的脈沖信號和獲得需要的脈沖頻率. 定義步進(jìn)電機(jī)運(yùn)行的脈沖頻率為f(Hz), 分頻系數(shù)為p(即p分頻), 兩者關(guān)系如下式所示:
(1)
圖3 分頻器設(shè)計(jì)流程圖Fig.3 Divider design flow chart
步進(jìn)電機(jī)在進(jìn)行加減速時(shí), 通過控制單位時(shí)間內(nèi)輸出的脈沖數(shù)來改變其脈沖頻率[5]; 如在加速過程脈沖頻率會不斷增大, 對應(yīng)的脈沖周期相應(yīng)減小, 通過分頻技術(shù)可以得到想要的脈沖頻率.
圖4 Mealy狀態(tài)機(jī)模型Fig.4 Meary state machine model
脈沖頻率的變化通過有限狀態(tài)機(jī)(finite-state machine, FSM)完成程序設(shè)計(jì); 本研究使用三段式Mealy(米勒)狀態(tài)機(jī), 包括2個(gè)時(shí)序邏輯的always塊和一個(gè)組合邏輯的always塊, 通過設(shè)置現(xiàn)態(tài)(cstate)和次態(tài)(nstate)兩參數(shù)完成加減速過程狀態(tài)之間的轉(zhuǎn)移和脈沖輸出. 圖4為Mealy狀態(tài)機(jī)模型.
步進(jìn)電機(jī)加減速包含加速、 勻速、 減速這三個(gè)階段; 當(dāng)電機(jī)接收到加減速命令后, 以設(shè)定的起始脈沖頻率加速到最大速度點(diǎn), 然后進(jìn)行勻速運(yùn)動, 達(dá)到減速點(diǎn)時(shí)減速至起始頻率后停止[6]. 定義在加減速過程中步進(jìn)電機(jī)的位移即脈沖數(shù)為Pulse_num, 起始分頻系數(shù)aTmax=a, 最大轉(zhuǎn)速時(shí)分頻系數(shù)aTmin=b, 每頻率段的脈沖數(shù)(位移)為n, 設(shè)定每發(fā)出n個(gè)脈沖分頻系數(shù)減2, 程序上這樣設(shè)定aT=aT-2, bT=2×(aT-2)+1. 由于aT與bT在程序運(yùn)行時(shí)是并行的, 因此aT的值為前一狀態(tài)保留的值. 加速階段的脈沖數(shù)Accel_num計(jì)算如下:
(2)
勻速階段的脈沖數(shù)為Uni_num計(jì)算如下:
Uni_num=Pulse_num-2×Accel_num
(3)
因此, 對于給定的脈沖總數(shù), 系統(tǒng)運(yùn)行時(shí)都會按照程序中的設(shè)定, 對三個(gè)階段所需要的脈沖數(shù)進(jìn)行分配. 步進(jìn)電機(jī)轉(zhuǎn)向的控制, 主要由方向信號的高低電平來決定的; 所設(shè)計(jì)的控制系統(tǒng)默認(rèn)電機(jī)為逆時(shí)針方向轉(zhuǎn)動即dir=0, 當(dāng)方向信號變?yōu)楦唠娖郊磀ir=1時(shí), 電機(jī)為順時(shí)針方向轉(zhuǎn)動.
模塊化設(shè)計(jì)是FPGA最基本的理念, 一個(gè)較為復(fù)雜的控制系統(tǒng)往往包含多個(gè)子模塊, 采用例化的方式可將各模塊的輸入和輸出進(jìn)行連接. 因此在FPGA中實(shí)例化控制系統(tǒng)的各功能模塊, 有利于代碼的簡化和修改, 使系統(tǒng)在實(shí)時(shí)性和靈活性等方面有很大提高, 有利于實(shí)現(xiàn)步進(jìn)電機(jī)運(yùn)動狀態(tài)的控制[7]. 現(xiàn)對電機(jī)運(yùn)行采用模塊的例化, 實(shí)現(xiàn)層次化設(shè)計(jì). 將電機(jī)運(yùn)行分成4個(gè).v文件來實(shí)現(xiàn), 頂層文件drive_1.v, 負(fù)責(zé)例化模塊并連線; 速度選擇模塊sel_speed.v, 包含4個(gè)不同的速度等級; 加減速模塊T_speed.v, 通過有限狀態(tài)機(jī)實(shí)現(xiàn)加減速運(yùn)動的控制; 閉環(huán)控制模塊closed_loop.v, 防止電機(jī)丟步. 系統(tǒng)經(jīng)例化處理后, 綜合結(jié)果的頂層模塊圖見圖5 .
閉環(huán)步進(jìn)電機(jī)的補(bǔ)償, 補(bǔ)償值為編碼器測得的實(shí)際步數(shù)與設(shè)定步數(shù)的差值; 在電機(jī)到達(dá)停止點(diǎn)時(shí)由驅(qū)動器完成補(bǔ)償脈沖. 增量式光電編碼器與電機(jī)相連, 當(dāng)電機(jī)接收驅(qū)動脈沖轉(zhuǎn)動時(shí), 便帶動了碼盤轉(zhuǎn)動, 從而產(chǎn)生了轉(zhuǎn)角信號[8]. 光電編碼器中A、 B是相位差為90°的脈沖波; Z信號用于調(diào)零, 編碼器每旋轉(zhuǎn)一圈時(shí)產(chǎn)生一個(gè)脈沖信號.
在一個(gè)編碼器周期內(nèi), A、 B信號共有4次的跳變沿, 因此為了提高編碼器的精度, 采用4倍頻技術(shù). 電機(jī)正轉(zhuǎn)時(shí), 每檢測到一次跳變沿, 設(shè)置可逆計(jì)數(shù)器counter加1; 電機(jī)反轉(zhuǎn)時(shí), 每檢測到一次跳變沿, 則可逆計(jì)數(shù)器counter減1. 以步進(jìn)電機(jī)正轉(zhuǎn)為例, A信號超前B信號90°, 相對的電平信號變化為10-11-01-00, 如圖6所示.
FSMC通信使用讀寫模式A, 因此FPGA通過模式A的時(shí)序完成數(shù)據(jù)的寫入和讀取. 微處理器STM32的FSMC接口支持8/16/32位數(shù)據(jù)寬度, 進(jìn)行數(shù)據(jù)傳輸?shù)膶?shí)驗(yàn), 在FPGA對應(yīng)的地址上寫入16位數(shù)據(jù)寬度, 如表1所示.
表1 STM32向FPGA寫入數(shù)據(jù)表
在FPGA程序代碼里設(shè)置db為16位inout類型數(shù)據(jù), 即從端口內(nèi)部看, 可以對端口進(jìn)行賦值即輸出數(shù)據(jù), 也可以從此端口讀入數(shù)據(jù)即輸入. 設(shè)置assign db=rd?indata:16’hzzzz, rd(讀信號)為wire型變量, 當(dāng)rd=1時(shí), 可以進(jìn)行數(shù)據(jù)的輸出, rd=16’hzzzz時(shí), 表示高阻”Z”狀態(tài), 輸出受限制. 微處理器STM32向FPGA寫入數(shù)據(jù)時(shí), 片選信號csn為低電平有效, 寫信號wrn為低電平有效; 當(dāng)wrn顯示為低電平時(shí), 在ab上的地址0~7 h分別寫入數(shù)據(jù)db為1 000~1 007 h, 實(shí)現(xiàn)了STM32對FPGA給定地址寫入給定數(shù)據(jù).
應(yīng)用嵌入式邏輯分析儀SignalTap實(shí)時(shí)顯示從微處理器發(fā)送來的數(shù)據(jù), 如圖7所示. 在進(jìn)行命令發(fā)送時(shí), 當(dāng)上位機(jī)發(fā)出命令后, 微處理器STM32通過串口實(shí)現(xiàn)數(shù)據(jù)的接收并進(jìn)行轉(zhuǎn)換, 通過FSMC總線把轉(zhuǎn)換后的命令發(fā)送給FPGA, FPGA接收到發(fā)送來的命令后, 開始執(zhí)行相關(guān)的運(yùn)行模塊, 控制步進(jìn)電機(jī)的運(yùn)行狀態(tài).
圖7 SignalTap數(shù)據(jù)傳輸實(shí)時(shí)仿真圖 Fig.7 SignalTap data transmission real-time simulation diagram
實(shí)驗(yàn)所用的FPGA為ALIENTEK新起點(diǎn)EP4CE10開發(fā)板, 系統(tǒng)時(shí)鐘為50 MHz, 即一個(gè)時(shí)鐘周期為20 ns,應(yīng)用Modelsim對FPGA的輸出脈沖實(shí)現(xiàn)聯(lián)合仿真. 本研究設(shè)定4個(gè)速度等級, 本次以分頻系數(shù)為25 000的輸出脈沖為例進(jìn)行仿真實(shí)驗(yàn), 為了節(jié)省仿真時(shí)間, 把分頻系數(shù)25 000縮小2 500倍即為10, 在程序中設(shè)置參數(shù)aT=8’d4、 bT=8’d9, 運(yùn)行程序仿真結(jié)果如圖8所示. 在一個(gè)脈沖周期內(nèi), 高電平的時(shí)間為100 ns即5個(gè)時(shí)鐘周期, 低電平也為100 ns, 因此輸出的脈沖占空比為50%, 為偶分頻. 為了實(shí)現(xiàn)步進(jìn)電機(jī)的不同速度等級, 可采用設(shè)置不同的分頻系數(shù)來獲得不同的脈沖頻率.
步進(jìn)電機(jī)一個(gè)脈沖運(yùn)行一步, 在電機(jī)加減速階段, 單位時(shí)間內(nèi)的位移會發(fā)生變化. 因此在每個(gè)頻段都設(shè)置相同的位移, 即在加速時(shí), 位移一定, 隨著速度的增大, 所用的時(shí)間減小; 在減速時(shí), 隨著速度的減小, 所用的時(shí)間變長. 程序中設(shè)置位移為2個(gè)脈沖, 起始的分頻系數(shù)設(shè)為15, 脈沖數(shù)為30個(gè), 用Modelsim進(jìn)行加減速仿真, 結(jié)果如圖9所示.
從圖9可以得出, 在進(jìn)行加減速時(shí)分為3個(gè)階段: 在加速階段, 脈沖頻率每隔2個(gè)脈沖增大一次, 即對應(yīng)圖中左邊部分脈沖寬度減小, 脈沖數(shù)為6個(gè); 勻速階段的脈沖頻率不變, 即對應(yīng)圖中間部分脈沖寬度不變, 脈沖數(shù)為18個(gè); 減速階段脈沖頻率為每2個(gè)脈沖減小一次, 即對應(yīng)圖中右邊部分脈沖寬度增大, 脈沖數(shù)為6個(gè); 當(dāng)步進(jìn)電機(jī)的脈沖頻率降到起始頻率即分頻系數(shù)為15時(shí), 輸出脈沖數(shù)為零, 步進(jìn)電機(jī)停止運(yùn)行. 因此, 輸出脈沖的仿真結(jié)果表明, 在加減速運(yùn)行時(shí)能夠準(zhǔn)確的達(dá)到設(shè)定的脈沖數(shù).
搭建電機(jī)運(yùn)動控制系統(tǒng)所需要的實(shí)驗(yàn)平臺, 進(jìn)行實(shí)際的運(yùn)行和調(diào)試, 如圖10所示. 在進(jìn)行通信程序設(shè)計(jì)時(shí), 應(yīng)設(shè)置好步進(jìn)電機(jī)運(yùn)動過程所對應(yīng)的狀態(tài)碼, 如表2所示. 在上位機(jī)設(shè)有數(shù)據(jù)的接收區(qū), 接收來自FPGA關(guān)于電機(jī)運(yùn)行狀態(tài)的反饋數(shù)據(jù), 接收模式設(shè)有兩種為十六進(jìn)制hex和字符, 這里為方便顯示, 設(shè)為字符串接收模式. 打開上位機(jī)軟件進(jìn)行操作, 配置串口號、 波特率和電機(jī)運(yùn)行參數(shù), 設(shè)置完成后, 點(diǎn)擊運(yùn)行, 步進(jìn)電機(jī)就能按照設(shè)定的要求運(yùn)轉(zhuǎn). 步進(jìn)電機(jī)接收到命令運(yùn)行穩(wěn)定, 并通過FSMC總線成功向上位機(jī)發(fā)送運(yùn)行狀態(tài)的反饋數(shù)據(jù). 控制系統(tǒng)的上位機(jī)操作界面如圖11所示. 在數(shù)據(jù)接收區(qū)顯示, 地址1、 2、 3的數(shù)據(jù)為0, 表示系統(tǒng)復(fù)位完成, 將3個(gè)地址里的數(shù)據(jù)清零; 接收到的數(shù)據(jù)1: 3003 2:2000 3:4000, 查詢表2可知步進(jìn)電機(jī)以速度等級4、 正向、 啟動; 系統(tǒng)復(fù)位后, 1:0 2:2003 3:0, 查詢表2可知步進(jìn)電機(jī)進(jìn)行加減速運(yùn)動. 因此設(shè)計(jì)的上位機(jī)能夠準(zhǔn)確地接收和發(fā)送命令, 控制步進(jìn)電機(jī)運(yùn)行.
表2 電機(jī)運(yùn)行狀態(tài)編碼
圖12 電機(jī)位置閉環(huán)控制圖Fig.12 Motor position closed loop control diagram
步進(jìn)電機(jī)在加減速運(yùn)行時(shí), 通過SignalTap實(shí)時(shí)測得的電機(jī)位置閉環(huán)控制圖如圖12所示, 圖中顯示編碼器計(jì)數(shù)cnt, 補(bǔ)償脈沖sup_pulse, 以及電機(jī)運(yùn)行脈沖頻率freq. 在調(diào)試中設(shè)定目標(biāo)脈沖數(shù)為set_p=256 160個(gè); 從圖12中得到編碼器計(jì)數(shù)cnt=8 000, 因采用4倍頻, 計(jì)算出編碼器實(shí)際計(jì)數(shù)值為32 000, 實(shí)際測得的脈沖數(shù)actual_p=32 000×8即256 000個(gè). 閉環(huán)控制采用步校驗(yàn), 在電機(jī)運(yùn)行到達(dá)停止點(diǎn)之后補(bǔ)償160個(gè)脈沖, 實(shí)現(xiàn)電機(jī)位置的閉環(huán)控制. 因此經(jīng)過調(diào)試, 控制系統(tǒng)達(dá)到光學(xué)位移臺的要求, 能實(shí)現(xiàn)速度和位移的精確控制, 通過上位機(jī)能準(zhǔn)確地控制步進(jìn)電機(jī)的運(yùn)動狀態(tài), 進(jìn)而控制光學(xué)位移臺平穩(wěn)的運(yùn)行.
本研究結(jié)合STM32和FPGA設(shè)計(jì)了一種步進(jìn)電機(jī)控制系統(tǒng), 采用編碼器, 通過步校驗(yàn)的方式實(shí)現(xiàn)電機(jī)位置的閉環(huán)控制. 此外, 借助Visual Studio進(jìn)行UI設(shè)計(jì), 提供了人機(jī)交互界面. 仿真和測試結(jié)果表明, 該控制系統(tǒng)穩(wěn)定性良好且控制精準(zhǔn), 步進(jìn)電機(jī)運(yùn)動的各項(xiàng)指標(biāo)符合設(shè)定要求. 利用FPGA并行速度快的特點(diǎn), 在本系統(tǒng)的基礎(chǔ)上可完成對多路步進(jìn)電機(jī)控制系統(tǒng)的設(shè)計(jì), 可移植性高, 因此具有廣泛的適應(yīng)性和參考價(jià)值.