Hola, tomé como referencia tu código para controlar un motor unipolar 24BYJ48 con una nexys2, el he modificado el código tal que indico el número de pasos que tiene que dar para dar una vuelta, sin embargo no funciona de maner adecuada.
Según mis cálculos debido al reductor 1/64 que contiene este motor, debo generar 256 pasos para que logre girar una revolución completa sin embargo al colocar esta cantidad de pasos, sólo gira un poco.
Adjunto el código modificado para su análisis.
`library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--variables
entity motor_control is
Port ( L_R : in STD_LOGIC; -- Reloj
CLK,RST,velocidad: in STD_LOGIC;
A,B,C,D: out STD_LOGIC; -- Salida al motor
led : out STD_LOGIC_VECTOR(3 downto 0)); -- Reset del motor
end motor_control;
--ESTADOS
architecture Behavioral of motor_control is
type type_state is (S0,S2,S4,S6,espera);
signal state : type_state; -- Secuencia de pasos
--señales
signal aux1,clk1,aux2,clk2,vel,nv : std_logic;
signal count1,count2: integer:=1;
signal salida: std_logic_vector(3 downto 0);
signal x: std_logic_vector(1 downto 0);
--signal pasos : integer := 4; --cada 4 paso es un ciclo que mueve 1/64 el eje de salida de motor, para mover 1 revolución completa son 64 ciclos. cada 1/64 mueve 5.64° el motor aprox, de otra manera para que el eje de salida gire una vuelta completa es necesario 256 pasos.
begin
--divisor de frecuencia a 1 herzio
Velocidad_1Hz: process (clk)
begin
if(clk' event and clk='1') then
count1<=count1+1;
if (count1 = 50000000) then
aux1 <= not aux1;
count1 <= 1;
end if;
end if;
end process;
clk1<=aux1;
--divisor de frecuencia a 500hz
velocidad_500hz: process(clk)
begin
if(clk' event and clk='1') then
count2<=count2+1;
if (count2 = 100000) then
aux2 <= not aux2;
count2 <= 1;
end if;
end if;
end process;
clk2<=aux2;
--selector de velocidad<
SEL_SPEED: process (clk1,clk2)
begin
if (velocidad='0') then
vel<=clk1;
else
vel<=clk2;
end if;
end process;
motor_activo: process(vel)
variable pasos : integer :=256;
begin
if rising_edge(vel) then
if (pasos>0) then
nv<='1';
pasos:=pasos-1;
else
nv<='0';
end if;
else
end if;
end process;
proceso_estados: process(RST,vel,nv)
begin
--sentido de giro y tipo de paso
x<=L_R & nv ;
if RST='1' then
state<=espera;
elsif rising_edge(vel) then
case state is --estado y condiciones
when S0=>
if (X="01") then
state<=S2;
elsif (X="11") then
state<=S6;
elsif (X="00") then
state<=espera;
elsif (X="10") then
state<=espera;
end if;
when S2=>
if (X="01") then
state<=S4;
elsif (X="11") then
state<=S0;
elsif (X="00") then
state<=espera;
elsif (X="10") then
state<=espera;
end if;
when S4=>
if (X="01") then
state<=S6;
elsif (X="11") then
state<=S2;
elsif (X="00") then
state<=espera;
elsif (X="10") then
state<=espera;
end if;
when S6=>
if (X="01") then
state<=S0;
elsif (X="11") then
state<=S4;
elsif (X="00") then
state<=espera;
elsif (X="10") then
state<=espera;
end if;
when espera=>
if (X="01") then
state<=S0;
elsif (X="11") then
state<=S6;
elsif (X="00") then
state<=espera;
elsif (X="10") then
state<=espera;
end if;
end case;
end if;
end process;
Logica_salida: process(state) --lógica de salida
begin
case state is
when S0 => salida <= "0001";
when S2 => salida <= "0010";
when S4 => salida <= "0100";
when S6 => salida <= "1000";
when espera => salida <= "0000";
end case;
end process;
Salidas_leds: process(clk1)
begin
led(0)<=salida(0);
led(1)<=salida(1);
led(2)<=salida(2);
led(3)<=salida(3);
end process;
--señales de salida
A<=salida(3);
B<=salida(2);
C<=salida(1);
D<=salida(0);
end Behavioral;
`
sería de mucha ayuda tu amable respuesta.
Hola, tomé como referencia tu código para controlar un motor unipolar 24BYJ48 con una nexys2, el he modificado el código tal que indico el número de pasos que tiene que dar para dar una vuelta, sin embargo no funciona de maner adecuada.
Según mis cálculos debido al reductor 1/64 que contiene este motor, debo generar 256 pasos para que logre girar una revolución completa sin embargo al colocar esta cantidad de pasos, sólo gira un poco.
Adjunto el código modificado para su análisis.
`library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--variables
entity motor_control is
Port ( L_R : in STD_LOGIC; -- Reloj
CLK,RST,velocidad: in STD_LOGIC;
A,B,C,D: out STD_LOGIC; -- Salida al motor
led : out STD_LOGIC_VECTOR(3 downto 0)); -- Reset del motor
end motor_control;
--ESTADOS
architecture Behavioral of motor_control is
type type_state is (S0,S2,S4,S6,espera);
signal state : type_state; -- Secuencia de pasos
--señales
signal aux1,clk1,aux2,clk2,vel,nv : std_logic;
signal count1,count2: integer:=1;
signal salida: std_logic_vector(3 downto 0);
signal x: std_logic_vector(1 downto 0);
--signal pasos : integer := 4; --cada 4 paso es un ciclo que mueve 1/64 el eje de salida de motor, para mover 1 revolución completa son 64 ciclos. cada 1/64 mueve 5.64° el motor aprox, de otra manera para que el eje de salida gire una vuelta completa es necesario 256 pasos.
begin
--divisor de frecuencia a 1 herzio
Velocidad_1Hz: process (clk)
begin
if(clk' event and clk='1') then
count1<=count1+1;
if (count1 = 50000000) then
aux1 <= not aux1;
count1 <= 1;
end if;
end if;
end process;
clk1<=aux1;
--divisor de frecuencia a 500hz
velocidad_500hz: process(clk)
begin
if(clk' event and clk='1') then
count2<=count2+1;
if (count2 = 100000) then
aux2 <= not aux2;
count2 <= 1;
end if;
end if;
end process;
clk2<=aux2;
--selector de velocidad<
SEL_SPEED: process (clk1,clk2)
begin
if (velocidad='0') then
vel<=clk1;
else
vel<=clk2;
end if;
end process;
motor_activo: process(vel)
variable pasos : integer :=256;
begin
if rising_edge(vel) then
if (pasos>0) then
nv<='1';
pasos:=pasos-1;
else
nv<='0';
end if;
else
end if;
end process;
proceso_estados: process(RST,vel,nv)
begin
--sentido de giro y tipo de paso
x<=L_R & nv ;
Logica_salida: process(state) --lógica de salida
begin
case state is
when S0 => salida <= "0001";
when S2 => salida <= "0010";
when S4 => salida <= "0100";
when S6 => salida <= "1000";
when espera => salida <= "0000";
end case;
end process;
Salidas_leds: process(clk1)
begin
led(0)<=salida(0);
led(1)<=salida(1);
led(2)<=salida(2);
led(3)<=salida(3);
end process;
--señales de salida
A<=salida(3);
B<=salida(2);
C<=salida(1);
D<=salida(0);
end Behavioral;
`
sería de mucha ayuda tu amable respuesta.