步进电机定位控制系统VHDL程序与仿真

2012-02-11 13:03:37来源: elecfans
   

步进电机定位控制系统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; --方向控制信号
      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;

关键字:步进电机  定位控制

编辑:北极风 引用地址:http://www.eeworld.com.cn/FPGA/2012/0211/article_2869.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
步进电机
定位控制

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 

夏宇闻老师专栏

你问我答FPGA设计

北京航空航天大学教授,国内最早从事复杂数字逻辑和嵌入式系统设计的专家。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved