Guía definitiva para evitar rebotes en Switch (Parte 3)
HogarHogar > Blog > Guía definitiva para evitar rebotes en Switch (Parte 3)

Guía definitiva para evitar rebotes en Switch (Parte 3)

Jun 15, 2024

En la Parte 1 de esta miniserie, presentamos el concepto de rebote del interruptor; es decir, cuando abrimos (desactivamos) o cerramos (activamos) un interruptor, puede realizar múltiples transiciones antes de finalmente establecerse en su nuevo estado (consulte también mis columnas Tipos de interruptor y Terminología de interruptor). También notamos que esto ocurre en interruptores de palanca, interruptores basculantes, interruptores de botón, etc., prácticamente en todo, excepto en los interruptores que la mayoría de nosotros nunca usamos, como los interruptores basculantes de mercurio, por ejemplo.

En la Parte 2, profundizamos en el rebote asociado con los interruptores de palanca unipolares, unidireccionales (SPST) y unipolares y bidireccionales (SPDT), incluidos algunos datos empíricos sobre cuánto tiempo podría persistir el rebote del interruptor, qué tan amplio Podrían ser los pulsos de rebote individuales y cuántos rebotes podríamos esperar ver. Además, introdujimos el punto de que cualquiera que sea la técnica que utilicemos para abordar el rebote del interruptor (preprocesar la señal en hardware o posprocesarla en software) es importante que la técnica no se deje engañar por el ruido ocasional "fallo" o "pico". causado por diafonía, EMI (interferencia electromagnética), RFI (interferencia de radiofrecuencia) o ESD (descarga electrostática).

La solución de rebote del interruptor no debe dejarse engañar por el ruido (Fuente de la imagen: Max Maxfield)

En este diagrama, la resistencia R1 actúa como una resistencia pull-up. Cuando el interruptor está abierto, R1 eleva la señal NO hasta un valor +ve (lógico 1). Cuando el interruptor está cerrado, pone en cortocircuito la señal NO a 0V (0 lógico).

Ahora, en la Parte 3, hemos llegado al punto donde “la goma se encuentra con el camino”, metafóricamente hablando. Aquí es donde comenzamos a considerar varias soluciones para nuestros interruptores de rebote.

Hardware versus software (un poco de historia)

Cuando los microprocesadores aparecieron por primera vez en escena a principios y mediados de la década de 1970, había un número relativamente grande de ingenieros de diseño de hardware electrónico, pero relativamente pocos desarrolladores de software, y la mayoría de los chicos y chicas que conocían el software trabajaban en el “gran negocio”. iron” en computadoras centrales o en minicomputadoras.

Los microprocesadores de aquella época estaban limitados en términos de memoria y ciclos de reloj (es decir, tenían frecuencias de reloj relativamente bajas, por lo que cada ciclo de reloj era un tesoro). Gran parte de la programación se realizó minuciosamente utilizando lenguaje ensamblador y, solo para aumentar la diversión y la frivolidad, gran parte del código fue creado por ingenieros de diseño de hardware que normalmente no estaban familiarizados con la programación en general ni con las buenas prácticas de programación en particular.

Todo lo anterior explica por qué muchas de las primeras soluciones al problema del rebote del conmutador estaban basadas en hardware, pero espera, hay más...

La serie 74xx de circuitos integrados de lógica transistor-transistor (TTL) de Texas Instruments (TI) apareció por primera vez en escena a mediados de la década de 1960. En la década de 1970, las placas de circuito impreso (PCB) equipadas con estos dispositivos (y familias similares de otros proveedores) eran omnipresentes.

Cada dispositivo 74xx normalmente contenía un puñado de funciones o puertas lógicas Jellybean. Por ejemplo, el 7400 contenía cuatro puertas NAND de 2 entradas; el 7474 contenía dos flip-flops tipo D activados por flanco positivo, cada uno con su propio preajuste asincrónico y claro; y el 74118 contenía seis pestillos SR.

El punto es que una PCB podría contener cientos de estos dispositivos 74xx y, casi invariablemente, había funciones que no se utilizaban: una puerta NAND aquí, un pestillo SR allá, tal vez incluso un flip-flop tipo D cuyo paradero no se tenía en cuenta.

Los ingenieros de diseño de hardware vieron estas funciones lógicas no comprometidas como un “juego limpio” para usarlas en la lucha contra el rebote de sus interruptores. Una pequeña "mosca en la sopa", por así decirlo, es que no era raro terminar con cada interruptor rebotado usando una técnica diferente dependiendo de quién estaba haciendo el diseño y qué puertas lógicas y funciones sobrantes estaban disponibles. .

Con el tiempo, la lógica digital se consolidó cada vez más en cada vez menos dispositivos, reduciendo así la cantidad de funciones simples de “lógica adhesiva” que estaban sobrantes. Además, el tamaño de la memoria de los microprocesadores aumentó, las frecuencias de reloj aumentaron y cada vez más personas comenzaron a desarrollar software.

