Durante una reunión para un proyecto en particular, me pidieron que pensara en la forma de detectar la pulsación de un botón con una MCU. La detección debe consumir la menor cantidad de energía posible. A primera vista, pensé en el típico circuito con un pull-up o un pull-down:
simular este circuito : esquema creado con CircuitLab
No tengo en cuenta algunas funciones 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 minimizarla (la corriente), podría aumentar el valor de la resistencia pero no tanto ya que, si no me equivoco, 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 (típicamente 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?
Un método de baja corriente que usé 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 entrada (SWI) con su pull-up interno programable habilitado.
El estado del interruptor se muestreaba con poca frecuencia (cada 10 ms) mediante una rutina de interrupción de software. La secuencia de lectura fue: conducir SWO bajo, leer SWI, conducir SWO alto.
Esto significaba que un interruptor presionado solo atraía la corriente desplegable 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 dio como resultado un consumo de corriente promedio pequeño.
Un botón SPDT ( Single P ole D ouble Throw ) sería su botón ultra eficiente.
Fuente: http://www.ni.com/white-paper/3960/en/
En tu caso el 1P iría a la MCU, el 1T a VCC, el 2T a GND.
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 capacitancias 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 apaga periódicamente el pin como un nivel alto, o habilita brevemente el pull-up, el tiempo suficiente para mantener las tapas cargadas. 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 una cantidad de 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 se puede detectar como parte del algoritmo de actualización como una operación de lectura antes de actualizar, o se puede usar para generar una interrupción.
La energía se usa brevemente durante el pulso de actualización, tanto para recargar los capacitores como a través de la resistencia y el interruptor si está cerrado. Sin embargo, la duración del pulso de actualización es corta y la frecuencia de consulta hace que la corriente de actualización sea relativamente insignificante.
Obviamente, este método es activo. Si el micro se pone a dormir, el estado del interruptor será indeterminado al despertar. El primer ciclo de actualización después de la activación debe ignorar la lectura del pin. Además, este método no debe usarse para activar el 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 interruptores DIP de configuración, se puede usar una rutina dedicada en lugar de un ciclo de actualización continua. Después de la lectura, 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 longitudes de los trazos son largas y viajan a través de 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.
¿Cuánto tiempo se presionará el botón? Si no es un interruptor de palanca (que mantiene su estado) sino un interruptor momentáneo, entonces 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 la 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 puede usar la resistencia pull-up interna integrada en muchas entradas de MCU. Esta resistencia puede tener un valor relativamente bajo (quizás 50 kohm), 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) es posible que necesite un valor más bajo. También puede colocar un capacitor 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. aún. En caso de problemas: colóquelo y vea si eso ayuda.
Para detectar el estado del interruptor, use el 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).
Si su botón es un interruptor piezoeléctrico, entonces la única energía requerida es la energía generada al presionar el botón.
Por ejemplo: R2/C1 recolecta la energía producida al presionar el piezoeléctrico. D1 evita que el voltaje de C1 suba demasiado. R1 drena C1 cuando se suelta el botón. El MCU GPIO debe estar en entrada, sin modo pull. Voilà, botón de detección con cero consumo de corriente del suministro.
simular este circuito : esquema creado con CircuitLab
Si el dispositivo debe poder permanecer en cualquiera de los estados indefinidamente, usar un interruptor SPDT será el enfoque de menor potencia, ya que se puede hacer que un circuito estático no consuma corriente más allá de su propia fuga interna y la del interruptor. Una ventaja adicional de los interruptores SPDT es que se pueden eliminar casi perfectamente, sin importar qué tan rápido se operen o qué tan malos sean los contactos, siempre que un contacto deje de rebotar antes de que el otro se 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 que la habitual, pero no provocará un cortocircuito en el suministro). Tenga en cuenta que si el interruptor puede entrar en un estado que es moderadamente resistivo durante un período de tiempo prolongado, eso podría quemar una corriente significativamente mayor que la habitual, pero durante el uso normal ninguna de las resistencias llevará una corriente significativa excepto durante el breve momento entre el vez que el interruptor cambia de estado y la salida responde.
Utilice el pull-up interno del microcontrolador y, cuando se detecte la pulsación, deshabilite el pull-up. Luego, ocasionalmente, vuelva a habilitarlo brevemente para verificar el estado del botón.
Lundin
awjlogan
como se llama
Mono de código borracho