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

28

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:

esquemático

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?

vionyst
fuente
55
Un desplegable de 10k no consume casi nada de energía. 3.3V da 330uA. Y en la mayoría de los MCU modernos tiene la opción de configurar uno internamente, lo que tendrá una resistencia aún mayor. Dicho esto, puede activar el suministro de botones desde un pin MCU a través de un BJT o MOSFET. Solo actívelo durante la lectura y lea con sondeo.
Lundin
27
@Lundin En términos "modernos", 330 A puede ser una corriente alta ...μ
awjlogan
66
de hecho, muchos microcontroladores pueden obtener corrientes de sueño tan bajas como 2-10 μA. Perder 30 veces más que en un solo menú desplegable es algo triste, especialmente en una situación con batería.
whatsisname
1
El tamaño de una resistencia que puede usar en un pull-down depende de la impedancia del pin y a qué voltaje cambian. Digamos que tiene un pin de 3.3v en un estado de alta impedancia que cambia a 2.4v, todo lo que realmente necesita es una impedancia ligeramente menor que la entrada. Recomiendo que conecte un potenciómetro y mida qué tan alto valor de una resistencia puede usar para que el pin siga funcionando de manera confiable, y luego baje un 20% en valor para mantener un margen.
Drunken Code Monkey

Respuestas:

29

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.

TonyM
fuente
Es cuestionable por qué necesita el pull-up usando esta técnica. Secuencia SWO baja, lectura SWI, SWO alta, lectura SWI podría ser suficiente para saber si los pines están conectados entre sí. También puede compartir el SWO entre numerosos conmutadores.
Trevor_G
8
@Trevor Dejar la entrada flotante cuando el interruptor está abierto no es una idea particularmente buena. Dependiendo de la tecnología, puede hacer que el búfer de entrada consuma energía si su entrada está en un estado intermedio.
RoyC
1
@Trevor Multiplicar eficazmente la resistencia pull-up por el ciclo de trabajo sw1 sw2. Todavía un pull up nos lleva de vuelta al esquema 1. del OP. Puede funcionar en un entorno de bajo ruido.
RoyC
2
¿El hecho de que el MCU tenga que permanecer despierto para realizar el sondeo en lugar de depender de una interrupción no cancela por completo cualquier ahorro de los ciclos de trabajo del interruptor más cortos?
AndreKR
55
Hola @AndreKR, teníamos una aplicación de microcontrolador que funciona con baterías y necesitaba varios interruptores conectados, por lo que utilizamos esta técnica ya que era bastante fácil. No habíamos puesto un MCU solo para la detección del interruptor. El MCU dibujó algo así como 900nA en modo de suspensión entre sus interrupciones de 10 ms, por lo que valió la pena el ahorro de pull-up.
TonyM
23

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

ingrese la descripción de la imagen aquí

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.

Harry Svensson
fuente
+1 ... siempre me ha molestado que los SPDT subminiatura sean muy difíciles de encontrar o cuestan demasiado ...
Trevor_G
1
@Trevor Sí ... lamentablemente algunas cosas son muy caras. Mientras que otros artículos tienen precios bajos (MCU por ejemplo). No puedes tenerlo todo.
Harry Svensson
Esta es una gran idea. Lamentablemente, no pude encontrar un botón SPDT CMS que se adaptara a mis necesidades. Sin embargo
tendré
10

¿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).

Bimpelrekkie
fuente
En realidad, el botón será momentáneo, pero el tiempo que se presionará puede ser lo suficientemente largo (minutos)
vionyst
Si el dispositivo está encendido las 24 horas del día, los 7 días de la semana, entonces un par de minutos aún podría no ser mucho. Lo importante es el ciclo de trabajo, 5 minutos cada hora es 5 x 60/3600 = 8.3%. Entonces, incluso a una corriente de 100 uA, el interruptor consumiría 8.3 uA en promedio en mi escenario. Mi mensaje es: no se concentre demasiado en la corriente que usa el interruptor cuando se presiona sin compararlo con el consumo de corriente del sistema completo. Solo cuando las contribuciones son las mismas, entonces tiene sentido mejorar el consumo actual del interruptor. De nada sirve hacer un cambio de 0.1 uA cuando la MCU usa 1uA continuamente.
Bimpelrekkie
"No sirve de nada hacer un cambio de 0.1 uA cuando la MCU usa 1uA continuamente". Eso suena mal. Creo que te refieres a 1uA pico. 10% solo para el cambio sería excesivo;)
Trevor_G
@Trevor No pico, me refiero a 1uA de corriente promedio para la MCU pero 0.1uA cuando se presiona el interruptor. Combinado con un interruptor de 0.1 A que se presionará solo por períodos (relativamente) cortos, el interruptor no contribuye casi nada al consumo de energía promedio total ya que la corriente promedio será: 100% x 1 uA + 8.3% * 0.1 uA = 1.0083 uA (8.3% reutilizado del comentario anterior).
Bimpelrekkie
2
Sí, solo se lee como si quisieras decir 0.1uA promedio en el interruptor. Lo que no sería irrazonable para un interruptor dip.
Trevor_G
10

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

esquemático

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.

Trevor_G
fuente
1
Esto se ve muy vulnerable a EMI de hecho. Si alguna forma de energía de radio entra en ese circuito y creo que todas las apuestas están apagadas. Lo bueno es que las cosas inalámbricas no son tan comunes hoy en día :)
Lundin
@Lundin no es tan malo como podrías pensar. 30pF y un meg hacen un filtro bastante bueno.
Trevor_G
8

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.

esquemático

simular este circuito : esquema creado con CircuitLab

Heath Raftery
fuente
3
Hmm, ¿puedes hacer / diseñar un prototipo que funcione y mostrar el beneficio de las soluciones con un interruptor normal que hemos estado usando durante los últimos 30 años?
Bimpelrekkie
Seguro. He agregado un ejemplo de esquema. Simplemente construye eso. El beneficio es que no hay consumo de corriente del suministro en estado cerrado o abierto. Las desventajas incluyen un control deficiente del esfuerzo requerido para activar el interruptor (un circuito activo sería mejor, pero eso frustra el beneficio muy marginal del circuito), y es un diseño novedoso en comparación con el diseño del interruptor normal de 30 (300?) Años.
Heath Raftery
Aún así, mi calculadora tiene muchos botones y funciona al menos 5 años en una celda de moneda. Aún no veo cómo su solución aportaría algún beneficio. Sigo pensando que es una "solución" a un problema inexistente. Y más costoso también.
Bimpelrekkie
1
Oh estoy de acuerdo Cumple con los criterios originales de "consumir la menor potencia posible", pero es difícil imaginar por qué ahorrar menos de un milijulio es realmente útil.
Heath Raftery
¿La impedancia de entrada de la MCU no hace cosas desagradables debido a la alta impedancia de salida del piezo?
Scott Seidman
5

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:

esquemático

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.

Super gato
fuente
2

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