Skip to content

Como implementar un control de vueltas #1

@iamrocan

Description

@iamrocan

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions