martes, 22 de febrero de 2022

202 - Lectura Pulsador EP2C5

Lectura de Pulsador

 

Fig1. Pulsador SPST 10mm

En esta entrada del blog, veremos como hacer una lectura correcta de un pulsador en la placa EP2C5, nuevamente recordar que ya contamos con los conocimientos acerca de los que son las FPGA y el manejo de lenguajes descriptivos, mas propiamente Verilog, y que también tienes  instalado el software de diseño Quartus Web, un programador USB-Blaster y la placa EP2C5, aunque puedes utilizar cualquier otra tarjeta siempre que sea de la marca Altera. En todo caso algo muy interesante de esta tecnología es que el modulo descrito en este ejemplo puede ser sintetizado para cualquier FPGA.  

En una entrada anterior de mi blog resumo como introducción algunos datos adicionales acerca de la tarjeta EP2C5 y lo que necesitas para crear tus circuitos digitales. Te recomiendo le des una mirada haciendo click al siguiente enlace:   Tarjeta EP2C5T

Descripción del circuito

Crearemos un circuito digital para leer el nivel lógico de un pulsador y reflejar su estado en un un diodo led por lo que haremos uso de los siguiente elementos: 

  • Pulsador de entrada conectado al pin 114(Externo);
  • Indicador de estado, LED conectado al pin3(Interno);
  • Oscilador principal conectado al pin17(Interno);
  • Pulsador de reinicio conectado al pin144(Interno).

Describiremos en nuestro ejemplo el modelo de una maquina de estados finitos FSM, donde se tomara en cuenta para validar el estado del pulsador los tiempos de espera debido al rebote mecánico y un intervalo mínimo de repetición entre pulsaciones.

Un pulsador es básicamente una interfaz que permite establecer un nivel lógico de entrada a un circuito digital, la validación de su estado se origina por la acción mecánica de cerrar y abrir los contactos internos ocasionando a una escala mínima de tiempo, oscilaciones no deseable que deben ser consideradas en un sistema digital.

Fig2. Ruido en cambio de estado de un pulsador

Como notara en la imagen de la fig2, el ruido esta formado por pequeñas transiciones que se propagan por casi 40ms, este tiempo se conoce como tiempo de rebote(bounce), y algunas técnicas para minimizar este efecto en nuestro circuito pueden ser:
  • Adicionar un filtro RC en la entrada del pulsador;
  • Adicionar un circuito discriminador de ruido.

Nuestro ejemplo pasa por aplicar la segunda opción donde diseñaremos una maquina de estados finito para conseguir un nivel estable durante la transición del pulsador, tal como se ilustra en el diagrama de tiempos de la siguiente imagen.

Fig3. Diagrama de tiempo para discriminar el rebote

Los tiempos de rebote mínimo dependerán en parte de la calidad de construcción de un determinado pulsador, pero en general estará en el rango de 10-50ms, el tiempo de espera(debounce time) puede diferir entre la transición bajo a alto y alto a bajo.

A continuación se muestra el diagrama de estados para la maquina FSM, misma que estará sincronizada por una señal de reloj, usualmente de 1ms.

 

Fig4. Diagrama de estados

El código verilog drv_button.v del circuito discriminador comenta claramente la definición de los estados utilizados, el ultimo estado UNPRESS tiene por finalidad otorgar un intervalo de espera entre pulsaciones del botón, tomando en cuenta la interacción humana. Todos los estados dependen del valor que posee el contador, mismo que se incrementa continuamente y se reinicia cada vez que hay un cambio de estado, además se considera que el pulsador se activa en nivel bajo por lo que deberá configurar el modo pullup.

module drv_button(clk, rstn, butn, out);
input clk, rstn, butn;
output reg out = 0;
parameter INTERVAL = 500 //Intervalo de repetición mayor a 50
localparam WIDTH = $clog2(INTERVAL); //Dimensiona contador
localparam INITIAL = 0; //Inicializa estado
localparam WAITING = 1; //Verifica pulsador presionado
localparam PRESSED = 2; //Verifica pulsador liberado
localparam UNPRESS = 3; //Tiempo de espera
reg [1:0] state, nextstate;//registros de estado
reg [WIDTH-1:0] cnt = 0;//contador de pulsos clk