Por todas estas razones, se volvió cada vez más común abordar el rebote del interruptor en el software. El único pequeño problema aquí es que la mayoría de los desarrolladores de software desconocían por completo que los interruptores rebotaban; al menos lo sabían hasta que sus sistemas no funcionaban cuando era necesario, funcionaban cuando no era necesario o funcionaban de forma intermitente, momento en el que preguntaban. Los ingenieros de hardware supieron lo que estaba pasando y comenzaron una curva de aprendizaje empinada.

Algunas de las soluciones creadas por desarrolladores de software son ridículamente simplistas, mientras que otras son tremendamente intrincadas y complejas (lo que no significa que funcionen tan bien como cabría esperar), pero llegaremos a ellas en un rato. Primero, reflexionemos y reflexionemos sobre el aspecto del hardware...

Antirrebote del hardware tradicional: redes RC

La solución antirrebote de hardware más sencilla se basa en el uso de una red de resistencia-condensador (RC). La constante de tiempo RC de la red RC, también llamada tau (τ), se mide en segundos y es igual al producto de la resistencia (en ohmios) y la capacitancia (en faradios).

Carga y descarga de una red RC (Fuente de la imagen: Max Maxfield)

Cuando se aplica un voltaje CC a la red RC, luego de 1RC el capacitor se habrá cargado a aproximadamente el 63% de su valor final, y después de 5RC el capacitor se habrá cargado a aproximadamente el 99% de su valor final. De manera similar, cuando el capacitor se está descargando, luego de 1RC habrá alcanzado aproximadamente el 37% de su valor final, y después de 5RC habrá alcanzado aproximadamente el 1% de su valor final.

Podemos usar una variación de este circuito para suavizar los rebotes del interruptor como se muestra a continuación. Cuando cerramos el interruptor, es como si lo reemplazáramos con un trozo de cable conductor y el capacitor se descarga a través de la resistencia R2, por lo que la constante de tiempo RC es (R2 * C1). Cuando abrimos el interruptor, es como si lo sacáramos del circuito y el capacitor se carga a través de las resistencias R1 y R2, por lo que la constante de tiempo RC es ((R1 + R2) * C1).

Uso de una red RC para evitar el rebote de un interruptor de palanca (Fuente de la imagen: Max Maxfield)

Observe que, si los valores de resistencia y condensador se seleccionan correctamente, cualquier pico de ruido se suavizará hasta convertirse en puntos insignificantes. El rebote del interruptor superpondrá una ondulación en el valor de VC, pero, nuevamente, esto se suavizará si los valores de resistencia y capacitor se seleccionan correctamente.

¿Cuál es la mejor manera de seleccionar estos valores? Bueno, en este caso voy a tomar el camino de la comadreja y me referiré a la parte “Haciendo los cálculos” del artículo de Jack Ganssle (puedo recordarles el viejo dicho que dice que “Las águilas pueden volar, pero las comadrejas rara vez son absorbidas por el motores de jet").

Uno de los problemas con la solución que se muestra arriba es que el tiempo de carga cuando el interruptor está abierto (desactivado) es mayor que el tiempo de descarga cuando el interruptor está cerrado (activado). Puede que esto no sea un problema para muchas aplicaciones en las que la activación del interruptor se considera la parte importante del proceso, pero si es necesario acortar el tiempo de desactivación, esto se puede lograr agregando un diodo como se ilustra a continuación.

Agregar un diodo a la red RC (Fuente de la imagen: Max Maxfield)

Simplemente por el bien de la discusión, supongamos que nuestro valor +ve es 5V. Supongamos también que comenzamos con nuestro interruptor abierto y el capacitor cargado a 5V. Esto significa que cuando cerramos el interruptor, el cátodo del diodo (k) está a 5V, mientras que su ánodo (a) está a 0V. Esto significa que el diodo tiene polarización inversa, lo que significa que no conducirá, lo que significa que es como no tenerlo ahí en primer lugar. Una vez más, el condensador se descarga a través de la resistencia R2.

En comparación, cuando finalmente abrimos el interruptor nuevamente (después de que el capacitor se haya descargado), el cátodo del diodo estará en los 0 V del capacitor y el diodo tendrá polarización directa desde el suministro de 5 V que llega a través de R1. Mientras la diferencia de potencial se mantenga por encima de la caída de voltaje directo del diodo, el diodo conducirá y parecerá un cortocircuito, como si fuera reemplazado por un trozo de cable. Dado que efectivamente hemos cortocircuitado R2, es como si esta resistencia hubiera sido eliminada del circuito, por lo que el capacitor se carga solo a través de la resistencia R1.

En el caso de un pequeño diodo de silicio que funciona a sus corrientes nominales, su caída de voltaje directo es de aproximadamente 0,6 a 0,7 voltios (el valor es diferente para otros tipos de diodos; los diodos Schottky pueden tener valores tan bajos como 0,2 V, mientras que los diodos de germanio están en el rango de 0,25 a 0,3 V). Por lo tanto, suponiendo un pequeño diodo de silicio con una caída de tensión directa de 0,7 V, el único momento en que R2 entrará en juego será cuando el condensador esté cerca del final de su ciclo de carga, cuando su tensión alcance 4,3 V, que es mucho después de la momento en el que habremos registrado el interruptor como abierto.

Todavía tenemos un último punto que reflexionar con respecto a nuestra solución antirrebote RC: el hecho de que la señal VC tiene tiempos de subida y bajada lentos. Las funciones digitales prefieren ver las señales presentadas en sus entradas por debajo de un cierto valor considerado un 0 lógico, o por encima de un cierto valor considerado un 1 lógico. Estos valores varían según la tecnología (por ejemplo, TTL frente a CMOS). ) y la tensión de alimentación (p. ej., 5,0 V frente a 3,3 V). En el caso de TTL estándar con alimentación de 5 V, cualquier señal inferior a 0,8 V se considerará un 0 lógico, mientras que cualquier señal superior a 2,0 V se considerará un 1 lógico.

