Desglosado por hardware de la matriz de claves con un mínimo de componentes pasivos

7

Recientemente he comprado esta matriz de teclado 4x4 barata. Solo tiene los botones y nada más, por lo tanto, quiero agregarle un debouncing adecuado. El debouncing en el software es algo que quiero evitar porque quita algo de poder de procesamiento de mi aplicación.

Sé que el debouncing se puede hacer usando una resistencia y un condensador (¿estoy en lo correcto?) o un disparador Schmit (que requiere otro IC que supongo y está fuera de cuestión para mí), por lo que la pregunta es, ¿tendré que agregar R / C para cada clave, o puedo salirme con solo un par R / C por fila o por columna?

¿Alguna sugerencia?

    
pregunta DEKKER

5 respuestas

24

Seamos claros sobre esto. Si tiene una matriz de teclado, ya está utilizando la capacidad de procesamiento para aplicar voltajes lógicos secuenciales a las filas o columnas y luego leer las columnas o filas para determinar el botón presionado.

Por lo tanto, cada vez que obtenga un "resultado", es decir, si detecta que se presionó un botón, marca ese evento como "pendiente" y un tiempo después (de 10 a 20 ms) verifica nuevamente para ver si se presiona puede marcar como "pendiente" como "real".

En mi opinión, la cantidad de tiempo de procesamiento que requiere este proceso es muy pequeña y, si está tan cerca del límite en el que puede funcionar su CPU, obtenga una CPU más grande / más rápida o aumente la velocidad del reloj.

El uso de Rs y Cs puede funcionar pero, en todos los casos, producirá una salida "lenta" que debería ser activada por Schmitt para limpiar el borde lento hasta un borde rápido que sea adecuado para la lógica que sigue. Puede salirse con la suya, por supuesto, pero luego tiene una solución fija sin flexibilidad.

Habiendo dicho todo lo anterior, es posible que también necesite condensadores de cada línea matriz a tierra para evitar problemas de ESD / EMC.

    
respondido por el Andy aka
5

Como ingeniero de software integrado desde hace mucho tiempo, tengo que decir que su suposición de que el hecho de realizar un rebote tomará algo de poder de procesamiento de mi aplicación es simplemente incorrecta. Esto nunca será cierto para cualquier firmware escrito de forma competente.

Naturalmente, el rebote requerirá algún procesamiento. Sin embargo, el procesamiento es trivial, y para la entrada del usuario se llevará a cabo a una tasa de actualización tan baja que es absolutamente insignificante. Si necesita rebotar las entradas con velocidades de actualización en decenas de kHz, tal vez el procesamiento para el rebote sea significativo, pero un botón de pulsación humana no necesita nada como ese tipo de resolución. En su caso, el muestreo de 100Hz sería lo suficientemente rápido, y es casi seguro que podría dejarlo tan bajo como el muestreo de 10Hz sin afectar seriamente la interacción del usuario.

Si está tratando de hacer un procesamiento de entrada en un bucle de control principal que se ejecuta a decenas de kHz, por supuesto que absorberá la potencia de procesamiento. La solución correcta es escribir un firmware que no lo haga de esa manera, sin usar una solución de hardware para arreglar un anti-patrón de software. El uso adecuado de los temporizadores y las prioridades de interrupción le dará lo que necesita.

Puede optimizar el procesamiento asegurándose de que la lectura esté todo en un puerto de E / S. Suponiendo que está configurando niveles en columnas y leyendo las filas, entonces bit-AND, bit-shift y bit-OR para acumular un valor de 16 bits para los 16 pines. XOR esto con el valor de 16 bits anterior, y si no es cero, entonces algo cambió. Un simple algoritmo de rebote es simplemente establecer un contador en un valor si los pines cambian de estado, elegir un estado si los pines mantuvieron su estado y el contador es cero, y disminuir si no es cero.

Es necesario comprobar que solo se presiona un botón, por supuesto. Si tiene un procesador ARM, el ARM tiene una instrucción para informar cuántos bits están configurados, lo cual es ideal para esto. Solo mencionando para una optimización adicional.

    
respondido por el Graham
4

Para obtener el mejor rendimiento de rebote, probablemente sería mejor tener una R / C para cada botón. Sin embargo, aún debe obtener resultados decentes con uno por fila / columna. Solo depende de lo crítico que sea realmente. Si desea hacerlo con la cantidad mínima de componentes, ¿por qué no intenta hacer uno por fila / columna primero, luego tomar algunas medidas y ver si el resultado es lo suficientemente bueno para su aplicación?

Si los resultados no son los que deseaba, continúe y agregue algunos en cada botón, luego intente nuevamente.

    
respondido por el MCG
2

Afaik, hay circuitos integrados que pueden rebotar 'automáticamente', por ejemplo. MC14490, llamado Switch Debouncer.

Esto evitará que necesites energía de la CPU, pero te costará un poco de cableado / espacio de PCB adicional.     

respondido por el Michel Keijzers
0

El verdadero rebote implica la adición de histéresis. No puedes hacer eso con componentes pasivos, por ejemplo. Resistencias y condensadores. Ahí es donde entra una solución de software o componente activo (latch).

    
respondido por el Anthony X

Lea otras preguntas en las etiquetas