摘 要: 在分析步進電機內(nèi)部結(jié)構(gòu)和工作原理的基礎上,,介紹了步進電機控制器邏輯設計思路,。控制芯片選用ALTERA公司的高性價比,、專用大規(guī)模集成電路芯片EPM240T100,,實現(xiàn)了步進電機控制系統(tǒng)。
關鍵詞: ASIC,;VHDL,;步進電機,;狀態(tài)機
隨著工業(yè)自動化程度的逐步提高,步進電機作為工業(yè)過程控制及儀表中常用的控制元件之一,,已廣泛應用到醫(yī)療,、工業(yè)、精密儀器儀表,、光學測量等相關行業(yè),。步進電機的控制器主要采用單片機MCU、DSP和可編程邏輯器PLD[1]來實現(xiàn),。鑒于單片機和DSP具有開發(fā)周期長,、成本高的特點,同時考慮開發(fā)者對內(nèi)部硬件結(jié)構(gòu)和速度的依賴性,,因此選擇通用,、高效的ASIC芯片,并采用硬件描述語言來開發(fā)系統(tǒng),。
1 系統(tǒng)工作原理
1.1 步進電機結(jié)構(gòu)及原理
步進電機作為執(zhí)行元件,,是機電一體化的關鍵產(chǎn)品之一, 廣泛應用在各種自動化控制系統(tǒng)中。隨著微電子和計算機技術的發(fā)展,,步進電機的需求量與日俱增,,在各個國民經(jīng)濟領域都有應用。步進電機是一種將電脈沖轉(zhuǎn)化為角位移的執(zhí)行機構(gòu),,配以一定的機械裝置可以應用于直線控制,、弧度控制等應用領域。當步進驅(qū)動器接收到一個脈沖信號時,,即按設定的方向轉(zhuǎn)動一個固定的角度(稱為“步距角”),,其旋轉(zhuǎn)是以固定的角度一步一步運行的??梢酝ㄟ^控制脈沖個數(shù)來控制角位移量,,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制電機轉(zhuǎn)動的速度和加速度,,從而達到調(diào)速的目的,。步進電機可以作為一種控制用的特種電機,利用其沒有積累誤差(精度為100%)的特點,,廣泛應用于各種開環(huán)控制[2],,下面以三相步進電機為例來分析原理和控制器的設計過程[3]。
三相步進電機根據(jù)輸出的轉(zhuǎn)數(shù),、力矩及平穩(wěn)性有3種不同的工作方式,,即單三拍、雙三拍和混六拍。分別以A,、B,、C表示步進電機的輸出三個繞組對,單三拍表示為A→B→C→A,,雙三拍表示為AB→BC→CA→AB,,混六拍表示為A→AB→B→BC→C→CA→A。由于三種方式的差異只在于控制的相數(shù)和狀態(tài)的個數(shù)不同,,因此其他相數(shù)的步進電機可以同此分類,。本設計以三相六拍步進電機的控制為例,其結(jié)構(gòu)原理圖如圖1所示,。
任一相繞組通電,,便形成一組定子磁極,其方向即圖中所示的NS極,。在定子的每個磁極上(即定子鐵心上的每個齒上)又開了5個小齒,,齒槽等寬,齒間夾角為9°,。轉(zhuǎn)子上沒有繞組,,只有均勻分布的40個小齒,齒槽也是等寬的,,齒間夾角也是9°,,與磁極上的小齒一致。此外,,三相定子磁極上的小齒在空間位置上依次錯開1/3齒距,,如圖2所示。當A相磁極上的小齒與轉(zhuǎn)子上的小齒對齊時,,B相磁極上的齒剛好超前(或滯后)轉(zhuǎn)子齒1/3齒距角,C相磁極齒超前(或滯后)轉(zhuǎn)子齒2/3齒距角,。由此可見,,錯齒是使得步進電機旋轉(zhuǎn)的原因。
時鐘發(fā)生電路中由晶體振蕩器產(chǎn)生時鐘信號,,頻率要穩(wěn)定,,其穩(wěn)定度決定步進電機的精準度。電路產(chǎn)生3個不同頻率的時鐘,,即3 MHz的掃描時鐘,、9 kHz的電機轉(zhuǎn)速控制時鐘和1 kHz的取樣時鐘[4-5],分別應用于不同的部分,。
控制信號產(chǎn)生電路主要是在1 kHz的取樣時鐘內(nèi),,對3 MHz的掃描時鐘進行按鍵觸發(fā)、按鍵消抖、按鍵編碼和按鍵功能等,。
環(huán)形脈沖分配電路主要完成對電機工作方式的控制,。可以采用狀態(tài)機來設計電機的工作模式,,如果是三相步進電機,,則可以設計為單三拍、雙三拍或混六拍的工作方式,。
光耦隔離驅(qū)動電路主要完成步進電機的驅(qū)動,。由于步進電機的繞組電流較大,為防止電機的頻繁啟停等對ASIC芯片的影響,,在輸出端加上光電耦合器和達林頓驅(qū)動電路,。
本設計中脈沖時鐘發(fā)生電路、光耦隔離驅(qū)動電路和步進電機為EPM240T100片外硬件設計,,控制信號產(chǎn)生電路和環(huán)形脈沖分配電路為片上硬件設計,,采用VHDL語言來完成。其硬件和軟件資源規(guī)劃分配圖如圖4所示,。
EPM240T100芯片具有192個宏單元和80個用戶可用的引腳,,最快速度可以達到4.7 ns。
2 軟件設計
軟件設計采用VHDL語言實現(xiàn),,四大功能模塊程序設計如下,。
2.1 分頻計數(shù)器模塊
分頻計數(shù)器模塊主要產(chǎn)生3 MHz掃描時鐘、9 kHz步進電機調(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ù)按鍵輸入的不同設置按鍵的各種功能,,從而產(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)形脈沖分配模塊
本模塊主要針對控制信號完成步進電機不同功能的輸出,包括速度,、相數(shù)和拍數(shù),,設計過程使用狀態(tài)機來完成。程序代碼略,。
3 仿真及調(diào)試
為了確保設計的正確性,、降低硬件設計成本和調(diào)試難度,對整個設計進行了仿真,結(jié)果如圖5所示,。
本設計中的步進電機控制器所有程序都在Quartus II 上通過了軟件仿真,,并制作了實際的硬件板。在實際使用時應根據(jù)步進電機負載和轉(zhuǎn)速來選擇步進電機和設計驅(qū)動電路,以防步進電機因失步而導致的控制精度不準確,。經(jīng)測試,,硬件電路板運行可靠、控制方便,,且控制性能良好,。本設計的步進電機控制器方法簡單,支持多相步進電機的三種勵磁方式,,具有啟動停止,、正反轉(zhuǎn)運行、單步連續(xù),、加速減速等多種控制功能,。
參考文獻
[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] 趙俊超.集成電路設計VHDL教程[M].北京:北京希望電子出版社,,2002.
[4] 王海華,,宋蕾.基于CPLD的步進電機控制器設計[J].微計算機信息,2008,,24(10):99-100.
[5] 馬宏偉.高性能步進電機控制系統(tǒng)的研制[M].西安:西安科技大學出版社,,2004.