Dónde colocar el circuito antirrebote para botones remotos y codificadores giratorios

Tengo una aplicación en la que un botón pulsador y un codificador giratorio de código gris mecánico (entradas de usuario) deben montarse lejos de la placa de circuito impreso principal. 24" - 48" de distancia. Esto es por razones de espacio y embalaje.

¿Está bien tener el circuito RC antirrebote en la PCB y los interruptores/codificador conectados de forma remota a través de un cable, o es necesario que el circuito antirrebote esté con los interruptores?

Circuito codificador de la hoja de datos:

ingrese la descripción de la imagen aquí

Respuestas (3)

El antirrebote (y cualquier filtrado de ruido, circuitos de protección ESD) debe estar en la PCB principal.

Los interruptores en sí mismos no necesitan nada local, ni sería óptimo tener circuitos adicionales allí.

Editar: si el codificador de código Gray está activo (óptico o magnético), algunos circuitos remotos podrían ser útiles, sin duda, derivación de suministro, tal vez algunas resistencias en serie en las salidas, tal vez incluso un regulador de suministro local.

El codificador es del tipo mecánico.
Entonces, no te preocupes. Pero preocúpese por ESD de los dedos, etc. Además, RC no es un circuito antirrebote a menos que se combine con una entrada de disparador Schmitt. RC puede usarse por otras razones (filtrado y ESD), pero el rebote es fácil y bueno en el firmware. Si requiere un antirrebote externo, es posible que esté haciendo algo mal (como usar interrupciones de cambio de puerto en lugar de encuestas).
Mi dispositivo usa una máquina de estado controlada por eventos y el botón y el codificador rotatorio usan interrupciones. Estoy usando el circuito de "rebote" sugerido en la hoja de datos; lo agregué a mi pregunta.
Sugiero usar sondeos a <1kHz, no interrupciones. Sus eventos serían los cambios sin rebote de la rutina de sondeo (impulsada por interrupciones del temporizador).
Necesito ver cómo afectará eso a mi código. Se deberá agregar la rutina de sondeo al ciclo principal de cada estado. Tal vez necesito crear un hilo de sondeo separado. Aunque, las entradas impulsadas por interrupción actual funcionan con el sistema.

Como mencionó "aplicación", supondré que está ejecutando un código aquí que monitorea los botones y contactos. Si ese es el caso, puedo decirle desde mi experiencia que es mejor hacer su eliminación de rebotes mediante programación. Considere desarrollar una función a la que llame de vez en cuando para verificar si hay pulsaciones de botones. Sin profundizar en ningún lenguaje en particular, lo que haría la función es esto...

  1. Como una inicialización única, configure una variable al valor del temporizador de milisegundos de su sistema, y ​​tal vez inicialice una 'variable de botón' estática , como un mapa de bits de todos sus botones, y configúrelo en cero (o "-1" si "ALTO " es el estado predeterminado de sus botones). Además, inicialice dos variables, una para representar su tiempo de rebote en milisegundos (comience con 20, por ejemplo).
  2. Cuando su aplicación llama a su función, debe marcar el botón (o varios botones). Si ningún botón ha cambiado de estado en comparación con su variable almacenada, simplemente devuelva la variable de estado del botón almacenado existente.
  3. Si algún botón ha cambiado de estado, verifique el temporizador de milisegundos de su sistema actual, reste el tiempo almacenado en la variable del temporizador que inicializó previamente. Si la diferencia es menor que su tiempo de rebote, simplemente ignore el cambio y devuelva la variable de estado del botón sin modificar.
  4. Si llega a este paso, entonces uno o más botones HAN cambiado de estado, Y al menos ha pasado el tiempo de rebote especificado. En este caso, almacene el nuevo estado del botón en el mapa de bits de su botón, reinicie el temporizador a la hora de milisegundos del sistema actual y devuelva la variable del botón.

Eso es todo lo que hay también. No solo se ha ahorrado al menos 2 componentes por botón (la red RC), y ha creado efectivamente un filtro de "pared de ladrillos", mucho más preciso y consistente de lo que sería la red RC. Además, ha hecho que sea muy fácil cambiar el importante tiempo de rebote sin desoldar las piezas.

