Botones de rebote

32

Recientemente leí un artículo sobre la eliminación de rebotes de botones y me preguntaba si debería tener esto en cuenta al trabajar con, por ejemplo, un Arduino (ATMega mC). Supongo que es un problema, especialmente cuando se trabaja con interrupciones.

Entonces, ¿es mejor detectar el rebote en el código, o debería solucionarse esto con el hardware? Por favor elabora.

Vincent Van Den Berghe
fuente

Respuestas:

17

Recomiendo encarecidamente conectar un osciloscopio (con suerte, tiene uno o puede tener uno en sus manos para usar) hasta su interruptor. He visto un proyecto de un estudiante que tuvo un rebote en su interruptor que pasó de 5v a -5v hasta 4v a -3v y luego a 2v y luego a 0v. Cuando miramos el sorteo actual en un osciloscopio, hubo algunos picos muy, muy grandes.

En su caso particular, era muy, muy necesario para él, renunciar a su interruptor en hardware.

Sin embargo, por otro lado, he visto interruptores que tienen un efecto mucho más pequeño que podría eliminarse fácilmente en el software.

Sin embargo, debe sopesar sus opciones. Si tiene una cantidad muy compleja de firmware, agregar la sobrecarga tanto para usted como programador como para el uso de la CPU puede no valer la pena y sería mejor simplemente agregar un poco de hardware. Ahora, por otro lado, si está tratando de reducir los costos y el tamaño, querrá eliminar la mayor cantidad de hardware posible y hacerlo todo en el firmware si puede.

Kellenjb
fuente
Alcancé una imagen del cambio de interruptor y la publiqué en Wikipedia: en.wikipedia.org/wiki/File:Switch_bounce.JPG
Thomas O
@Thomas O esa es una imagen muy divertida de rebote. Solo quiero asegurarme de que @Vincent Van Den Berghe entienda que no todos los rebotes se verán así. Ese rebote está limitado a 0-5v, no siempre se verá así.
Kellenjb
2
@Thomas O, como nota al margen, hemos creado una práctica de reprobar a los estudiantes que toman imágenes de Oscope así. Flash en una pantalla es horrible. También damos un paso más y empujamos a los estudiantes a recopilar puntos de datos reales, usando algo como un CSV o una vista de laboratorio, para que luego pueda usarse fácilmente en informes y análisis de datos.
Kellenjb
@ Kellenjb, pronto obtendré una impresora para mi alcance que es compatible con HP-IB. También descubrí que el modo "Deportes" en mi cámara puede tomar buenas imágenes de la pantalla del alcance sin flash y sin desenfoque.
Thomas O
1
@Lundin En un entorno en tiempo real, depende mucho de las interrupciones. Si presiona un botón en una interrupción, realmente no desea que su sistema en tiempo real sea interrumpido varias veces presionando un solo botón. Tampoco querrás tener que dedicar recursos para esperar 10 ms.
Kellenjb
15

Si eres un diseñador profesional de electrónica, es probable que tu jefe ni siquiera te permita hacerlo en hardware. La razón es simple: si su lote de producción es lo suficientemente grande, el software es virtualmente gratuito , mientras que el hardware debe pagarse por cada unidad que produce. Y aunque las resistencias y los condensadores son muy baratos, montarlos en una PCB puede costar hasta 20 veces su precio de compra.

Ya sea que renuncie en software o hardware, aún tiene que seleccionar botones de calidad. El infame botón de 157 ms del artículo simplemente no es apto para ninguna aplicación.
Por lo general, pruebo el botón a intervalos de 32 ms , que es suficiente para cerrar el tiempo de rebote de cualquier botón bueno. Soy un gran admirador de los interruptores Alps SKQG TACT.

Interruptor táctil Alps

En los pocos dispositivos que probé, tuvo un tiempo de rebote inicial de menos de 10ns. Si bien tiene una vida operativa de 100 000 ciclos, lo probamos durante 200 000 ciclos e incluso entonces el rebote de 32 ms fue suficiente. (Supongo que debería haber medido el nivel real de rebote, pero nuestro interés principal en ese momento era el comportamiento del producto final. De todos modos, lo estábamos usando fuera de las especificaciones).

Si realmente desea una solución de hardware, secundo la solución flip-flop SR mencionada en el artículo como la mejor solución técnica:

circuito antirrebote

El flip-flop se puede construir con una puerta NAND dual , que está disponible en un pequeño paquete VSSOP8, por ejemplo. El principal inconveniente de esta solución es que necesita un botón SPDT, donde SPST está mucho más disponible.

stevenvh
fuente
12

Hay muchas (y muchas) formas diferentes de eliminar los botones. Si lo hace en software o hardware dependerá de los requisitos de su proyecto y del tipo de conmutador.

Aquí hay algunos enlaces a diferentes métodos:

http://www.ganssle.com/debouncing.htm

http://hackaday.com/2010/11/09/debounce-code-one-post-to-rule-them-all/

Toby Jaffey
fuente
Iba a buscar un enlace a Ganssle cuando vi la pregunta.
Kortuk
El artículo de Ganssle fue la razón por la que hice esta pregunta, está vinculada en mi pregunta :) Gracias por el enlace a los fragmentos de código antirrebote.
Vincent Van Den Berghe
¿Le importaría resumir algunos casos de uso para ilustrar cuándo usar software / hardware? (esto es probablemente subjetivo, pero me gustaría algunos ejemplos de todos modos)
Vincent Van Den Berghe
1
@ Vincent, Kellenjb resumió en su respuesta cómo decidir. No hice clic en su enlace porque tenía un nombre gracioso, ¡ahora que lo hice, veo Ganssle!
Kortuk
Si esa es la regla general / de consenso, entonces no hay necesidad de más ejemplos.
Vincent Van Den Berghe
6

