;
文章:行业新闻EDA文摘电源技术无线通信测量仪表嵌入式类电子技术制造技术半导体网络/协议展会实验家电维修  
  下载:EDA教程电源技术电子书籍电子元件无线通信通信网络电路图纸嵌入式类单片机传感/控制电子教材模拟数字
.... 音视频类
消费电子机械电子行业软件C/C++FPGA/ASIC规则标准家电维修DSPIC资料ARM软件电路图电子技术论坛
 
位置:电子发烧友 > 行业新闻 > 嵌入式类 > FPGA/ASIC技术 >步进电机定位控制系统VHDL程序与仿真 退出登录 用户管理
栏目导航


· 单片机类 · 接口/总线/驱动
· ARM · DSP
· FPGA/ASIC技术 · 设计应用
· 嵌入式操作系统 · 电视卡
热门文章
· [组图] 电子元器件基础知识...
· [图文] USB接口定义
· [图文] 三极管开关电路图
· [组图] RS232 RS485接口原理...
· [组图] [组图]电动车充电器...
· [组图] 电子捕鱼器电路图
· [组图] 高品质音调电路的制...
· [组图] JRC4558电路
· [图文] M51134P低音炮电路图...
· [图文] TL494脉宽调制控制电...
相关文章

· [图文] 注塑机单片控制系统...
· [图文] 虚拟演播室系统原理...
· x86平台建立网络连接...
· 未来车载安全系统中...
· 中药提取过程控制系...
· C#开发电子病历功能...
· 德州仪器全新集成高...
· [图文] 单片机+CPLD的多路精...
· 利用可编程逻辑实现...
· [图文] ISD4004的家庭语音报...

步进电机定位控制系统VHDL程序与仿真
作者:本站  来源:www.elecfans.com  发布时间:2008-6-27 10:44:32 减小字体 增大字体

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

[] [返回上一页] [打 印] [收 藏]
 
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
 
关于本站- 意见反馈 - 网站导航 - 帮助 - 隐私政策 - 联系我们 - 使用条款 - 安全承诺 - 友情连接
站长QQ:39550527 Powered by: 飓风网络(电路图
Copyright 2006-2008 Elecfans.Com.电子发烧友: 粤ICP备07065979号All Rights Reserved