网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> EDA >> HDL >> 文章正文
  步进电机定位控制系统VHDL程序           ★★★ 【字体:
步进电机定位控制系统VHDL程序
作者:Free    文章来源:Free    点击数:    更新时间:2008-1-3    
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; --方向控制信号
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)); --步进电机状态输出
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 cc : integer range 0 to 3;
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)--, ini)
begin
--if ini='1' then
cc<=conv_integer(manner);
if dir='0' then
case cc is
when 1 => -- 1-相激励
--count<=0;
cntIni<=0;
cntInc<=2;
angleDnCntDec<=2;--"10";
when 2 => -- 2-相激励
--count<=7;
cntIni<=-1;
cntInc<=2;
angleDnCntDec<=2;--"10";
when 3 => -- 1-2相激励
--count<=0;
cntIni<=0;
cntInc<=1;
angleDnCntDec<=1;--"01";
when 0 => --manner="00" autodetect
if (angle rem 2) =1 then -- 2-相激励
--count<=7;
cntIni<=-1;
cntInc<=2;
angleDnCntDec<=2;--"10";
else -- 1-相激励
--count<=0;
cntIni<=0;
cntInc<=2;
angleDnCntDec<=2;--"10";
end if; --angle
end case; --manner
else -- if dir='1'
case cc is
when 1 => -- 1-相激励
--count<=0;
cntIni<=0;
cntInc<=-2;
angleDnCntDec<=2;--"10";
when 2 => -- 2-相激励
--count<=7;
cntIni<=-1;
cntInc<=-2;
angleDnCntDec<=2;--"10";
when 3 => -- 1-2相激励
--count<=0;
cntIni<=0;
cntInc<=-1;
angleDnCntDec<=1;--"01";
when 0 => --manner="00" autodetect
if (angle rem 2) = 1 then -- 2-相激励
cntIni<=-1;
cntInc<=-2;
angleDnCntDec<=2;--"10";
else -- 1-相激励
cntIni<=0;
cntInc<=-2;
angleDnCntDec<=2;--"10";
end if; --angle
end case; --manner
end if; -- else dir=0
--end if; -- ini
end process;

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;


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;
               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号