步進電機定位控制系統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;
評論
查看更多