Antirrebote de interrupción para sensor de interruptor

Quiero leer el estado de un sensor de interruptor (contacto magnético). Estoy pensando en conectar el interruptor entre un pin de interrupción de mi micro y tierra, escuchando el estado de CAMBIO. De esta manera tengo problemas de rebote, así que me pregunto cuál es la mejor manera de lidiar con este problema:

1 - Deshabilite la escucha de interrupción cuando se dispara y habilítela después de que el programa haya leído el valor (0 ->tierra->interruptor cerrado O 1->flotante->interruptor abierto) No creo que un estado flotante pueda ser bueno, pero si configuro el pin de entrada de interrupción como INPUT_PULLUP, ya no flota y podría ser bueno, ¿verdad?

2 - Conectar el interruptor a un pin de interrupción y también a un pin de entrada digital a través de un transistor como interruptor. De esta manera, cuando se dispara la interrupción, leo el valor del pin de entrada digital. Por otro lado, de esta manera complico el circuito.

3 - Para usar un circuito antirrebote de hardware

¿Son válidas estas tres soluciones? ¿Hay alguno mejor que estos?

MÁS CONTEXTO: estoy usando estos interruptores como interruptor de límite para una puerta de garaje. En mi código, estoy usando un temporizador para levantar la puerta del garaje durante diez segundos O hasta que se active la interrupción del interruptor de límite

EDITAR: con un cambio en mi código resolví el problema usando interrupciones. Sin embargo, sugiere usar el sondeo ya que no es una aplicación en tiempo real, así que me pregunto: ¿no es mejor usar interrupciones para que pueda usar un modo seguro de energía para mi micro y despertarlo solo cuando una interrupción de hardware? se desencadena? Si uso una solución de sondeo, el sistema no sería adecuado para el suministro de energía de la batería; ¿no es así?

Por lo general, es más dolor de cabeza de lo que vale usar interrupciones de cambio de pin para eliminar el rebote. Sin embargo, las circunstancias importan, por lo que no puedo hacer una declaración general al respecto. Por lo general, prefiero configurar un temporizador de intervalo de "latido" que se usa para sondear y eliminar el rebote de la entrada, publicando valores de estado actual y eliminados para el interruptor, que luego pueden ser examinados por el código de la aplicación según sea necesario. Hay ocasiones en las que la eliminación de rebotes de hardware puede lograr cosas que ninguna cantidad de software puede lograr también. De nuevo, las circunstancias y los detalles importan. ¿Proporcionar más contexto aquí?

Respuestas (3)

La verdadera respuesta es que no deberías usar interrupciones para esto en absoluto. Debe conectar el interruptor a un pin de entrada y sondear el pin periódicamente. El período de sondeo debe ser mayor que el intervalo de tiempo durante el cual disminuye el transitorio de conmutación (rebote).

Además, debe levantar su pin con una resistencia pull-up. Simplemente conectar el interruptor entre GND y el pin no es suficiente; Algunos microcontroladores tienen resistencias pull-up internas que puede activar desde el software, por lo que no necesita usar una externa.

Ahora que ha dado más contexto, ni siquiera entiendo por qué está preocupado por el rebote en primer lugar. Si apaga el motor 5 veces en 10 ms, ¿entonces qué? Se apaga de cualquier manera, y ese es el punto. Simplemente sondee el pin con 100 ms y estará bien; Ponga un sueño de 100 ms en un ciclo de tiempo que cicla mientras el pin está HI y su temporizador no se ha desbordado. O si está utilizando un sistema operativo, use el programador; Cree un temporizador periódico con un período de 100 ms y programe una tarea para que se ejecute después de 10 s, lo que establece un bool. Compruebe el pin y la variable en el temporizador periódico.
Estás comentando tu propia respuesta. Haga clic en el enlace de edición debajo de la pregunta y agréguelo como una actualización.
Usted dice "Se apaga de cualquier manera, y ese es el punto". En teoría, cuando el contacto magnético está cerrado, debería leer BAJO y viceversa; debido al rebote, noté que algunas veces la lógica se invierte y el último valor que leí sigue siendo BAJO incluso si el interruptor está abierto nuevamente
Tu diseño es LO activo, ¿verdad? El interruptor se vuelve corto cuando la puerta debería detenerse, ¿verdad? ¿Ya pusiste la resistencia pull-up, porque causaría exactamente el problema que acabas de describir si no lo has hecho?
Sí, el pin de interrupción de entrada se declara como INPUT_PULLUP
¿No es mejor usar interrupciones para poder usar un modo seguro de energía para mi micro y activarlo solo cuando se activa una interrupción de hardware? Si uso una solución de sondeo, el sistema no sería adecuado para el suministro de energía de la batería; ¿no es así?

Estoy usando estos interruptores como interruptor de límite para una puerta de garaje. En mi código, estoy usando un temporizador para levantar la puerta del garaje durante diez segundos O hasta que se active la interrupción del interruptor de límite.

Esta es una aplicación de baja velocidad y no se requiere una interrupción para dar una parada adecuada. El tiempo de desaceleración del motor será cientos de veces más largo de lo que un simple circuito de sondeo de entrada y antirrebote podría manejar cómodamente.

Coloque los interruptores de límite un poco hacia atrás desde el final del recorrido y ajústelos para que la puerta se detenga en las posiciones correctas de apertura y cierre.

Pienso en estos pocos puntos

  • ¿Tiene que preocuparse por el rebote cuando simplemente espera hasta que la puerta toque el sensor por primera vez?
  • El circuito de hardware podría ser tan fácil como el filtro RC. RC Filter ayuda mucho y es muy simple.
  • Si el cable de su sensor es más largo que un pie, recomendaría un pull-up externo para generar al menos 10 mA. Es mucho más robusto contra EMP causado por tormentas, etc.
  • La interrupción es mejor para eventos muy cortos, como milisegundos o menos. Levantar la puerta de su garaje seguramente llevará más tiempo. Recomendaría la lectura de pines cada, digamos, 20 ms. El viejo ZX Spectrum hace lo mismo. Al menos es un buen comienzo.

El filtro RC con pull up externo y antirrebote de software es la mejor opción aquí. Si lee el mismo valor después de 20 ms, puede estar seguro de que es correcto

Volviendo a tus preguntas:

  1. Creo que pasarás mucho tiempo afinando esto.
  2. Como dices, esto complica las cosas. También desperdicias más alfileres.
  3. El filtro RC con puerta Schmidt es la opción HiFi, pero innecesaria en este caso.

De todos modos, ganas experiencia al fallar. Eso es, después de todo, lo que cuenta.