Proyecto Final: Control Nivel


Proyecto Final

Diseño e implementación de un sistema con FPGA para controlar el nivel de un tanque




En este documento se presentan el diseño y la implementación de un sistema de control en el cual se seleccionan dos niveles de llenado para un tanque, se utiliza un actuador para el drenado y llenado del recipiente, con sensores micro-switches acoplados a la FPGA.

En el siguiente enlace se muestra el documento con mas detalle sobre este proyecto  



Código en Xilinx


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.pq_tanque.all;

entity visu2 is
Port (
reset: in std_logic;
ck: in std_logic;
S2: in std_logic;--n_2
S1: in std_logic;--n_1
B2: in std_logic;--vaciar
B1: in std_logic;--llenar
V2: out std_logic;--llena
V1: out std_logic;--vacía
L2: out std_logic;--led llena
L1: out std_logic;--led vacía
catodos : out  STD_LOGIC_VECTOR (6 downto 0);
      anodos : out  STD_LOGIC_VECTOR (3 downto 0)
);
end visu2;

architecture behavioral of visu2 is

type nombres_estados is (stop, vacio, llena);
type nombres_display is (nivel_0, nivel_1, nivel_2);

--signal presente : estados := vacio;
--signal futuro : estados;
--signal cont, cont1, cont2: natural range 0 to 2**26-1;
signal BCD_1, BCD_2, BCD_3, BCD_4 : std_logic_vector (3 downto 0);
signal sald :   STD_LOGIC_VECTOR(3 downto 0):= (others => '0');--
signal e :STD_LOGIC_vector(1 downto 0):= "00";--
signal sald_1 : STD_LOGIC;--
signal tes : STD_LOGIC;--
signal tiemp : STD_LOGIC;--

signal display: nombres_display;
signal estado: nombres_estados;
signal boton: std_logic_vector (1 downto 0);
signal sensor: std_logic_vector (1 downto 0);

begin

sensor<=S2&S1;
boton<=B2&B1;

process(reset, ck)
begin
if reset='1' then
estado<=stop;
elsif ck='1' and ck'event then
case estado is

when stop =>

if sensor="11"  then display<=nivel_0;
if boton="00" then estado<=stop; end if;
if boton="01" then estado<=llena; end if;
end if;

if sensor="10" then display<=nivel_1;
if boton="00" then estado<=stop; end if;
if boton="01" then estado<=llena; end if;
if boton="10" then estado<=vacio; end if;
end if;

if sensor="00" then display<=nivel_2;
if boton="00" then estado<=stop; end if;
if boton="01" then estado<=stop; end if;
if boton="10" then estado<=vacio; end if;
end if;

when vacio =>

if sensor="11" then display<=nivel_0;
if boton="00" then estado<=stop; end if;
end if;
if sensor="10" then display<=nivel_1;
if boton="00" then estado<=stop; end if;
end if;

when llena =>

if sensor="10" then display<=nivel_1;
if boton="00" then estado<=stop; end if;
end if;
if sensor="00" then display<=nivel_2;
if boton="00" then estado<=stop; end if;
end if;
--
when others => estado<=stop;
end case;
end if;
end process;

process(estado,display)
begin
case estado is
when stop =>
V2<='1';
V1<='1';

L2<='0';
L1<='0';

when vacio =>
V2<='1';
V1<='0';

L2<='0';
L1<='1';

when llena =>
V2<='0';
V1<='1';

L2<='1';
L1<='0';

end case;

case display is
when nivel_0 =>
BCD_1 <="0000"; --0
BCD_2 <="0000"; --0
BCD_3 <="1000"; ---
BCD_4 <="0101"; --n

when nivel_1 =>
BCD_1 <="0001"; --1
BCD_2 <="0000"; --0
BCD_3 <="1000";
BCD_4 <="0101"; --n

when nivel_2 =>
BCD_1 <="0010"; --2
BCD_2 <="0000"; --0
BCD_3 <="1000";
BCD_4 <="0101"; --n
end case;

end process;


selector: visual PORT MAP(ck, e);
salida: mostrar PORT MAP(BCD_1, BCD_2, BCD_3, BCD_4, e, sald);
--animacion_0 : parpadeo PORT MAP(clk, tes, sald_1, tiemp);
bcd0: bcd_7_seg PORT MAP (e, sald, sald_1, catodos, anodos);

end behavioral;
________________________________________________________________


Imágenes de la Implementación




No hay comentarios:

Publicar un comentario