Cuando se trata de un sistema basado en microcontrolador, estos valores también varían según el microcontrolador (MCU) en cuestión. En el caso de la MCU ATMega328 de Atmel (ahora Microchip Technology), que se utiliza en Arduino Uno, por ejemplo, cualquier valor presentado a una entrada digital que esté por debajo de 1,5 V o por encima de 3,0 V se considerará un 0 lógico o un 0 lógico. 1, respectivamente.

El punto de todo esto es que a las funciones digitales en general, y a los microcontroladores en particular, no les gusta ver señales de entrada deambulando en la región indefinida entre un 0 lógico "bueno" y un 1 "bueno" lógico. porque la subida o bajada gradual de la señal que sale de la red RC pasa mucho tiempo (relativamente hablando) en esta "zona prohibida".

Afortunadamente, allá por 1934, un joven estudiante de posgrado llamado Otto Herbert Schmitt inventó algo que ahora conocemos como disparador Schmitt (esta invención fue el resultado del estudio de Otto sobre la propagación de impulsos neuronales en los nervios de los calamares). La mejor manera de describir esto es mediante una figura como se ilustra a continuación.

Búfer estándar frente a búfer de activación Schmitt (Fuente de la imagen: Max Maxfield)

Un búfer estándar tiene un solo umbral de conmutación, lo que significa que una señal ruidosa, incluida una señal con un poco de ondulación, puede provocar múltiples transiciones en la salida. En comparación, un búfer de disparo Schmitt (es decir, un búfer con una entrada de disparo Schmitt) tiene dos umbrales. La salida cambia solo cuando la entrada cruza el umbral superior o el umbral inferior. Esta acción de doble umbral se llama histéresis (la dependencia del estado de un sistema de su historia), lo que implica que el disparador posee memoria.

En el caso de la red RC que estamos usando como un circuito antirrebote de interruptor SPST simple, agregaríamos un búfer de activación Schmitt entre la red RC y el microcontrolador como se ilustra a continuación.

Agregar un búfer de activación Schmitt a la red RC (Fuente de la imagen: Max Maxfield)

Como último punto, quizás deberíamos señalar que la razón por la que hemos mostrado un buffer de disparo Schmitt no inversor es para mantener las cosas simples (es decir, todas las señales subiendo y bajando en la misma dirección general). En realidad, sería más común utilizar un buffer de activación Schmitt inversor, porque las funciones inversoras son más rápidas que sus contrapartes no inversoras.

Si usáramos un buffer inversor, entonces tendríamos que “intercambiar cosas” en el software. Es decir, en lugar de considerar que un 0 lógico representa el cierre del interruptor, ahora consideraríamos un 1 lógico que indica este estado del interruptor, y viceversa.

Llámame pedante si quieres

Me temo que me he excedido un poco con mi descripción del circuito antirrebote RC, sobre todo porque tenemos muchas otras técnicas de antirrebote de hardware disponibles para nosotros. Sin embargo, el propósito de estas columnas es responder las preguntas inquietantes de todos. Como parte de esto, quiero explicar el lado del hardware de tal manera que la gente del software pueda entender lo que está pasando y, cuando finalmente lleguemos a alguna solución de software, explicarla de tal manera que la gente del lado del hardware de la valla pueden entender de qué estamos hablando.

También recuerdo cómo era cuando estaba empezando. La gente incluía cosas en la conversación (o descripciones escritas) sin explicación, esparciendo términos como “sesgo inverso” y “caída de tensión directa” y “disparador Schmitt” como si fueran confeti, asumiendo que yo tenía una idea de lo que estaban hablando. Es triste decirlo, pero a menudo se trataba de una suposición injustificada.

¿Qué opinas? ¿Te gusta la forma en que cubro las cosas o te gustaría que acelere el ritmo?