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