摘 要: 在分析步进电机内部结构和工作原理的基础上,介绍了步进电机控制器逻辑设计思路。控制芯片选用ALTERA公司的高性价比、专用大规模集成电路芯片EPM240T100,实现了步进电机控制系统。
关键词: ASIC;VHDL;步进电机;状态机
随着工业自动化程度的逐步提高,步进电机作为工业过程控制及仪表中常用的控制元件之一,已广泛应用到医疗、工业、精密仪器仪表、光学测量等相关行业。步进电机的控制器主要采用单片机MCU、DSP和可编程逻辑器PLD[1]来实现。鉴于单片机和DSP具有开发周期长、成本高的特点,同时考虑开发者对内部硬件结构和速度的依赖性,因此选择通用、高效的ASIC芯片,并采用硬件描述语言来开发系统。
1 系统工作原理
1.1 步进电机结构及原理
步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。步进电机是一种将电脉冲转化为角位移的执行机构,配以一定的机械装置可以应用于直线控制、弧度控制等应用领域。当步进驱动器接收到一个脉冲信号时,即按设定的方向转动一个固定的角度(称为“步距角”),其旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。步进电机可以作为一种控制用的特种电机,利用其没有积累误差(精度为100%)的特点,广泛应用于各种开环控制[2],下面以三相步进电机为例来分析原理和控制器的设计过程[3]。
三相步进电机根据输出的转数、力矩及平稳性有3种不同的工作方式,即单三拍、双三拍和混六拍。分别以A、B、C表示步进电机的输出三个绕组对,单三拍表示为A→B→C→A,双三拍表示为AB→BC→CA→AB,混六拍表示为A→AB→B→BC→C→CA→A。由于三种方式的差异只在于控制的相数和状态的个数不同,因此其他相数的步进电机可以同此分类。本设计以三相六拍步进电机的控制为例,其结构原理图如图1所示。
任一相绕组通电,便形成一组定子磁极,其方向即图中所示的NS极。在定子的每个磁极上(即定子铁心上的每个齿上)又开了5个小齿,齿槽等宽,齿间夹角为9°。转子上没有绕组,只有均匀分布的40个小齿,齿槽也是等宽的,齿间夹角也是9°,与磁极上的小齿一致。此外,三相定子磁极上的小齿在空间位置上依次错开1/3齿距,如图2所示。当A相磁极上的小齿与转子上的小齿对齐时,B相磁极上的齿刚好超前(或滞后)转子齿1/3齿距角,C相磁极齿超前(或滞后)转子齿2/3齿距角。由此可见,错齿是使得步进电机旋转的原因。
时钟发生电路中由晶体振荡器产生时钟信号,频率要稳定,其稳定度决定步进电机的精准度。电路产生3个不同频率的时钟,即3 MHz的扫描时钟、9 kHz的电机转速控制时钟和1 kHz的取样时钟[4-5],分别应用于不同的部分。
控制信号产生电路主要是在1 kHz的取样时钟内,对3 MHz的扫描时钟进行按键触发、按键消抖、按键编码和按键功能等。
环形脉冲分配电路主要完成对电机工作方式的控制。可以采用状态机来设计电机的工作模式,如果是三相步进电机,则可以设计为单三拍、双三拍或混六拍的工作方式。
光耦隔离驱动电路主要完成步进电机的驱动。由于步进电机的绕组电流较大,为防止电机的频繁启停等对ASIC芯片的影响,在输出端加上光电耦合器和达林顿驱动电路。
本设计中脉冲时钟发生电路、光耦隔离驱动电路和步进电机为EPM240T100片外硬件设计,控制信号产生电路和环形脉冲分配电路为片上硬件设计,采用VHDL语言来完成。其硬件和软件资源规划分配图如图4所示。
EPM240T100芯片具有192个宏单元和80个用户可用的引脚,最快速度可以达到4.7 ns。
2 软件设计
软件设计采用VHDL语言实现,四大功能模块程序设计如下。
2.1 分频计数器模块
分频计数器模块主要产生3 MHz扫描时钟、9 kHz步进电机调速时钟和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 按键扫描触发消抖编码模块
本模块主要实现按键扫描、延时消抖和编码译码功能,部分程序如下:
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 控制信号产生模块
本模块主要功能是根据按键输入的不同设置按键的各种功能,从而产生各种控制信号,如启动停止、正转反转、连续单步和加减调速等。程序如下:
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 环形脉冲分配模块
本模块主要针对控制信号完成步进电机不同功能的输出,包括速度、相数和拍数,设计过程使用状态机来完成。程序代码略。
3 仿真及调试
为了确保设计的正确性、降低硬件设计成本和调试难度,对整个设计进行了仿真,结果如图5所示。
本设计中的步进电机控制器所有程序都在Quartus II 上通过了软件仿真,并制作了实际的硬件板。在实际使用时应根据步进电机负载和转速来选择步进电机和设计驱动电路,以防步进电机因失步而导致的控制精度不准确。经测试,硬件电路板运行可靠、控制方便,且控制性能良好。本设计的步进电机控制器方法简单,支持多相步进电机的三种励磁方式,具有启动停止、正反转运行、单步连续、加速减速等多种控制功能。
参考文献
[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] 马宏伟.高性能步进电机控制系统的研制[M].西安:西安科技大学出版社,2004.