Formas inteligentes de detectar un botón (consume menos energía)

26

Durante una reunión para un proyecto en particular, me pidieron que pensara en la forma de detectar una pulsación en un botón con una MCU. La detección debe 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 usando CircuitLab

No tengo en cuenta algunas características anti-rebote aquí, ya que está fuera del alcance de esta pregunta. En cualquier caso, cuando se presiona el botón, el valor actual 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?

    
pregunta vionyst

7 respuestas

29

Un método de baja corriente que utilicé una vez fue para conectar un interruptor entre dos pines de E / S del microcontrolador.

Una E / S se configuró como una salida (SWO). El segundo se configuró como una entrada (SWI) con su pull-up interno programable habilitado.

El estado de conmutación se muestreaba con poca frecuencia (cada 10 ms) mediante una rutina de interrupción de software. La secuencia de lectura fue: unidad SWO baja, lectura SWI, unidad SWO alta.

Esto significó que un interruptor presionado solo atrajo 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 dibujó corriente. Este consumo de corriente de < 1 us cada 10 ms dio como resultado un promedio de consumo de corriente promedio mínimo.

    
respondido por el TonyM
23
El botón

A SPDT ( S ingle P o D ouble T ) sería su botón ultra eficiente .

Fuente: enlace

En su caso, el 1P iría a la MCU, el 1T a VCC, el 2T a GND.

    
respondido por el Harry Svensson
10

¿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 irrelevante en gran medida debido al poco tiempo que el botón está realmente cerrado.

Cualquiera de los dos circuitos que muestres está bien, no importa.

Puede suponer que la fuga de entrada y / o la corriente en una entrada de MCU es despreciable . 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 de recuperación interna incorporada en muchas entradas de MCU. Esta resistencia puede tener un valor relativamente bajo (50 kohm quizás), por lo que una pequeña corriente fluirá 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 eliminar 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 conmutador, use sondeo (como en la respuesta de TonyM) o use una interrupción . Depende de la aplicación que sea mejor para el consumo de energía (de la MCU).

    
respondido por el Bimpelrekkie
10

Un método que he utilizado aprovecha la naturaleza capacitiva de las entradas CMOS.

simular este circuito : esquema creado usando 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 gira el pin como un nivel alto, o habilita brevemente el pull-up, el tiempo suficiente para mantener una carga en 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 período 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 la actualización, o se puede usar para provocar una interrupción.

La energía se utiliza brevemente durante el impulso de actualización, tanto para recargar los condensadores 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 sondeo hace 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 de la activación debe ignorar la lectura del pin. Además, este método no debe utilizarse para despertar el micro. Antes de acostarse, también es aconsejable habilitar el pin como una salida baja para estacionarlo en un estado de corriente cero.

Para leer más interruptores estáticos, como la configuración de interruptores DIP, se puede usar una rutina dedicada en lugar de un ciclo de actualización continuo. Después de la lectura, los pines GPIO deberían "estacionarse" en un estado de baja salida activa (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 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 algún panel frontal a menos que agregue una capacidad adicional cerca del pin.

    
respondido por el Trevor_G
8

Si su botón es un interruptor piezoeléctrico, la única potencia requerida es la potencia generada al presionar el botón.

Por ejemplo: R2 / C1 recolecta la energía producida presionando el piezo. D1 evita que la tensión C1 sea demasiado alta. R1 drena C1 cuando se suelta el botón. El MCU GPIO debe estar en modo de entrada, no de extracción. Voilà, botón de detección con consumo de corriente cero desde la fuente.

simular este circuito : esquema creado usando CircuitLab

    
respondido por el Heath Raftery
5

Si el dispositivo necesita poder permanecer en cualquiera de los dos estados por tiempo indefinido, 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 conmutadores SPDT es que pueden ser casi perfectamente rebatidos, sin importar qué tan rápido sean operados o lo malos que puedan ser los contactos, siempre que solo un contacto deje de rebotar antes de que el otro primero lo lea como cerrado.

Hay dos buenos métodos para conectar estos interruptores:

simular este circuito : esquema creado usando 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 (atraerá una corriente más alta de lo normal, pero no pondrá 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 de tiempo prolongado, podría quemar una corriente significativamente mayor de lo normal, pero durante el uso normal, ninguna de las resistencias llevará ninguna corriente significativa, excepto durante el breve momento entre el cuando el interruptor cambia de estado y la salida responde.

    
respondido por el supercat
2

Use el pull-up interno del microcontrolador y, cuando se detecte la presión, desactive el pull-up. Luego, ocasionalmente, vuelva a habilitarlo brevemente para verificar el estado del botón.

    
respondido por el τεκ

Lea otras preguntas en las etiquetas