摘 要: 在分析步進(jìn)電機(jī)內(nèi)部結(jié)構(gòu)和工作原理的基礎(chǔ)上,介紹了步進(jìn)電機(jī)控制器邏輯設(shè)計思路??刂菩酒x用ALTERA公司的高性價比、專用大規(guī)模集成電路芯片EPM240T100,實現(xiàn)了步進(jìn)電機(jī)控制系統(tǒng)。
關(guān)鍵詞: ASIC;VHDL;步進(jìn)電機(jī);狀態(tài)機(jī)
隨著工業(yè)自動化程度的逐步提高,步進(jìn)電機(jī)作為工業(yè)過程控制及儀表中常用的控制元件之一,已廣泛應(yīng)用到醫(yī)療、工業(yè)、精密儀器儀表、光學(xué)測量等相關(guān)行業(yè)。步進(jìn)電機(jī)的控制器主要采用單片機(jī)MCU、DSP和可編程邏輯器PLD[1]來實現(xiàn)。鑒于單片機(jī)和DSP具有開發(fā)周期長、成本高的特點,同時考慮開發(fā)者對內(nèi)部硬件結(jié)構(gòu)和速度的依賴性,因此選擇通用、高效的ASIC芯片,并采用硬件描述語言來開發(fā)系統(tǒng)。
1 系統(tǒng)工作原理
1.1 步進(jìn)電機(jī)結(jié)構(gòu)及原理
步進(jìn)電機(jī)作為執(zhí)行元件,是機(jī)電一體化的關(guān)鍵產(chǎn)品之一, 廣泛應(yīng)用在各種自動化控制系統(tǒng)中。隨著微電子和計算機(jī)技術(shù)的發(fā)展,步進(jìn)電機(jī)的需求量與日俱增,在各個國民經(jīng)濟(jì)領(lǐng)域都有應(yīng)用。步進(jìn)電機(jī)是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機(jī)構(gòu),配以一定的機(jī)械裝置可以應(yīng)用于直線控制、弧度控制等應(yīng)用領(lǐng)域。當(dāng)步進(jìn)驅(qū)動器接收到一個脈沖信號時,即按設(shè)定的方向轉(zhuǎn)動一個固定的角度(稱為“步距角”),其旋轉(zhuǎn)是以固定的角度一步一步運(yùn)行的。可以通過控制脈沖個數(shù)來控制角位移量,從而達(dá)到準(zhǔn)確定位的目的;同時可以通過控制脈沖頻率來控制電機(jī)轉(zhuǎn)動的速度和加速度,從而達(dá)到調(diào)速的目的。步進(jìn)電機(jī)可以作為一種控制用的特種電機(jī),利用其沒有積累誤差(精度為100%)的特點,廣泛應(yīng)用于各種開環(huán)控制[2],下面以三相步進(jìn)電機(jī)為例來分析原理和控制器的設(shè)計過程[3]。
三相步進(jìn)電機(jī)根據(jù)輸出的轉(zhuǎn)數(shù)、力矩及平穩(wěn)性有3種不同的工作方式,即單三拍、雙三拍和混六拍。分別以A、B、C表示步進(jìn)電機(jī)的輸出三個繞組對,單三拍表示為A→B→C→A,雙三拍表示為AB→BC→CA→AB,混六拍表示為A→AB→B→BC→C→CA→A。由于三種方式的差異只在于控制的相數(shù)和狀態(tài)的個數(shù)不同,因此其他相數(shù)的步進(jìn)電機(jī)可以同此分類。本設(shè)計以三相六拍步進(jìn)電機(jī)的控制為例,其結(jié)構(gòu)原理圖如圖1所示。
任一相繞組通電,便形成一組定子磁極,其方向即圖中所示的NS極。在定子的每個磁極上(即定子鐵心上的每個齒上)又開了5個小齒,齒槽等寬,齒間夾角為9°。轉(zhuǎn)子上沒有繞組,只有均勻分布的40個小齒,齒槽也是等寬的,齒間夾角也是9°,與磁極上的小齒一致。此外,三相定子磁極上的小齒在空間位置上依次錯開1/3齒距,如圖2所示。當(dāng)A相磁極上的小齒與轉(zhuǎn)子上的小齒對齊時,B相磁極上的齒剛好超前(或滯后)轉(zhuǎn)子齒1/3齒距角,C相磁極齒超前(或滯后)轉(zhuǎn)子齒2/3齒距角。由此可見,錯齒是使得步進(jìn)電機(jī)旋轉(zhuǎn)的原因。
時鐘發(fā)生電路中由晶體振蕩器產(chǎn)生時鐘信號,頻率要穩(wěn)定,其穩(wěn)定度決定步進(jìn)電機(jī)的精準(zhǔn)度。電路產(chǎn)生3個不同頻率的時鐘,即3 MHz的掃描時鐘、9 kHz的電機(jī)轉(zhuǎn)速控制時鐘和1 kHz的取樣時鐘[4-5],分別應(yīng)用于不同的部分。
控制信號產(chǎn)生電路主要是在1 kHz的取樣時鐘內(nèi),對3 MHz的掃描時鐘進(jìn)行按鍵觸發(fā)、按鍵消抖、按鍵編碼和按鍵功能等。
環(huán)形脈沖分配電路主要完成對電機(jī)工作方式的控制??梢圆捎?a class="innerlink" href="http://theprogrammingfactory.com/tags/狀態(tài)機(jī)" title="狀態(tài)機(jī)" target="_blank">狀態(tài)機(jī)來設(shè)計電機(jī)的工作模式,如果是三相步進(jìn)電機(jī),則可以設(shè)計為單三拍、雙三拍或混六拍的工作方式。
光耦隔離驅(qū)動電路主要完成步進(jìn)電機(jī)的驅(qū)動。由于步進(jìn)電機(jī)的繞組電流較大,為防止電機(jī)的頻繁啟停等對ASIC芯片的影響,在輸出端加上光電耦合器和達(dá)林頓驅(qū)動電路。
本設(shè)計中脈沖時鐘發(fā)生電路、光耦隔離驅(qū)動電路和步進(jìn)電機(jī)為EPM240T100片外硬件設(shè)計,控制信號產(chǎn)生電路和環(huán)形脈沖分配電路為片上硬件設(shè)計,采用VHDL語言來完成。其硬件和軟件資源規(guī)劃分配圖如圖4所示。
EPM240T100芯片具有192個宏單元和80個用戶可用的引腳,最快速度可以達(dá)到4.7 ns。
2 軟件設(shè)計
軟件設(shè)計采用VHDL語言實現(xiàn),四大功能模塊程序設(shè)計如下。
2.1 分頻計數(shù)器模塊
分頻計數(shù)器模塊主要產(chǎn)生3 MHz掃描時鐘、9 kHz步進(jìn)電機(jī)調(diào)速時鐘和1 kHz取樣時鐘輸出,程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity dev_count is
port(
clk: in std_logic;-- 3mhz clock
clk_3m : out std_logic;--count
clk_1k: out std_logic;
clk_9k: out std_logic);
end dev_count;
architecture behavior of dev_count is
signal qscan : std_logic_vector(20 downto 0);
begin
scan_1 :process(clk)
begin
if (clk'event and clk='1') then
qscan<=qscan+1;
end if;
end process;
clk_3m<=qscan(0);
clk_9k<=qscan(9);
clk_1k<=qscan(13);
end behavior;
2.2 按鍵掃描觸發(fā)消抖編碼模塊
本模塊主要實現(xiàn)按鍵掃描、延時消抖和編碼譯碼功能,部分程序如下:
library ieee;
use ieee.std_logic_1164.all;
library work;
entity key4_4 is
port (
clk_3m : in std_logic;
clk_1k : in std_logic;
col : in std_logic _vector(7 downto 0);
key_valid : out std_logic;
butt_code : out std_logic_vector(3 downto 0));
end key4_4;
architecture bdf_type of key4_4 is
component key_scan
port(col : in std_logic_vector (7 downto 0);
scan_cnt : in std_logic_vector (2 downto 0);
key_pressed : out std_logic );
end component;
component debounce
port(key_pressed : in std_logic;
clk_3m : in std_logic;
clk_1k : in std_logic;
key_valid :out std_logic; );
end component;
component scan_count
port(clk_3m : in std_logic;
clk_1k : in std_logic;
key_pressed : in std_logic;
scan_cnt : out std_logic_vector (2 downto 0) );
end component;
component code_tran
port(clk_3m : in std_logic;
key_valid : in std_logic;
scan_cnt : in std_logic_ vector (2 downto 0);
butt_code : out std_logic_ vector (3 downto 0) );
end component;
signal synthesized_wire_5 : std_logic_ vector (2 downto 0);
signal synthesized_wire_6 : std_logic;
signal synthesized_wire_3 : std_logic;
begin
key_valid <= synthesized_wire_3;
b2v_inst : key_scan
port map (col => col,
scan_cnt => synthesized_wire_5,
key_pressed => synthesized_wire_6);
b2v_inst10 : debounce
port map (key_pressed => synthesized_wire_6,
clk_3m => clk_3m,
clk_1k => clk_1k,
key_valid => synthesized_wire_3);
b2v_inst12 : scan_count
port map (clk_3m => clk_3m,
clk_1k => clk_1k,
key_pressed => synthesized_wire_6,
scan_cnt => synthesized_wire_5);
b2v_inst13 : code_tran
port map(clk_3m => clk_3m,
key_valid => synthesized_wire_3,
scan_cnt => synthesized_wire_5,
butt_code => butt_code);
end;
2.3 控制信號產(chǎn)生模塊
本模塊主要功能是根據(jù)按鍵輸入的不同設(shè)置按鍵的各種功能,從而產(chǎn)生各種控制信號,如啟動停止、正轉(zhuǎn)反轉(zhuǎn)、連續(xù)單步和加減調(diào)速等。程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity key_f is
port(
key: in std_logic_vector(3 downto 0);
key_valid:in std_logic;
start_stop: out std_logic;
step_p: out std_logic;
np:out std_logic;
up_down:out std_logic_vector(2 downto 0)
);
end key_f;
architecture a of key_f is
signal up_down_f:std_logic_vector(2 downto 0);
signal np_f:std_logic;
signal step_p_f:std_logic;
signal start_stop_f:std_logic;
begin
process(key_valid)
begin
if key_valid'event and key_valid='0' then
case key is
when"0000"=>
start_stop_f<=not start_stop_f;
when"0001"=>
if up_down_f<"111" then
up_down_f<=up_down_f+1;
end if;
when"0010"=>
if up_down_f>"000" then
up_down_f<=up_down_f-1;
end if;
when"0011"=>
step_p_f<=not step_p_f;
when"0100"=>
np_f<=not np_f;
when others=>
end case;
end if;
end process;
start_stop<=start_stop_f;
step_p<=step_p_f;
np<=np_f;
up_down<=up_down_f;
end a;
2.4 環(huán)形脈沖分配模塊
本模塊主要針對控制信號完成步進(jìn)電機(jī)不同功能的輸出,包括速度、相數(shù)和拍數(shù),設(shè)計過程使用狀態(tài)機(jī)來完成。程序代碼略。
3 仿真及調(diào)試
為了確保設(shè)計的正確性、降低硬件設(shè)計成本和調(diào)試難度,對整個設(shè)計進(jìn)行了仿真,結(jié)果如圖5所示。
本設(shè)計中的步進(jìn)電機(jī)控制器所有程序都在Quartus II 上通過了軟件仿真,并制作了實際的硬件板。在實際使用時應(yīng)根據(jù)步進(jìn)電機(jī)負(fù)載和轉(zhuǎn)速來選擇步進(jìn)電機(jī)和設(shè)計驅(qū)動電路,以防步進(jìn)電機(jī)因失步而導(dǎo)致的控制精度不準(zhǔn)確。經(jīng)測試,硬件電路板運(yùn)行可靠、控制方便,且控制性能良好。本設(shè)計的步進(jìn)電機(jī)控制器方法簡單,支持多相步進(jìn)電機(jī)的三種勵磁方式,具有啟動停止、正反轉(zhuǎn)運(yùn)行、單步連續(xù)、加速減速等多種控制功能。
參考文獻(xiàn)
[1] Zhang Xiaodong,He Junjun,Sheng Chunlei.An approach of microstepping control for the step motors based on FPGA[C].IEEE International Conference on Industrial Technology,2005:125-130.
[2] LE N Q,JEON J W.An open-loop stepper motor driver based on FPGA[C].ICCAS’07,International conference on Control,Automation and Systems,2007:17-20.
[3] 趙俊超.集成電路設(shè)計VHDL教程[M].北京:北京希望電子出版社,2002.
[4] 王海華,宋蕾.基于CPLD的步進(jìn)電機(jī)控制器設(shè)計[J].微計算機(jī)信息,2008,24(10):99-100.
[5] 馬宏偉.高性能步進(jìn)電機(jī)控制系統(tǒng)的研制[M].西安:西安科技大學(xué)出版社,2004.