Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

Librería sensor ultrasónico HC-SR04

 

Librería en VHDL que controla a un sensor ultrasónico HC-SR04, genera la señal Trigger y procesa la señal Echo para devolver la distancia en centímetros.

Los puertos que la componen son los siguientes:

 

 

FPGA_CLK: Puerto genérico donde se especifica la frecuencia del reloj en Hertz.

CLK: Reloj del FPGA.

ECO: Puerto conectado al pin Eco del sensor HC-SR04.

TRIGGER: Puerto conectado al pin Trigger del sensor HC-SR04.

DATO_LISTO: Puerto de un bit que indica cuándo ya está listo el valor de la distancia. El bit dura activo ‘1’ un ciclo de reloj.

DISTANCIA_CM: Puerto de 9 bits con el valor de la distancia en centímetros.

La librería cuenta con un algoritmo que realiza la división para el cálculo de distancia mediante aproximaciones sucesivas, de esta forma se vuelve completamente genérica ya que no utiliza recursos adicionales como LUTs permitiendo una mejor optimización de recursos.

 

Funcionamiento.

 

Control del sensor.

La librería manda un pulso de trigger al HC-SR04 con un tiempo en alto de 10 microsegundos y un periodo de 62.5 milisegundos, el sensor responde con un pulso en Eco y el tiempo de duración en ‘1’ se adquiere para después utilizarlo en una fórmula matemática para obtener la distancia entre el sensor y el objeto. Cuando el cálculo de la distancia se ha realizado, el resultado aparecerá en el puerto “DISTANCIA_CM” y se activará la bandera “DATO_LISTO” que dura un ciclo de reloj.

El diagrama de tiempo de la librería es el siguiente:

 

Calculo de distancia.

Para obtener el tiempo de duración del Eco se hace un muestreo de la señal  a la frecuencia de reloj del FPGA obteniendo N número de flancos (N CLK) el cual se divide entre una constante llamada “VAL_1US”, el valor de esta constante varía dependiendo de la frecuencia del reloj del FPGA y se utiliza para obtener el tiempo de duración de Eco en microsegundos.

Tiempo_Eco_microsegundos = N_CLK / VAL_1US

Por último se divide ese tiempo entre 58 para obtener la distancia en centímetros.

Distancia_centímetros = Tiempo_Eco_microsegundos / 58

IMPORTANTE: Añadir los archivos INTESC_LIB_ULTRASONICO_RevC y DIVISION_ULTRASONICO_RevA correspondientes a la librería.

 

 

CÓDIGO DE EJEMPLO

 

Como ejemplo se encenderá un LED cuando el sensor detecte un objeto a una distancia menor a 30cm.

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity top_lib_ultra is
port( CLK     : IN  STD_LOGIC;
      ECO     : IN  STD_LOGIC;
      TRIGGER : OUT STD_LOGIC;
      LED     : OUT STD_LOGIC
    );
end top_lib_ultra;
 
architecture Behavioral of top_lib_ultra is
 
component INTESC_LIB_ULTRASONICO_RevC is
generic( FPGA_CLK : INTEGER := 50_000_000 );
PORT( CLK          : IN  STD_LOGIC;
      ECO          : IN  STD_LOGIC;
      TRIGGER      : OUT STD_LOGIC;
      DATO_LISTO   : OUT STD_LOGIC;
      DISTANCIA_CM : OUT STD_LOGIC_VECTOR(8 DOWNTO 0)
     );
end component INTESC_LIB_ULTRASONICO_RevC;
 
signal dato_listo   : std_logic := '0';
signal distancia_cm : std_logic_vector(8 downto 0) := (others => '0');
 
begin
 
u1: INTESC_LIB_ULTRASONICO_RevC 
generic map( FPGA_CLK => 50_000_000 ) -- Reloj de FPGA opera a 50MHz
PORT map( CLK          => CLK, 
          ECO          => ECO, 
          TRIGGER      => TRIGGER, 
          DATO_LISTO   => dato_listo, 
          DISTANCIA_CM => distancia_cm 
         );
 
process(CLK)
begin
if rising_edge(CLK) then
    if dato_listo = '1' then
        if distancia_cm < "000011110" then -- 30cm en binario en 9 bits
           LED <= '1';
        else
           LED <= '0';
        end if;
    end if;
end if;
end process;
end Behavioral;
&nbsp;

 

DESCARGAR LIBRERÍA