四相步进电机定位控制系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
四相步进电机定位控制系统
四相步进电机定位控制系统功能概述
步进电机每接收到一组脉冲数字信号,便旋转一个角度,成为步进角。不同规格的步进电机的步进角不同,这决定于其内部的线圈数量。线圈中的供应电流可以决定线圈所产生的磁场方向。假设有两组线圈A 和B ,如图一所示。A 线圈如果提供A 点低电位而A ′点高电位,电流由A ′螺旋向上流到A ,形成向上的磁场方向;同理,提供B 点低电位而B ′点高电位,电流由B ′螺旋流到B ,形成向左的磁场方向。A 和B 这两组线圈形成的总磁场方向即为左上方。
如果将电动机的转子置于线圈所产生的磁场中,便会受到磁场的作用而产生与磁场方向一致的力,转子便开始转动,直到转子的磁场方向与线圈的磁场方向一致为止。如图二所示。由A 和B 两组线圈电流方向的排列组合,最多可以产生8种磁场方向,分别是0°、45°、90°、135°、180°、225°、270°、315°。这些方向的电流方向列于表一。
图一 图二
由表一可知,假设电动机转子刻度原先在0°的位置,想让其转到180°,就必须让端口信号依次由0001、0011、0010、0110到0100变化。但是是否有更快的办法,是否一定要经过4个信号过程呢?其实有更快更省电的方式让电动机从0°达到180°的位置。这就是所谓的激磁方式的不同。四相电动机可以分为3种激磁方式。
表一:四相步进电机的8个方向和电流以及电压信号的关系
180°270°
1-相激磁法:当目标角度是90的整数倍时,采用这种方法。例如要从0转到270,只要让端口信号的顺序为0000,0001,0010,0100,1000即可。
2-相激磁法:当目标角度是45而非90的整数倍时,可采用这种方法。例如要从0转到225,只要让端口信号的顺序为0000,0011,0110,1100即可。
1-2-相混合激磁法:按照表二中所列的信号顺序。
四相步进电机定位控制系统的VHDL源码及注释
--四相步进电机示例程序
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity step_motor is
port (reset:in STD_LOGIC; --系统复位信号
dir: in STD_LOGIC; --步进电机正反转方向控制开关(0:逆时针;1:顺时针)clk: in STD_LOGIC; --系统时钟(FPGA内部提供的4MHz的时钟信号)
ini: in STD_LOGIC; --使能开关
manner: in STD_LOGIC_VECTOR (1 downto 0); --激磁方式的选择开关(00:自动选择激磁方式;--01:1-相激磁;10:2-相激磁;11:1-2-相激磁)angle: in STD_LOGIC_VECTOR (7 downto 0); --步进角的倍数设定输入键
baBA: out STD_LOGIC_VECTOR (3 downto 0)); --步进电机的状态输出
end step_motor;
architecture stepmotor_arch of step_motor is
signal count: INTEGER range 0 to 7; --内部电路的计数累加器,用于产生输出所需对应的状态
signal cntInc: INTEGER range -2 to 2; --设定累加器所需的累加/减计数值
signal cntIni: INTEGER range -1 to 0; --设定累加器所需的计数初值
signal angleDnCount: INTEGER range 255 downto 0; --设定步进角所需的计数次数signal angleDnCntDec: INTEGER range 2 downto 1; --设定步进角所需的累减计数值begin
--步进电机方向设定电路模块
该模块的功能是设定步进电机的旋转方向(顺时针或逆时针),并设定电机在顺时针转动或逆时针转动时所需的初值与累加/减值。
process(dir,manner,angle)
begin
if dir='0' then
case manner is
when "01" => --1-相激磁
cntIni<=0;
cntInc<=2;
angleDnCntDec<=2;
when "10" => --2-相激磁
cntIni<=-1;
cntInc<=2;
angleDnCntDec<=2;
when "11" => --1-2-相激磁
cntIni<=0;
cntInc<=1;
angleDnCntDec<=1;
when others => --自动选择激磁方式
--angle为偶数即角度为90的倍数时,采用1-相激磁,否则2-相激磁if (angle(0)='1') then --2-相激磁
cntIni<=-1;
cntInc<=2;
angleDnCntDec<=2;
else --1-相激磁
cntIni<=0;
cntInc<=2;
angleDnCntDec<=2;
end if;
end case;
else
case manner is
when "01" => --1-相激磁
cntIni<=0;
cntInc<=-2;
angleDnCntDec<=2;--"10";
when "10" => --2-相激磁
cntIni<=-1;
cntInc<=-2;
angleDnCntDec<=2;--"10";
when "11" => -- 1-2-相激磁
cntIni<=0;
cntInc<=-1;
angleDnCntDec<=1;--"01";
when others => --自动选择激磁方式
if (angle(0)='1') then --2-相激磁
cntIni<=-1;
cntInc<=-2;
angleDnCntDec<=2;
else --1-相激磁
cntIni<=0;
cntInc<=-2;
angleDnCntDec<=2;
end if;
end case;
end if;
end process;