潘 濤 程耕國(guó)
摘 要:介紹基于FPGA的步進(jìn)電機(jī)控制器的設(shè)計(jì),在分析步進(jìn)電機(jī)的工作原理的基礎(chǔ)上,給出了層次化設(shè)計(jì)方案與VHDL程序,并利用Quartus Ⅱ進(jìn)行了仿真并給出了仿真結(jié)果。它以FPGA作為核心器件,極大地減少了外圍元件的使用。同時(shí),采用VHDL語言控制可以根據(jù)步進(jìn)電機(jī)的不同,改變模塊程序的參數(shù)就可以實(shí)現(xiàn)不同型號(hào)步進(jìn)電機(jī)的控制,有利于步進(jìn)電機(jī)的廣泛應(yīng)用。
關(guān)鍵詞:步進(jìn)電機(jī);控制器;現(xiàn)場(chǎng)可編程邏輯門陣列;硬件描述語言
中圖分類號(hào):TP29 文獻(xiàn)標(biāo)識(shí)碼:B
文章編號(hào):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 引 言
隨著步進(jìn)電機(jī)廣泛地應(yīng)用于數(shù)字控制系統(tǒng)中作為伺服元件,步進(jìn)電機(jī)在實(shí)時(shí)性和靈活性等性能上的要求越來越高。那么如何靈活、有效地控制步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)成為研究的主要方向。這里采用現(xiàn)場(chǎng)可編程邏輯門陣列(Field Programmable Gate Array,FPGA),通過VHDL語言編程來實(shí)現(xiàn)四相步進(jìn)電機(jī)的控制。利用FPGA設(shè)計(jì)具有以下優(yōu)點(diǎn):
硬件設(shè)計(jì)軟件化 FPGA的開發(fā)在功能層面上可以脫離硬件在EDA軟件上做軟仿真。當(dāng)功能確定無誤后可以進(jìn)行硬件電路板的設(shè)計(jì)。最后將設(shè)計(jì)好的,由EDA軟件生成的燒寫文件下載到配置設(shè)備中去,進(jìn)行在線調(diào)試,如果這時(shí)的結(jié)果與要求不一致,可以立即更改設(shè)計(jì)軟件,并再次燒寫到配置芯片中而不必改動(dòng)外接硬件電路。進(jìn)行分層模塊設(shè)計(jì)后系統(tǒng)設(shè)計(jì)變得更加簡(jiǎn)單,在實(shí)時(shí)性和靈活性等性能上都有很大的提高,有利于步進(jìn)電機(jī)的運(yùn)動(dòng)控制。
高度集成化,高工作頻率 一般的FPGA內(nèi)部都集成有上百萬的邏輯門,可以在其內(nèi)部規(guī)劃出多個(gè)與傳統(tǒng)小規(guī)模集成器件功能相當(dāng)?shù)哪K。另外,一般的 FPGA內(nèi)部都有PLL倍頻和分頻電路模塊,這樣可以在外部采用較低頻率的晶振而在內(nèi)部獲得較高頻率的時(shí)鐘,進(jìn)一步解決了
電磁干擾和電磁兼容問題。
1 步進(jìn)電機(jī)的工作原理
步進(jìn)電動(dòng)機(jī)是一種自動(dòng)化執(zhí)行部件,和數(shù)字系統(tǒng)結(jié)合可把脈沖數(shù)轉(zhuǎn)換成角位移,實(shí)現(xiàn)其正轉(zhuǎn)、反轉(zhuǎn)、手動(dòng)和自動(dòng)控制。四相步進(jìn)電機(jī)有兩組線圈A和B。A,B兩組垂直擺放線圈的電流方向的排列組合,最多可以產(chǎn)生8種磁場(chǎng)方向,分別是0°,45°,90°,135°,180°,225°,270°,315°。表1給出了四相步進(jìn)電機(jī)的8個(gè)方向和電流以及電壓信號(hào)的關(guān)系。
四相電動(dòng)機(jī)有3種激磁方式:
一相激磁法:當(dāng)目標(biāo)角度是90°的整數(shù)倍時(shí),采用這種方法。
二相激磁法:當(dāng)目標(biāo)角度是45°,135°,225°,315°的整數(shù)倍時(shí),采用這種方法。
一、二相激磁法:即完全按照表1所列的信號(hào)順序。
2 步進(jìn)電機(jī)定位控制器的整體設(shè)計(jì)
步進(jìn)電機(jī)定位控制器的系統(tǒng)主要由步進(jìn)電機(jī)方向設(shè)定電路模塊、步進(jìn)電機(jī)步進(jìn)移動(dòng)與定位控制模塊以及編碼輸出模塊構(gòu)成。前兩個(gè)模塊完成電機(jī)旋轉(zhuǎn)方向設(shè)定、激磁方式和定位角度的換算等工作,后一模塊用于對(duì)換算后的角度量編碼輸出。系統(tǒng)框圖如圖1所示。
2.1 步進(jìn)電機(jī)定位控制器整體架構(gòu)的VHDL語言設(shè)計(jì)及仿真
(1) 根據(jù)步進(jìn)電機(jī)定位控制器的系統(tǒng)組成框圖可以定義輸入和輸出端口:
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) 步進(jìn)電機(jī)定位控制器頂層電路的VHDL程序代碼:
在下面的程序中只考慮逆時(shí)針操作模式即(dir=0)。
begin
step_motor_direction:block--步進(jìn)電機(jī)方向設(shè)定電路模塊
begin
process(dir,manner,angle)
begin
--if ini=′1′ then
cc<=conv_integer(manner);
if dir=′0′ then--逆時(shí)針方向旋轉(zhuǎn)
case cc is
when 1 =>--一相激勵(lì)
count<=0; cntini<=0; cntinc<=2;
angleDnCntDec<=2;--"10";
when 2 =>--二相激勵(lì)
count<=7; cntini<=-1; cntinc<=2;
angleDnCntDec<=2;--"10";
when 3 =>--一-二相激勵(lì)
count<=0; cntini<=0; cntinc<=1;
angleDnCntDec<=1;--"01";
when others => --manner="00" autodetect
if (angle rem 2) =1 then--二相激勵(lì)
count<=7; cntini<=-1; cntinc<=2;
angleDnCntDec<=2;--"10";
else--一相激勵(lì)
count<=0; cntini<=0; cntinc<=2;
angleDnCntDec<=2;--"10";
end if;--angle
end case;--manner
end process;
step_motor_moving:block--步進(jìn)電機(jī)步進(jìn)移動(dòng)與定位控制模塊
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 步進(jìn)電機(jī)方向電路模塊設(shè)計(jì)
該模塊的功能是設(shè)定步進(jìn)電機(jī)的旋轉(zhuǎn)方向(順/逆時(shí)針轉(zhuǎn)動(dòng)),并設(shè)定電動(dòng)機(jī)在順/逆時(shí)針時(shí)所需的初值與累加/減值。給出逆時(shí)針操作模式的技術(shù)規(guī)則和仿真輸出(ini=0賦初值,ini=1時(shí)開始計(jì)數(shù))。
如果manner=00,這時(shí)進(jìn)行自動(dòng)判斷,若angle步進(jìn)角為偶數(shù)(角度設(shè)定可以被90整除)電路使用一相激磁法,則count的初始值為000(cntini<=0),每次加2;否則電路使用二相激磁法,count的初始值為111(cntini<=111),每次加2;angleDnCntDec每次減2。得到的仿真結(jié)果如圖2所示。
表2是模塊按不同勵(lì)磁方式輸出時(shí)各個(gè)初值以及累加/減值的設(shè)定真值表。
2.3 步進(jìn)電機(jī)移動(dòng)與定位控制模塊設(shè)計(jì)
該模塊的主要功能是利用賦初值ini將數(shù)值傳到該模塊中并配合輸入的clk作為同步控制信號(hào),進(jìn)行步進(jìn)電機(jī)的步進(jìn)移動(dòng)與定位控制。步進(jìn)電機(jī)定位功能通過一個(gè)減法器實(shí)現(xiàn):在每個(gè)clk脈沖上升沿,設(shè)定步進(jìn)角倍數(shù),angleDnCount減去不同激磁方式下設(shè)定的累加器計(jì)數(shù)值angleDnCntDec,判斷差值小于設(shè)定的累減計(jì)數(shù)時(shí),步進(jìn)電機(jī)旋轉(zhuǎn)到預(yù)定角度停止輸出驅(qū)動(dòng)端口信號(hào),來實(shí)現(xiàn)定位功能。
2.4 編碼輸出模塊
該模塊的主要功能是將count與angleDnCount產(chǎn)生的數(shù)值經(jīng)過編碼,再通過baBA輸出到步進(jìn)電機(jī),來對(duì)電機(jī)進(jìn)行控制。模塊仿真圖見圖2。
假設(shè)reset=1,則將count和angleDnCount設(shè)置成0。
假設(shè)reset=0,clk為上升沿觸發(fā)且ini=0時(shí),就將設(shè)定的初值(cntini與angle)賦給count和angleDnCount兩個(gè)信號(hào)端,也就是(count<=0+cntini)與(angleDnCount<=angle)。
假設(shè)reset=0,clk為上升沿觸發(fā)且ini=1時(shí),則將count與cntini相加,再將結(jié)果存為count。然后判斷angleDnCount的值是否大于angleDnCntDec。如果大于,則用angleDnCount減angleDnCntDec,將結(jié)果存為angleDnCount;否則,將angleDnCount設(shè)為0(因?yàn)榇藭r(shí)angleDnCount的值小于angleDnCntDec,表示電機(jī)已經(jīng)到達(dá)設(shè)定位置,故不需要繼續(xù)轉(zhuǎn)動(dòng)了)。BaBA [3..0]是將count與angleDnCount產(chǎn)生的數(shù)值經(jīng)過編碼后輸出到四相步進(jìn)電機(jī)的端口的。
3 Quartus Ⅱ仿真結(jié)果
上述程序在ALTERA公司免費(fèi)提供的Quartus Ⅱ環(huán)境下編譯通過,適配的FPGA器件為FLEX10K10。最后得到的系統(tǒng)仿真圖及生成的系統(tǒng)模塊符號(hào)圖分別如圖3,圖4所示。
reset是系統(tǒng)內(nèi)部自復(fù)位信號(hào);dir是步進(jìn)電機(jī)正反轉(zhuǎn)的方向控制;clk是由外部提供的時(shí)鐘信號(hào);ini是賦初值的使能開關(guān);manner[1..0]是激磁方式的選擇開關(guān)(00:自動(dòng)檢測(cè)角度輸入,決定激磁方式;01:一相激磁;10:二相激磁;11:一、二相激磁);angle[7..0]是步進(jìn)角的倍數(shù)設(shè)定數(shù)如引腳;baBA[3..0]是系統(tǒng)輸出信號(hào)引腳,是內(nèi)部計(jì)數(shù)器的count[3..0]數(shù)值編碼的結(jié)果。
4 結(jié) 語
步進(jìn)電機(jī)作為一種數(shù)字伺服執(zhí)行元件,具有結(jié)構(gòu)簡(jiǎn)單,運(yùn)行可靠,控制方便,控制性能好等優(yōu)點(diǎn),但現(xiàn)實(shí)中步進(jìn)電機(jī)的控制比較復(fù)雜。
這里設(shè)計(jì)的步進(jìn)電機(jī)控制器方法簡(jiǎn)單,支持四相步進(jìn)電機(jī)的三種勵(lì)磁方式、正反轉(zhuǎn)運(yùn)行,這種基于 FPGA的設(shè)計(jì)方法,可以加速同類型產(chǎn)品的開發(fā)速度,節(jié)約投資。并且可以根據(jù)步進(jìn)電機(jī)的不同,改變分層模塊的VHDL程序的參數(shù),實(shí)現(xiàn)不同型號(hào)步進(jìn)電機(jī)的控制,在實(shí)際應(yīng)用中有利于步進(jìn)電機(jī)的廣泛應(yīng)用。
參考文獻(xiàn)
[1]潘松,黃繼業(yè).EDA技術(shù)實(shí)用教程[M].北京:科學(xué)出版社,2002.
[2]楊渝欽.控制電機(jī)[M].2版.北京:機(jī)械工業(yè)出版社,1999.
[3]朱明程.可編程邏輯系統(tǒng)的VHDL設(shè)計(jì)技術(shù)[M].南京:東南大學(xué)出版社,1998.
[4]任曉東,文博.CPLD/FPGA 高級(jí)應(yīng)用開發(fā)指南[M].北京:電子工業(yè)出版社,2003.
[5]曾繁泰,陳美金.VHDL程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2001.
[6]馬宏偉.高性能步進(jìn)電機(jī)控制系統(tǒng)的研制[M].西安:西安科技大學(xué)出版社,2004.
[7]盧毅,賴杰.VHDL與數(shù)字電路設(shè)計(jì)[M].北京:科學(xué)出版社,2001.
[8]朱正偉.EDA技術(shù)及應(yīng)用[M].北京:清華大學(xué)出版社,2005.
[9]劉寶廷,程樹康.步進(jìn)電動(dòng)機(jī)及其驅(qū)動(dòng)控制系統(tǒng)[M].哈爾濱:哈爾濱工業(yè)大學(xué)出版社,1997.
[10]宋錦河.步進(jìn)電機(jī)控制系統(tǒng)的快速實(shí)現(xiàn)[J].鄂州大學(xué)學(xué)報(bào),2004(4):5-8.
作者簡(jiǎn)介
潘 濤 男,1984年出生,武漢科技大學(xué)信息學(xué)院在讀碩士研究生。現(xiàn)從事模式識(shí)別與智能系統(tǒng)的研究。
程耕國(guó) 男,1947年出生,武漢科技大學(xué)自動(dòng)化系教授,博士。研究方向?yàn)橹悄懿牧?機(jī)電一體化和自動(dòng)控制系統(tǒng)研究與設(shè)計(jì)等。