网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > FPGA > 正文

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

  • 上一篇资讯: CPSK调制VHDL程序及仿真
  • 下一篇资讯: MFSK调制VHDL程序及仿真
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师