DEBOUNCE


 

DEBOUNCE.


Algo, que por lo menos a mí me provocaba algo de “malestar” era el “debounce” (rebote) que se produce en los interruptores mecánicos, el caso más tÍpico es cuando utilizamos push buttons en nuestros proyectos.

El debounce es ruido que se produce al hacer falso contacto cuando se presiona un interruptor mecánico.

Hay casos donde el rebote puede ser muy significativo por ejemplo si nuestro proyecto hace que se dispare un interrupción cuando se presiona el interruptor, el rebote puede hacer que la interrupción se dispare muchas veces en la misma acción (por supuesto siempre dependiendo que como esté configurado la forma de disparo de la interrupción).

Para resolver esto tenemos básicamente 2 métodos: uno a través de hardware y otro a través de software, que, según la situación podemos utilizar el método que nos parezca más conveniente, en mi caso cuando utilizo botones en los proyectos prefiero controlar el rebote a través de hardware, para evitar algunas lineas de código y también podemos tenerlo en cuenta según la memoria disponible que tenga nuestro microcontrolador o placa de desarrollo.


Eliminación del debounce por hardware:

A través de hardware lo podemos eliminar agregando un circuito a los pulsadores cuyo principal componente es el CD4584BE ó el SN74LS14N ambos son HEX SCHMITT TRIGGER.

 

Eliminación del debounce por software:

En el caso de la eliminación del rebote por software lo haremos contando el tiempo a partir del momento en que se acciona el interruptor y comparando el tiempo transcurrido entre pulsaciones.

Por ejemplo si arbitrariamente determinamos que el tiempo de una pulsación es de 200 milisegundos entonces podremos descartar todas las pulsaciones que se produzcan antes de los 200 milisegundos a partir del momento que se accionó el interruptor.

Supongamos el siguiente circuito con nuestra placa de desarrollo:

 



//Mario A. Campos
//desarrolloymicrocontroladores.blogspot.com
//en este caso vamos a usar un pulsador (push button)
int contador=0;    //almacena la cantidad de veces que se acciona el pulsador
int tecla;    //almacena el estado del pulsador
int teclaanterior=0;    //almacena el estado anterior del pulsador
long tiempo=0;

void setup() {
pinMode(2,INPUT);
Serial.begin(9600);
}

void loop() {

tecla=digitalRead(2);

//cuando los estados son distintos o sea que el pulsador se presionó o estaba presionado y se soltó
if (tecla!=teclaanterior){
//si estaba presionado (teclaanterior) y se soltó (tecla)
if(tecla==0 && teclaanterior==1){
//evaluamos el tiempo que transcurrió desde esa misma condición
//en este caso todos los rebotes que se produzcan dentro de los 15 milisegundos son excluídos
if(millis()-tiempo>15){
contador++;
Serial.println(contador);
}
}
//actualizo el estado de la tecla
teclaanterior=tecla;
//actualizo el tiempo
tiempo=millis();
}
}
 




 

Comentarios