潘 涛 程耕国
摘 要:介绍基于FPGA的步进电机控制器的设计,在分析步进电机的工作原理的基础上,给出了层次化设计方案与VHDL程序,并利用Quartus Ⅱ进行了仿真并给出了仿真结果。它以FPGA作为核心器件,极大地减少了外围元件的使用。同时,采用VHDL语言控制可以根据步进电机的不同,改变模块程序的参数就可以实现不同型号步进电机的控制,有利于步进电机的广泛应用。
关键词:步进电机;控制器;现场可编程逻辑门阵列;硬件描述语言
中图分类号:TP29 文献标识码:B
文章编号: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 引 言
随着步进电机广泛地应用于数字控制系统中作为伺服元件,步进电机在实时性和灵活性等性能上的要求越来越高。那么如何灵活、有效地控制步进电机的运转成为研究的主要方向。这里采用现场可编程逻辑门阵列(Field Programmable Gate Array,FPGA),通过VHDL语言编程来实现四相步进电机的控制。利用FPGA设计具有以下优点:
硬件设计软件化 FPGA的开发在功能层面上可以脱离硬件在EDA软件上做软仿真。当功能确定无误后可以进行硬件电路板的设计。最后将设计好的,由EDA软件生成的烧写文件下载到配置设备中去,进行在线调试,如果这时的结果与要求不一致,可以立即更改设计软件,并再次烧写到配置芯片中而不必改动外接硬件电路。进行分层模块设计后系统设计变得更加简单,在实时性和灵活性等性能上都有很大的提高,有利于步进电机的运动控制。
高度集成化,高工作频率 一般的FPGA内部都集成有上百万的逻辑门,可以在其内部规划出多个与传统小规模集成器件功能相当的模块。另外,一般的 FPGA内部都有PLL倍频和分频电路模块,这样可以在外部采用较低频率的晶振而在内部获得较高频率的时钟,进一步解决了
电磁干扰和电磁兼容问题。
1 步进电机的工作原理
步进电动机是一种自动化执行部件,和数字系统结合可把脉冲数转换成角位移,实现其正转、反转、手动和自动控制。四相步进电机有两组线圈A和B。A,B两组垂直摆放线圈的电流方向的排列组合,最多可以产生8种磁场方向,分别是0°,45°,90°,135°,180°,225°,270°,315°。表1给出了四相步进电机的8个方向和电流以及电压信号的关系。
四相电动机有3种激磁方式:
一相激磁法:当目标角度是90°的整数倍时,采用这种方法。
二相激磁法:当目标角度是45°,135°,225°,315°的整数倍时,采用这种方法。
一、二相激磁法:即完全按照表1所列的信号顺序。
2 步进电机定位控制器的整体设计
步进电机定位控制器的系统主要由步进电机方向设定电路模块、步进电机步进移动与定位控制模块以及编码输出模块构成。前两个模块完成电机旋转方向设定、激磁方式和定位角度的换算等工作,后一模块用于对换算后的角度量编码输出。系统框图如图1所示。
2.1 步进电机定位控制器整体架构的VHDL语言设计及仿真
(1) 根据步进电机定位控制器的系统组成框图可以定义输入和输出端口:
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) 步进电机定位控制器顶层电路的VHDL程序代码:
在下面的程序中只考虑逆时针操作模式即(dir=0)。
begin
step_motor_direction:block--步进电机方向设定电路模块
begin
process(dir,manner,angle)
begin
--if ini=′1′ then
cc<=conv_integer(manner);
if dir=′0′ then--逆时针方向旋转
case cc is
when 1 =>--一相激励
count<=0; cntini<=0; cntinc<=2;
angleDnCntDec<=2;--"10";
when 2 =>--二相激励
count<=7; cntini<=-1; cntinc<=2;
angleDnCntDec<=2;--"10";
when 3 =>--一-二相激励
count<=0; cntini<=0; cntinc<=1;
angleDnCntDec<=1;--"01";
when others => --manner="00" autodetect
if (angle rem 2) =1 then--二相激励
count<=7; cntini<=-1; cntinc<=2;
angleDnCntDec<=2;--"10";
else--一相激励
count<=0; cntini<=0; cntinc<=2;
angleDnCntDec<=2;--"10";
end if;--angle
end case;--manner
end process;
step_motor_moving:block--步进电机步进移动与定位控制模块
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 步进电机方向电路模块设计
该模块的功能是设定步进电机的旋转方向(顺/逆时针转动),并设定电动机在顺/逆时针时所需的初值与累加/减值。给出逆时针操作模式的技术规则和仿真输出(ini=0赋初值,ini=1时开始计数)。
如果manner=00,这时进行自动判断,若angle步进角为偶数(角度设定可以被90整除)电路使用一相激磁法,则count的初始值为000(cntini<=0),每次加2;否则电路使用二相激磁法,count的初始值为111(cntini<=111),每次加2;angleDnCntDec每次减2。得到的仿真结果如图2所示。
表2是模块按不同励磁方式输出时各个初值以及累加/减值的设定真值表。
2.3 步进电机移动与定位控制模块设计
该模块的主要功能是利用赋初值ini将数值传到该模块中并配合输入的clk作为同步控制信号,进行步进电机的步进移动与定位控制。步进电机定位功能通过一个减法器实现:在每个clk脉冲上升沿,设定步进角倍数,angleDnCount减去不同激磁方式下设定的累加器计数值angleDnCntDec,判断差值小于设定的累减计数时,步进电机旋转到预定角度停止输出驱动端口信号,来实现定位功能。
2.4 编码输出模块
该模块的主要功能是将count与angleDnCount产生的数值经过编码,再通过baBA输出到步进电机,来对电机进行控制。模块仿真图见图2。
假设reset=1,则将count和angleDnCount设置成0。
假设reset=0,clk为上升沿触发且ini=0时,就将设定的初值(cntini与angle)赋给count和angleDnCount两个信号端,也就是(count<=0+cntini)与(angleDnCount<=angle)。
假设reset=0,clk为上升沿触发且ini=1时,则将count与cntini相加,再将结果存为count。然后判断angleDnCount的值是否大于angleDnCntDec。如果大于,则用angleDnCount减angleDnCntDec,将结果存为angleDnCount;否则,将angleDnCount设为0(因为此时angleDnCount的值小于angleDnCntDec,表示电机已经到达设定位置,故不需要继续转动了)。BaBA [3..0]是将count与angleDnCount产生的数值经过编码后输出到四相步进电机的端口的。
3 Quartus Ⅱ仿真结果
上述程序在ALTERA公司免费提供的Quartus Ⅱ环境下编译通过,适配的FPGA器件为FLEX10K10。最后得到的系统仿真图及生成的系统模块符号图分别如图3,图4所示。
reset是系统内部自复位信号;dir是步进电机正反转的方向控制;clk是由外部提供的时钟信号;ini是赋初值的使能开关;manner[1..0]是激磁方式的选择开关(00:自动检测角度输入,决定激磁方式;01:一相激磁;10:二相激磁;11:一、二相激磁);angle[7..0]是步进角的倍数设定数如引脚;baBA[3..0]是系统输出信号引脚,是内部计数器的count[3..0]数值编码的结果。
4 结 语
步进电机作为一种数字伺服执行元件,具有结构简单,运行可靠,控制方便,控制性能好等优点,但现实中步进电机的控制比较复杂。
这里设计的步进电机控制器方法简单,支持四相步进电机的三种励磁方式、正反转运行,这种基于 FPGA的设计方法,可以加速同类型产品的开发速度,节约投资。并且可以根据步进电机的不同,改变分层模块的VHDL程序的参数,实现不同型号步进电机的控制,在实际应用中有利于步进电机的广泛应用。
参考文献
[1]潘松,黄继业.EDA技术实用教程[M].北京:科学出版社,2002.
[2]杨渝钦.控制电机[M].2版.北京:机械工业出版社,1999.
[3]朱明程.可编程逻辑系统的VHDL设计技术[M].南京:东南大学出版社,1998.
[4]任晓东,文博.CPLD/FPGA 高级应用开发指南[M].北京:电子工业出版社,2003.
[5]曾繁泰,陈美金.VHDL程序设计[M].北京:清华大学出版社,2001.
[6]马宏伟.高性能步进电机控制系统的研制[M].西安:西安科技大学出版社,2004.
[7]卢毅,赖杰.VHDL与数字电路设计[M].北京:科学出版社,2001.
[8]朱正伟.EDA技术及应用[M].北京:清华大学出版社,2005.
[9]刘宝廷,程树康.步进电动机及其驱动控制系统[M].哈尔滨:哈尔滨工业大学出版社,1997.
[10]宋锦河.步进电机控制系统的快速实现[J].鄂州大学学报,2004(4):5-8.
作者简介
潘 涛 男,1984年出生,武汉科技大学信息学院在读硕士研究生。现从事模式识别与智能系统的研究。
程耕国 男,1947年出生,武汉科技大学自动化系教授,博士。研究方向为智能材料,机电一体化和自动控制系统研究与设计等。