潘 濤 程耕國
摘 要:介紹基于FPGA的步進電機控制器的設計,在分析步進電機的工作原理的基礎上,給出了層次化設計方案與VHDL程序,并利用Quartus Ⅱ進行了仿真并給出了仿真結果。它以FPGA作為核心器件,極大地減少了外圍元件的使用。同時,采用VHDL語言控制可以根據步進電機的不同,改變模塊程序的參數就可以實現不同型號步進電機的控制,有利于步進電機的廣泛應用。
關鍵詞:步進電機;控制器;現場可編程邏輯門陣列;硬件描述語言
中圖分類號:TP29 文獻標識碼:B
文章編號:1004-373X(2009)01-148-03
FPGA Implementation of Stepping Motor Controller
PAN Tao,CHENG Gengguo
(Wuhan University of Science and Technology,Wuhan,430081,China)
Abstract:This paper introduces a design for the stepping motor controller based on FPGA,after analyzes the working principle of stepping motor,VHDL codes and the simulation results through Quartus Ⅱ are presented.At the same time,using VHDL language control to be possible to act according to the stepping motor′s differences,the change of module′s program parameter might implement the different model to stepping motor′s control,it is advantageous in stepping motor′s widespread application.
Keywords:stepping motor;controller;field programmable gate array;VHDL
0 引 言
隨著步進電機廣泛地應用于數字控制系統中作為伺服元件,步進電機在實時性和靈活性等性能上的要求越來越高。那么如何靈活、有效地控制步進電機的運轉成為研究的主要方向。這里采用現場可編程邏輯門陣列(Field Programmable Gate Array,FPGA),通過VHDL語言編程來實現四相步進電機的控制。利用FPGA設計具有以下優點:
硬件設計軟件化 FPGA的開發在功能層面上可以脫離硬件在EDA軟件上做軟仿真。當功能確定無誤后可以進行硬件電路板的設計。最后將設計好的,由EDA軟件生成的燒寫文件下載到配置設備中去,進行在線調試,如果這時的結果與要求不一致,可以立即更改設計軟件,并再次燒寫到配置芯片中而不必改動外接硬件電路。進行分層模塊設計后系統設計變得更加簡單,在實時性和靈活性等性能上都有很大的提高,有利于步進電機的運動控制。
高度集成化,高工作頻率 一般的FPGA內部都集成有上百萬的邏輯門,可以在其內部規劃出多個與傳統小規模集成器件功能相當的模塊。另外,一般的 FPGA內部都有PLL倍頻和分頻電路模塊,這樣可以在外部采用較低頻率的晶振而在內部獲得較高頻率的時鐘,進一步解決了
電磁干擾和電磁兼容問題。
1 步進電機的工作原理
步進電動機是一種自動化執行部件,和數字系統結合可把脈沖數轉換成角位移,實現其正轉、反轉、手動和自動控制。四相步進電機有兩組線圈A和B。A,B兩組垂直擺放線圈的電流方向的排列組合,最多可以產生8種磁場方向,分別是0°,45°,90°,135°,180°,225°,270°,315°。表1給出了四相步進電機的8個方向和電流以及電壓信號的關系。
四相電動機有3種激磁方式:
一相激磁法:當目標角度是90°的整數倍時,采用這種方法。
二相激磁法:當目標角度是45°,135°,225°,315°的整數倍時,采用這種方法。
一、二相激磁法:即完全按照表1所列的信號順序。

2 步進電機定位控制器的整體設計
步進電機定位控制器的系統主要由步進電機方向設定電路模塊、步進電機步進移動與定位控制模塊以及編碼輸出模塊構成。前兩個模塊完成電機旋轉方向設定、激磁方式和定位角度的換算等工作,后一模塊用于對換算后的角度量編碼輸出。系統框圖如圖1所示。

2.1 步進電機定位控制器整體架構的VHDL語言設計及仿真
(1) 根據步進電機定位控制器的系統組成框圖可以定義輸入和輸出端口:
reset:IN STD_LOGIC;dir:IN STD_LOGIC;clk:IN STD_LOGIC;ini:IN STD_LOGIC;manner:IN STD_LOGIC_VECTOR (1 downto 0);angle:IN INTEGER range 255 downto 0;baBA:OUT STD_LOGIC_VECTOR (3 downto 0)
(2) 中間變量初始化定義如下:
signal count:INTEGER range 0 to 7;signal cntinc:INTEGER range-2 to 2; signal angleDnCount:INTEGER range 255 downto 0
(3) 步進電機定位控制器頂層電路的VHDL程序代碼:
在下面的程序中只考慮逆時針操作模式即(dir=0)。
begin
step_motor_direction:block--步進電機方向設定電路模塊
begin
process(dir,manner,angle)
begin
--if ini=′1′ then
cc<=conv_integer(manner);
if dir=′0′ then--逆時針方向旋轉
case cc is
when 1 =>--一相激勵
count<=0; cntini<=0; cntinc<=2;
angleDnCntDec<=2;--"10";
when 2 =>--二相激勵
count<=7; cntini<=-1; cntinc<=2;
angleDnCntDec<=2;--"10";
when 3 =>--一-二相激勵
count<=0; cntini<=0; cntinc<=1;
angleDnCntDec<=1;--"01";
when others => --manner="00" autodetect
if (angle rem 2) =1 then--二相激勵
count<=7; cntini<=-1; cntinc<=2;
angleDnCntDec<=2;--"10";
else--一相激勵
count<=0; cntini<=0; cntinc<=2;
angleDnCntDec<=2;--"10";
end if;--angle
end case;--manner
end process;
step_motor_moving:block--步進電機步進移動與定位控制模塊
counting_reset: process(reset,ini,angle,clk)
begin
if reset=′1′ then
count<=0;angleDnCount<=0;
elsif clk′event and clk=′1′ then
if ini=′0′ then
count<=0+cntini; angleDnCount<=angle;
else
count <= count+cntinc;
if angleDnCount> angleDnCntDec then
angleDnCount<=angleDnCount-angleDnCntDec;
else
angleDnCount <= 0;
end if;
end if;
end if;
end process;
table_mapping:block--編碼輸出模塊
baBA<="0000" when angleDnCount=0 else
"0001" when count=0 else
"0011" when count=1 else
"0010" when count=2 else
"0110" when count=3 else
"0100" when count=4 else
"1100" when count=5 else
"1000" when count=6 else
"1001";when count>=7;
end stepmotor_arch;
2.2 步進電機方向電路模塊設計
該模塊的功能是設定步進電機的旋轉方向(順/逆時針轉動),并設定電動機在順/逆時針時所需的初值與累加/減值。給出逆時針操作模式的技術規則和仿真輸出(ini=0賦初值,ini=1時開始計數)。
如果manner=00,這時進行自動判斷,若angle步進角為偶數(角度設定可以被90整除)電路使用一相激磁法,則count的初始值為000(cntini<=0),每次加2;否則電路使用二相激磁法,count的初始值為111(cntini<=111),每次加2;angleDnCntDec每次減2。得到的仿真結果如圖2所示。
表2是模塊按不同勵磁方式輸出時各個初值以及累加/減值的設定真值表。

