步进电机控制器.vhd
上传用户:easylife05
上传日期:2013-03-21
资源大小:42k
文件大小:3k
源码类别:

VHDL/FPGA/Verilog

开发平台:

C/C++

  1. -- dowload from: www.fpga.com.cn & www.pld.com.cn
  2. LIBRARY IEEE;
  3. USE IEEE.std_logic_1164.ALL;
  4. USE IEEE.std_logic_unsigned.ALL;
  5. USE IEEE.std_logic_arith.ALL;
  6. ENTITY step_motor IS
  7. PORT(
  8. f, p, d: IN STD_LOGIC:='0';
  9. speed : in  STD_LOGIC_VECTOR(1 downto 0);
  10. coil : OUT STD_LOGIC_VECTOR(3 downto 0)
  11.          );
  12. END step_motor;
  13. ARCHITECTURE behavior OF step_motor IS
  14. SIGNAL ind_coil: STD_LOGIC_VECTOR(3 downto 0) := "0001";
  15. SIGNAL clk_scan: STD_LOGIC;
  16.     SIGNAL PHASE,DIRECTION:STD_LOGIC;
  17.     signal t:std_logic_vector(3 downto 0);
  18. signal comp:integer range 0 to 2500 ;
  19.     SIGNAL osc:STD_LOGIC;
  20.      BEGIN
  21. coil <= t;
  22. process(f,osc)
  23. variable delay:integer range 0 to 50;
  24. begin
  25. if (f'event and f='1') then
  26.  if delay>=50 then delay:=0;osc<=not osc;
  27.  else delay:=delay+1;
  28. end if;
  29. end if;
  30. if (osc'event and osc='1') then 
  31. case speed is
  32.    when "10" => if comp<2500 then comp<=comp+1; 
  33.                 else comp<=comp; 
  34.                 end if;
  35.    when "01" => if comp>2 then comp<=comp-1;
  36.                 else comp<=comp;
  37.                 end if;
  38.    when others => if comp<2 then comp<=2;
  39.                 else comp<=comp;
  40.                 end if;
  41. end case;
  42. end if;
  43. end process;
  44. PROCESS
  45. VARIABLE d_ff: integer range 0 to 2500;
  46. BEGIN
  47. WAIT UNTIL f = '1';
  48. if d_ff >= comp then
  49. d_ff :=0; clk_scan <= not CLK_SCAN;
  50. else
  51. d_ff := d_ff + 1;
  52. end if;
  53.     END PROCESS ;
  54.  
  55.  PROCESS(F)
  56.  VARIABLE B:STD_LOGIC;
  57.  BEGIN
  58.  IF (F'EVENT AND F='1') THEN B:=(P and (b and P) );
  59.  IF B='1' THEN PHASE<=NOT PHASE ;B:='0';
  60.  ELSIF P='0' THEN PHASE<=PHASE;B:='1';
  61.  END IF;
  62.  END IF;
  63.  END PROCESS;
  64.  PROCESS(F)
  65.  VARIABLE B:STD_LOGIC;
  66.  BEGIN
  67.  IF (F'EVENT AND F='1') THEN B:=(D and (b and D) );
  68.  IF B='1' THEN DIRECTION<=NOT DIRECTION ;B:='0';
  69.  ELSIF D='0' THEN DIRECTION<=DIRECTION;B:='1';
  70.  END IF;
  71.  END IF;
  72.  END PROCESS;
  73. motor:
  74. process
  75. begin
  76. --if (clk_scan'event and clk_scan='1') then
  77. WAIT UNTIL clk_scan= '0';
  78. CASE phase IS
  79. WHEN '1' =>
  80.     IF direction = '0' THEN
  81.         IF ((ind_coil = "1001") or (ind_coil = "0000")) THEN
  82.           ind_coil <= "0001";
  83.         ELSE
  84.           ind_coil <= (ind_coil(2 downto 0) & ind_coil(3));
  85.          END IF;
  86.     ELSE
  87.         IF ((ind_coil = "1001") or (ind_coil = "0000")) THEN
  88.          ind_coil <= "1000";
  89.         ELSE
  90.           ind_coil <= (ind_coil(0) & ind_coil(3 downto 1));
  91.          END IF;
  92.     END IF;
  93.            WHEN OTHERS => 
  94.                          ind_coil<=IND_COIL;
  95.            END CASE;
  96. t<=not ind_coil;
  97. END PROCESS motor;
  98. END behavior;