Una nota sobre esta metodología, también es posible llamar a una función similar por interrupción en lugar de llamarla como parte de una secuencia de turnos rotativos en el bucle de su programa principal. En mi opinión, esta NO es una buena idea, porque un contacto ruidoso defectuoso generaría muchas interrupciones que podrían atascar fácilmente su programa. Por lo general, en sistemas más grandes donde una interrupción en realidad informa pulsaciones de botones (como una interrupción de teclado en una computadora), las pulsaciones de botones ya han sido preprocesadas por una pequeña MCU dedicada en el propio teclado. Si lo está haciendo en un sistema más pequeño y haciendo TODO el rebote usted mismo, el método que sugiero es una mejor opción.

Me gusta el enfoque del software, pero estoy usando interrupciones para el botón y el codificador. La aplicación es una "máquina de estado impulsada por eventos".
Probablemente aún pueda configurar una interrupción de temporizador que se active con la frecuencia que haya elegido, lo que hace que la función que sugiero sea aún más fácil. :-) Cuando se encuentra un cambio de botón, ya se confirma como eliminado, en virtud de la velocidad del temporizador. Una vez detectado, puede poner en cola directamente un estado pendiente en su máquina de estado. Supongo que simplemente no me gusta la respuesta psudo de "integración" de los filtros RC para eliminar rebotes, y creo que es un poco tacaño cuando se trata de eliminar partes (probablemente porque termino metiendo tantas placas en mi propio garaje; -)
Para mí, parece un poco complicado sondear con el codificador de código gris porque estoy buscando dos entradas y monitoreando cuál cambió primero. Casi preferiría la solución de hardware para el codificador.
Aquí están mis últimos 2¢. De hecho, recientemente usé un codificador rotatorio de código gris para un control de volumen de audio. Por supuesto, el código gris en sí mismo garantiza que solo un contacto podría estar cambiando en un momento dado, lo cual fue bueno, pero la encuesta con software antirrebote funcionó bastante bien. Por un lado, al variar el rebote pude controlar (o tal vez limitar) la rapidez con la que el usuario podía variar el volumen con un giro rápido de la perilla. Me tomó un tiempo determinar la configuración de rebote ideal, pero seguro que habría sido un fastidio hacer esos experimentos teniendo que cambiar una red RC.

Si es mejor manejar el rebote de botones mediante programación, en hardware o una combinación de ambos, depende de la naturaleza del rebote. Algunos tipos de botones tienen una resistencia que puede cambiar erráticamente a medida que se presionan; si se empujan lentamente, este período errático puede extenderse en una fracción sustancial de segundo. Si un procesador puede distinguir entre una resistencia baja, una resistencia alta y un circuito abierto, ignorar las pulsaciones de botones hasta que se detecte una resistencia baja e ignorar las liberaciones hasta que se detecte un circuito abierto funcionará bien. Sin embargo, si un procesador no puede hacer tales distinciones, puede haber un límite en la cantidad de software que se puede hacer sin hardware adicional.

El enfoque más sólido en muchos casos es diseñar un sistema con contactos normalmente abiertos y normalmente cerrados; un enfoque de este tipo puede producir una corriente de reposo cercana a cero tanto en el estado de botón presionado como en el de botón no presionado, mientras que sufre prácticamente cero rebotes de cualquier forma. No veo ningún impedimento técnico para diseñar un codificador rotatorio con una funcionalidad similar, pero no conozco ningún codificador de este tipo que exista.

Tiene sentido. ¿Está de acuerdo en que, si se implementa algún mecanismo antirrebote de hardware, se puede colocar de forma remota lejos del interruptor/botón físico, codificador?
@GisMofx: lo importante es que las señales que son necesarias para generar una salida sólida estén disponibles donde sea que se maneje el antirrebote. Si uno tuviera, por ejemplo, un grupo de botones que alimentan un registro de desplazamiento 74HC165, y tuvieran el problema de "resistencia dudosa" que mencioné, el hardware para ayudar con el antirrebote tendría que ocurrir antes que los registros de desplazamiento (aunque dicho hardware tal vez podría tomar el forma de pull-ups que podrían tirar selectivamente a 2,8 o 3,3 voltios).