2.3 步進電機移動與定位控制模塊設計
該模塊的主要功能是利用賦初值ini將數值傳到該模塊中并配合輸入的clk作為同步控制信號,進行步進電機的步進移動與定位控制。步進電機定位功能通過一個減法器實現:在每個clk脈沖上升沿,設定步進角倍數,angleDnCount減去不同激磁方式下設定的累加器計數值angleDnCntDec,判斷差值小于設定的累減計數時,步進電機旋轉到預定角度停止輸出驅動端口信號,來實現定位功能。
2.4 編碼輸出模塊
該模塊的主要功能是將count與angleDnCount產生的數值經過編碼,再通過baBA輸出到步進電機,來對電機進行控制。模塊仿真圖見圖2。
假設reset=1,則將count和angleDnCount設置成0。
假設reset=0,clk為上升沿觸發且ini=0時,就將設定的初值(cntini與angle)賦給count和angleDnCount兩個信號端,也就是(count<=0+cntini)與(angleDnCount<=angle)。
假設reset=0,clk為上升沿觸發且ini=1時,則將count與cntini相加,再將結果存為count。然后判斷angleDnCount的值是否大于angleDnCntDec。如果大于,則用angleDnCount減angleDnCntDec,將結果存為angleDnCount;否則,將angleDnCount設為0(因為此時angleDnCount的值小于angleDnCntDec,表示電機已經到達設定位置,故不需要繼續轉動了)。BaBA [3..0]是將count與angleDnCount產生的數值經過編碼后輸出到四相步進電機的端口的。
3 Quartus Ⅱ仿真結果
上述程序在ALTERA公司免費提供的Quartus Ⅱ環境下編譯通過,適配的FPGA器件為FLEX10K10。最后得到的系統仿真圖及生成的系統模塊符號圖分別如圖3,圖4所示。

reset是系統內部自復位信號;dir是步進電機正反轉的方向控制;clk是由外部提供的時鐘信號;ini是賦初值的使能開關;manner[1..0]是激磁方式的選擇開關(00:自動檢測角度輸入,決定激磁方式;01:一相激磁;10:二相激磁;11:一、二相激磁);angle[7..0]是步進角的倍數設定數如引腳;baBA[3..0]是系統輸出信號引腳,是內部計數器的count[3..0]數值編碼的結果。
4 結 語
步進電機作為一種數字伺服執行元件,具有結構簡單,運行可靠,控制方便,控制性能好等優點,但現實中步進電機的控制比較復雜。
這里設計的步進電機控制器方法簡單,支持四相步進電機的三種勵磁方式、正反轉運行,這種基于 FPGA的設計方法,可以加速同類型產品的開發速度,節約投資。并且可以根據步進電機的不同,改變分層模塊的VHDL程序的參數,實現不同型號步進電機的控制,在實際應用中有利于步進電機的廣泛應用。
參考文獻
[1]潘松,黃繼業.EDA技術實用教程[M].北京:科學出版社,2002.
[2]楊渝欽.控制電機[M].2版.北京:機械工業出版社,1999.
[3]朱明程.可編程邏輯系統的VHDL設計技術[M].南京:東南大學出版社,1998.
[4]任曉東,文博.CPLD/FPGA 高級應用開發指南[M].北京:電子工業出版社,2003.
[5]曾繁泰,陳美金.VHDL程序設計[M].北京:清華大學出版社,2001.
[6]馬宏偉.高性能步進電機控制系統的研制[M].西安:西安科技大學出版社,2004.
[7]盧毅,賴杰.VHDL與數字電路設計[M].北京:科學出版社,2001.
[8]朱正偉.EDA技術及應用[M].北京:清華大學出版社,2005.
[9]劉寶廷,程樹康.步進電動機及其驅動控制系統[M].哈爾濱:哈爾濱工業大學出版社,1997.
[10]宋錦河.步進電機控制系統的快速實現[J].鄂州大學學報,2004(4):5-8.
作者簡介
潘 濤 男,1984年出生,武漢科技大學信息學院在讀碩士研究生。現從事模式識別與智能系統的研究。
程耕國 男,1947年出生,武漢科技大學自動化系教授,博士。研究方向為智能材料,機電一體化和自動控制系統研究與設計等。