首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嗯嗯

嗯嗯

步进电机以前只听说过,没有用过,上午花了两个小时研究了一下,终于知道原理了,又弄了一下代码,不过没有板子,也没有步进电机,还真不知道能不能控制,哎,看来是不能这样学习下去了,不然再这样下去,还是纸上谈兵,抽空自己也弄个板子试试,反正现在的主要工作还是设计电路与画板子,心里偷个闲,俺也得选块芯片,也尝试一下画个FPGA或CPLD的板子试试……

--------------------------------------------------------------------------------------------
--                         每天进步一点点,开心多一点^_^
--函数名称:STEP_MOTOR.VHD
--函数功能:用FPGA实现对步进电机定位控制
--作    者:萤火虫II号
--创建日期:2010.04.05
--------------------------------------------------------------------------------------------
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 behav 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 to 0; --计算所转过的角度
signal angleDnCntDec : integer range 2 downto 1;
begin
firsr:process(dir,manner,angle)
begin
  cc<=conv_integer(manner);  --方式选择
  if dir='0' then
   case cc is
    when 1 =>cntIni<=0;          --计数初值为0
         cntInc<=2;  --每次加2
         angleDnCntDec<=2;
    when 2 =>cntIni<=-1;
         cntInc<=2;
         angleDnCntDec<=2;
       when 3 =>cntIni<=0;
         cntInc<=1;
         angleDnCntDec<=1;
    when 0 =>
             if( angle rem 2 )=1 then --A rem B="A-"(A/B)*B 余数运算符 利用操作数A决定结果的正负号
                    cntIni<=-1;     --A mod B="A-B"*N 取模运算符 利用操作数B决定结果的正负号
                cntInc<=2;
                angleDnCntDec<=2;
         else   cntIni<=0;
                cntInc<=2;
                angleDnCntDec<=2;
         end if;
    end case;
else
  case cc is
   when 1 => cntIni<=0;
        cntInc<=2;
        angleDnCntDec<=2;
   when 2 => cntIni<=-1;
         cntInc<=-2;
         angleDnCntDec<=2;
   when 3 => cntIni<=0;
             cntInc<=-1;
             angleDnCntDec<=1;
   when 0 => if(angle rem 2)=1 then
         cntIni<=-1;
               cntInc<=-2;
               angleDnCntDec<=2;
             else
              cntIni<=0;
               cntInc<=-2;
               angleDnCntDec<=2;
             end if;
  end case;
end if;
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 behav;

        因为对步进电机不太熟悉,所以边向电脑上敲,边研究,现在貌似有点理解了,呵呵,还得再好好看看,好了,还是那句口号:
返回列表