always @(negedge clk or negedge rstn)//flanco NEG para actualizar estado
if(!rstn) state <= INITIAL;
else state <= nextstate;

always @(posedge clk)
case(state)
  INITIAL://Condicion de reinicio
  begin
    cnt <= 0;
    out <= 1'b0;
    nextstate <= WAITING;
  end
  WAITING://Espando pulso del botón
  if(!butn)
  begin
    cnt <= cnt + 1'b1;
    if(cnt == 30) //Espera al menos 30 pulsos
    begin
      cnt <= 0;
      nextstate <= PRESSED;
    end
  end
  else cnt <= 0;
  PRESSED://Pulsador presionado
  if(butn)
  begin
    cnt <= cnt + 1'b1;
    if(cnt == 20) //Espera al menos 20 pulsos
    begin
      cnt <= 0;
      out <= 1;
      nextstate <= UNPRESS;
    end
  end
  else cnt <= 0;
  UNPRESS: //Pulsador liberado
  begin
    out <= 0;
    if(cnt >= INTERVAL) //Intervalo de repetición
    begin
      cnt <= 0; //Reinicia contador
      nextstate <= WAITING;
    end
    else cnt <= cnt + 1'b1;//Incrementa contador
  end
endcase
endmodule

 

Implementación del circuito

El código descrito previamente se muestra como símbolo dentro del esquema de circuito Quartus Web, Fig5. 

Fig5. Modulo drv_button.v

Antes de continuar con la interconexión del circuito, fue necesario llevar a cabo unas pruebas al modulo drv_button.v utilizando el siguiente modulo de estimulo:

`timescale 100us/10us
module button_tb;
reg clk, rstn, but;
wire out;
drv_button u1(clk, rstn, ~but, out);
initial begin
 clk = 0; rstn = 0; but = 0;
 forever #5 clk = ~clk; //Tiempo 5x100us
end
initial begin
  #10 rstn = 1;//1ms
  #20 but = 1; //2ms
  #40 but = 0; //4ms
  #60 but = 1; //6ms
  #400 but = 0; //40ms
  end
endmodule

Las pruebas llevadas a cabo nos muestran el siguiente diagrama de tiempos, donde se observa el adecuado funcionamiento.

Fig6. Pulso de salida sin rebote

  Continuando con nuestro circuito discriminador, ahora necesitaremos de un circuito que provea una señal de reloj con periodo de 1ms, este circuito es básicamente un divisor de frecuencia cuya entrada sera una el reloj de principal de 50MHz que posee la tarjeta EP2C5 y su salida oscilara a 1KHZ.

Para este propósito utilizaremos el modulo drv_clock cuya explicación en detalle se muestra en la siguiente entrada

Una vez agregado y convertido a símbolos los módulos drv_button y drv_clock agregaremos estos al diagrama de bloques un flip flop T que permitirá conmutar su salida con cada pulso capturado. La siguiente figura ilustra las respectivas conexiones hacia los pines de la placa EP2C5.

Fig7. Diagrama del circuito

Note que la entrada del pulsador en el modulo drv_button se activa en nivel bajo, debido a que es una entrada con resistencia pull-up, de la misma manera el led indicador conectado al flip flop,  esta en modo sumidero(sink), es decir se activa con nivel bajo.

Conclusiones

Para finalizar solo quiero agradecer tu visita a mi blog, espero que el contenido de esta entrada hubiera sido de ayuda, se que no detalle muchos pasos pero cualquier consulta al respecto puede escribirme al correo y con mucho gusto tratare de colaborar con lo que se pueda.

Enlace para descarga del proyecto Quartus Web: ep2button

Dejo un vídeo de explicativo que muestra como crear un proyecto en Quartus utilizando un diagrama de bloques. 



Referencias:

https://www.maximintegrated.com/

https://www.eejournal.com

https://softsolder.com

https://www.we-online.com


Pablo Zarate Arancibia

Electrónico
pablinzte@gmail.com


No hay comentarios:

Publicar un comentario