Ese artículo es la "biblia" sobre el rebote. El rebote de contacto puede ser un problema con cualquier aplicación.

En general, es mejor eliminar los interruptores en el software, ya que es más fácil ajustar los retrasos para interruptores particulares, ya que difieren en la cantidad de rebote de contacto. A menudo, también es necesario cancelar la liberación de la clave. Los fabricantes de interruptores a menudo especifican la cantidad de rebote para sus productos, por lo general es de alrededor de 10 ms a 20 ms.

Leon Heller
fuente
¿Por qué la gente vota por esto?
Toby Jaffey
Buen punto sobre la liberación de teclas de rebote!
Vincent Van Den Berghe
1
No lo rechacé, pero solo decir que lo haga en software es una idea horrible. Es una buena idea caracterizar.
Kortuk
Dije "en general", que es el caso, y di la razón. También minimiza el costo de la lista de materiales y aumenta la confiabilidad.
Leon Heller
solo aumenta la confiabilidad si la señal se mantiene dentro de los límites seguros de su controlador. Esta acción aumentará la fiabilidad si disminuye el recuento de componentes sin aumentar el desgaste de los componentes. No estaba diciendo que no estaba de acuerdo con el concepto de sus publicaciones, pero trabajo constantemente con los ingenieros que acaban de llegar al campo y con una respuesta como esta, y rechazarán todo en el software. Siempre debes caracterizar. Tampoco lo voté negativamente, pero tampoco lo voté, creo que una respuesta amplia como el software corre el riesgo de que los nuevos desarrolladores arriesguen su hardware.
Kortuk
1

El rebote del interruptor puede continuar durante decenas de milisegundos. Si está sondeando un interruptor de una rutina de interrupción que se ejecuta en un temporizador, el rebote no será un problema, porque incluso si sondea el interruptor en medio de una tormenta de rebote, puede obtener el nuevo estado de inmediato o, en el peor de los casos, obtenga el estado anterior y no vea el estado nuevo hasta la próxima encuesta basada en temporizador. La encuesta de un ISR cronometrado como este constituye una forma de rechazo del software.

Sin embargo, si está utilizando ese interruptor para provocar la interrupción, y espera que la rutina de servicio de interrupción se ejecute rápidamente, en menos de 10 milisegundos, necesitará eliminar el rebote del hardware, de lo contrario, un evento de interruptor podría resultar en un número algo aleatorio de interrumpe, y ciertamente a menudo más de lo esperado. Por otro lado, si la rutina de interrupción se ejecuta el tiempo suficiente, el rebote del interruptor se habrá solucionado antes de que finalice el ISR, y estaría bien, pero la mayoría de los ISR bien construidos no tardan tanto.

JustJeff
fuente
Tener el interruptor para causar la interrupción es una buena idea. Pero una vez que lo obtenga, no permita más interrupciones; apáguelos y, en su lugar, inicie un temporizador para el tiempo de rebote especificado.
Lundin
@Lundin: si hay temporizadores disponibles, puede usar el temporizador para implementar el enfoque sondeado y no molestarse en que el interruptor genere interrupciones.
JustJeff
0

La mejor manera de hacer cualquier cosa es la que más le convenga. Pero cuando ya tiene un microcontrolador, puede renunciar al software con el costo de un esfuerzo de código.

La forma más fácil de eliminar el rebote en el software es verificar los botones en momentos que están más separados que el tiempo de rebote más largo. 50 ms parece ser un límite superior en el tiempo de rebote de los interruptores 'normales', por lo que cuando puede organizar su software de esta manera, está en claro:

forever loop
   wait (at least) 50 ms
   check buttons
   do procesing
end loop
Wouter van Ooijen
fuente
Y use los temporizadores en chip en su MCU para esto.
Lundin
Por supuesto, eso es posible, pero puede escribir muchos programas sin ellos.
Wouter van Ooijen
3
El software profesional en productos de calidad siempre utilizará temporizadores en chip. Los aficionados pueden salirse con la suya con "NOP" para encuestas de bucle o de espera muerta. Pero no hay ninguna razón para hacerlo en productos reales, sin importar sus requisitos en tiempo real. "No sé cómo funciona el temporizador y este bucle inactivo tarda 10 segundos en escribir mi yo perezoso" no es un argumento válido para un ingeniero.
Lundin
Cojones. Los profesionales deben ser efectivos, lo que (según el proyecto en cuestión) puede significar (entre otras cosas) 'usar el hardware de la manera más efectiva posible' o 'usar el tiempo del profesional de la manera más efectiva posible'. Por lo tanto, su llegada ciertamente se aplica en algunos casos (probablemente todos los casos con los que ha tratado) ciertamente no se aplica en todos los casos.
Wouter van Ooijen
Implementar el temporizador en chip toma como máximo una hora de su tiempo. Esto no es algo complejo, es la ingeniería diaria de pan y mantequilla. ¿Ni siquiera puede invertir una hora en su proyecto para obtener una solución significativamente mejor y una mejor calidad general? Sí, bueno ... si no sabes mucho sobre programación, podría llevarte una semana. Pero quizás no deberías estar trabajando con el software en primer lugar ... o quizás deberías trabajar más con él, para que aprendas a implementar esta pequeña cosa simple en poco tiempo.
Lundin
0

Un enfoque para eliminar el rebote que aún no se ha mencionado es usar un interruptor de doble tiro con un tiro atado a VDD y el otro a tierra. Introduzca eso en un pin que (ya sea a través de software o hardware) será arrastrado débilmente a su estado actual. Tal enfoque proporcionará las ventajas de un interruptor de doble tiro, pero solo requerirá un pin de E / S en lugar de dos.

Super gato
fuente