当前位置:首页 > EDA > 电子设计自动化
[导读]步进电机定位控制系统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; --系统

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

一直以来,步进电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来步进电机的相关介绍,详细内容请看下文。

关键字: 电机 步进电机

伺服电机是一种能够精确控制位置、速度和加速度的电动机。它通过内置的反馈系统,能够根据控制信号实时调整输出力矩和转速,从而实现精确的运动控制。伺服电机广泛应用于机械制造、自动化设备、机器人等领域。

关键字: 伺服电机 步进电机

● 颠覆性的专用软硬件加速平台;利用GPU和CPU计算以及专有软件算法,提高准确度、速度和规模的同时,带来高达100倍的设计效率提升; ● 与传统HPC相比,支持GPU-resident模式的求解器可将仿真能效显著提高2...

关键字: AI 仿真

● 热、应力和电子散热设计同步分析,让设计人员可以无缝利用ECAD和MCAD对机电系统进行多物理场仿真; ● 融合FEM和CFD引擎,应对各种热完整性挑战——从芯片到封装,从电路板到完整的电子系统; ● Celsius...

关键字: AI 仿真

具有高采样率的泰克任意波形发生器(AWG)是功能多样且强大的仪器,可以提高脉冲激光实验的质量和效率,为以前所未有的精度和灵活性创建和操作光脉冲提供了多种可能性。

关键字: 仿真 测试测量

● 四态硬件仿真应用可加速需要X态传播的仿真任务; ● 实数建模应用可加速混合信号设计软件仿真; ● 动态功耗分析应用可将复杂SoC的功耗分析任务加快5倍。

关键字: 仿真 SoC

反应式步进电机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对反应式步进电机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 电机 步进电机 反应式步进电机

一直以来,电机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来电机的相关介绍,详细内容请看下文。

关键字: 电机 感应电机 步进电机

伺服电机和步进电机在控制精度、低频特性、矩频特性、过载能力、编码器类型等方面存在显著差异。

关键字: 伺服电机 步进电机 编码器

目前,中国市场HiL技术主要应用于汽车、航空航天、国防、能源、电力电子等产业,2016年-2028年市场规模复合增长率达18.5%,预计2028年中国HiL模拟行业市场规模达到273亿元,其中尤以汽车行业HiL应用市场规...

关键字: 仿真 汽车电子
关闭
关闭