Controlador de Motor de Passo

Aqui apenas 7 macrocélulas são necessárias para construir um controlador simples para motor de passo com 4 fases (ou 2 fases com acionamento em ponte H).

O projeto possui apenas um contador de 3 bits que pode avançar ou retroceder e um teste (CASE) que aciona as 4 saídas de acordo com o valor deste contador.

O acionamento de um motor de passo segue a seguinte ordem:

 

 

A listagem VHDL é a seguinte:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
 
entity stepper is
Port ( step : in std_logic;
dir : in std_logic;
desliga : in std_logic;
f1 : out std_logic;
f2 : out std_logic;
f3 : out std_logic;
f4 : out std_logic);
end stepper;
architecture Behavioral of stepper is
signal ct : std_logic_vector (2 downto 0);
begin
process (step,dir) -- contador bidirecional de 2 bits
begin
if desliga='0' then
f1<='0'; f2<='0'; f3<='0'; f4<='0';
elsif rising_edge(step) then
if dir='0' then -- dir=0 avanca, dir=1 retorna
ct<=ct+1;
else
ct<=ct-1;
end if;
case ct is
when "000" => f1<='1'; f2<='0'; f3<='0'; f4<='0';
when "001" => f1<='1'; f2<='1'; f3<='0'; f4<='0';
when "010" => f1<='0'; f2<='1'; f3<='0'; f4<='0';
when "011" => f1<='0'; f2<='1'; f3<='1'; f4<='0';
when "100" => f1<='0'; f2<='0'; f3<='1'; f4<='0';
when "101" => f1<='0'; f2<='0'; f3<='1'; f4<='1';
when "110" => f1<='0'; f2<='0'; f3<='0'; f4<='1';
when "111" => f1<='1'; f2<='0'; f3<='0'; f4<='1';
when others =>
end case;
end if;
end process;
end Behavioral;