Durante una reunión para un proyecto en particular, se me pidió pensar en la forma de detectar presionar un botón con un MCU. La detección debería consumir la menor potencia posible. A primera vista, pensé que el circuito típico con un pull-up o un pull-down:
simular este circuito : esquema creado con CircuitLab
No considero algunas características anti-rebote aquí, ya que eso está más allá del alcance de esta pregunta. En cualquier caso, cuando se presiona el botón, el valor de corriente total que fluye depende del valor de la resistencia. Para minimizarlo (la corriente), podría aumentar el valor de la resistencia, pero no tanto, ya que, si tengo razón, también depende del valor de fuga del pin de entrada. Además, una resistencia grande se recuperaría lentamente.
Mi pregunta es la siguiente: ¿cuáles son las formas inteligentes de detectar un botón presionado que no consume energía (generalmente para una aplicación que consume mucha energía)? ¿Hay algún método que apenas consuma energía cuando se presiona el botón?
fuente
Respuestas:
Un método de baja corriente que utilicé una vez fue conectar un interruptor entre dos pines de E / S del microcontrolador.
Una E / S se configuró como salida (SWO). El segundo se configuró como una entrada (SWI) con su pull-up interno programable habilitado.
El estado del interruptor fue muestreado con poca frecuencia (cada 10 ms) por una rutina de interrupción de software. La secuencia de lectura fue: unidad SWO baja, lectura SWI, unidad SWO alta.
Esto significaba que un interruptor presionado solo atraía la corriente de extracción SWI a través de sí mismo y SWO por menos de 1 us durante el escaneo, mientras que un interruptor no presionado no consumía corriente. Este consumo de corriente para <1 us cada 10 ms resultó en un pequeño consumo de corriente promedio promedio.
fuente
A SPDT ( S ingle P ole D ouble T hRow) botón sería su botón de ultra eficiente.
Fuente: http://www.ni.com/white-paper/3960/en/
En su caso, el 1P iría a la MCU, el 1T a VCC, el 2T a GND.
fuente
¿Cuánto tiempo se presionará el botón? Si no se trata de un interruptor de palanca (que mantiene su estado) sino de un interruptor momentáneo, la corriente que fluye cuando se presiona el botón es en gran medida irrelevante debido al poco tiempo que el botón está realmente cerrado.
Cualquiera de los dos circuitos que muestra está bien, no importa.
Puede suponer que la fuga de entrada y / o corriente en una entrada de MCU es insignificante . Todos los MCU están en tecnología CMOS en estos días y tienen una corriente de entrada prácticamente nula. Así que deja de considerarlo, no está ahí.
En lugar de usar una resistencia externa, también podría usar la resistencia interna pull-up incorporada en muchas entradas de MCU. Esta resistencia puede tener un valor relativamente bajo (quizás 50 kohmios), por lo que fluirá una pequeña corriente cuando se presione el botón.
Puede usar con seguridad incluso una resistencia de 1 Mohm para un pull-up / pull-down. Solo en entornos muy "sucios" (eléctricamente hablando) puede que necesite un valor más bajo. También puede colocar un condensador de 100 nF en paralelo con el interruptor para suprimir la interferencia de otros circuitos cercanos.
Consejo profesional: Reserve un lugar para dicho condensador en la PCB, pero no monte una tapa. todavía. En caso de problemas: colóquelo y vea si eso ayuda.
Para detectar el estado del cambio, use sondeo (como en la respuesta de TonyM) o use una interrupción . Depende de la aplicación cuál es mejor para el consumo de energía (de la MCU).
fuente
Un método que he usado aprovecha la naturaleza capacitiva de las entradas CMOS.
simular este circuito : esquema creado con CircuitLab
En el circuito sobre el interruptor, cuando está cerrado, permite que la resistencia desplegable cargue / descargue las capacidades de entrada del GPIO hasta el nivel del suelo.
El truco con este circuito es usar la naturaleza bidireccional de un GPIO para mantener la entrada cargada a un nivel lógico alto cuando el interruptor está abierto.
La rutina de control periódicamente saca el pasador como un nivel alto, o habilita brevemente el pull-up, el tiempo suficiente para mantener una carga de las tapas. El pin de entrada actúa como un bit de memoria dinámica y, con la mayoría de los dispositivos, mantendrá esa carga durante un tiempo considerable y utilizable.
Cuando se configura correctamente, si se presiona el botón, la carga en el pin se descargará más rápido que la frecuencia de actualización. Esa condición puede detectarse como parte del algoritmo de actualización como una lectura antes de la operación de actualización, o usarse para generar una interrupción.
La energía se usa brevemente durante el pulso de actualización, tanto para recargar los condensadores como a través de la resistencia y cambiar si está cerrado. Sin embargo, la duración del pulso de actualización es corta y la frecuencia de sondeo da como resultado que la corriente de actualización sea relativamente insignificante.
Obviamente este método es activo. Si el micro se pone en suspensión, el estado del interruptor será indeterminado al despertar. El primer ciclo de actualización después del despertar debe ignorar la lectura del pin. Además, este método no debe usarse para despertar al micro. Antes de acostarse, también es aconsejable habilitar el pin como salida baja para estacionarlo en un estado de corriente cero.
Para leer más interruptores estáticos, como configurar interruptores DIP, se puede usar una rutina dedicada en lugar de un ciclo de actualización continuo. Después de leer, los pines GPIO deben "estacionarse" en un estado activo de salida baja (corriente cero) para evitar el problema de las entradas flotantes.
NOTA: Esta técnica sufre un poco de sensibilidad al ruido si las trazas son largas y atraviesan un área ruidosa. Como tal, R1 debe estar cerca del pin de entrada. Sin embargo, no lo recomendaría para conectar un interruptor a cierta distancia en un panel frontal en algún lugar, a menos que agregue capacitancia adicional cerca del pin.
fuente
Si su botón es un interruptor piezoeléctrico, entonces la única potencia requerida es la energía generada presionando el botón.
Por ejemplo: R2 / C1 recolecta la energía producida presionando el piezo. D1 evita que el voltaje de C1 sea demasiado alto. R1 drena C1 cuando se suelta el botón. El MCU GPIO debe estar en entrada, sin modo de extracción. Voilà, detección de botón con cero consumo de corriente del suministro.
simular este circuito : esquema creado con CircuitLab
fuente
Si el dispositivo necesita poder permanecer en cualquier estado indefinidamente, el uso de un interruptor SPDT será el enfoque de menor potencia, ya que se puede hacer que un circuito estático no extraiga corriente más allá de su propia fuga interna y la del interruptor. Una ventaja adicional de los interruptores SPDT es que pueden eliminarse casi por completo, sin importar cuán rápido se operen o cuán mal pueden ser los contactos, siempre que un contacto deje de rebotar antes de que el otro lea por primera vez como cerrado.
Hay dos buenos enfoques para cablear tales interruptores:
simular este circuito : esquema creado con CircuitLab
El primer enfoque requiere una resistencia menos que el segundo, pero el segundo será más tolerante a la superposición entre los dos polos (consumirá una corriente más alta de lo habitual, pero no dejará un punto muerto en el suministro). Tenga en cuenta que si el interruptor puede entrar en un estado que es moderadamente resistivo durante un período prolongado de tiempo, eso podría quemar una corriente significativamente mayor de lo habitual, pero durante el uso normal ninguna de las resistencias llevará ninguna corriente significativa, excepto durante el breve momento entre vez que el interruptor cambia de estado y la salida responde.
fuente
Use el pull-up interno del microcontrolador y cuando se detecte la prensa, desactive el pull-up. Luego, ocasionalmente, vuelva a habilitarlo brevemente para verificar el estado del botón.
fuente