步进电机以前只听说过,没有用过,上午花了两个小时研究了一下,终于知道原理了,又弄了一下代码,不过没有板子,也没有步进电机,还真不知道能不能控制,哎,看来是不能这样学习下去了,不然再这样下去,还是纸上谈兵,抽空自己也弄个板子试试,反正现在的主要工作还是设计电路与画板子,心里偷个闲,俺也得选块芯片,也尝试一下画个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;
因为对步进电机不太熟悉,所以边向电脑上敲,边研究,现在貌似有点理解了,呵呵,还得再好好看看,好了,还是那句口号:
每天进步一点点,开心多一点^_^
文章评论(0条评论)
登录后参与讨论