¿Cómo puedo hacer que mi atmega328 funcione durante un año con baterías?

49

Escenario

He creado una buena cerradura electrónica para la puerta de mi dormitorio. Actualmente es una Diecimila Arduino con un servo [un] que bloquea la puerta. Tiene un teclado numérico con botones 3x4 y 5 LED (2 pares de series y un solo LED). También se ejecuta actualmente en un cargador de teléfono.

Ahora lo he rediseñado para que funcione con un Arduino independiente (ATmega328), pero realmente me gustaría que funcionara con baterías AA o incluso con una batería de 9V.

Para la parte del software, pensé que podría poner sleep llamadas en ciertos momentos dentro del método de bucle para mantener el consumo de energía ATmega lo más bajo posible. Y deje que el LED parpadee con el mayor tiempo posible apagado.

Pregunta 1

Cuando se presiona un botón durante los pocos milisegundos que duerme la placa, ¿se "recordará" / "mantendrá" hasta que salga del modo de reposo y luego se lo levantará presionando un botón?

¿Cuál sería la mejor manera de manejar este botón presionando el modo de suspensión? ¿Puedo codificarlo para que se active después de la actividad del botón, o debo simplemente dejarlo dormir, por ejemplo? 10m.s. en cada bucle?

Pregunta 2

¿Cómo abordaría el cálculo matemático de cuántas baterías AA se necesitan para ejecutar este dispositivo durante 10 meses?

Además, no sé cómo medir el consumo promedio de energía por minuto, ya que se alterna rápidamente, etc.

El dispositivo

    
pregunta LouwHopley

7 respuestas

34

El Atmega328 proporciona seis modos de ahorro de energía, ordenados de mínimo a excelente (consumos actuales estimados de esta publicación del foro ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6.5 mA
  • SLEEP_MODE_PWR_SAVE: 1.62 mA
  • SLEEP_MODE_EXT_STANDBY: 1.62 mA
  • SLEEP_MODE_STANDBY: 0.84 mA
  • SLEEP_MODE_PWR_DOWN: 0.36 mA

Citando la pregunta original:

  

Me di cuenta de que podría poner sleep llamadas en ciertos momentos dentro del método de bucle "

Necesitaría usar sleep_cpu() después de configurar el modo de suspensión que necesita, de la lista anterior. El Arduino Playground tiene una publicación útil sobre esto .

La aplicación debe ser activada por interrupciones, usar los modos de suspensión anteriores y activar el procesador con el botón pulsador, el desbordamiento del temporizador y los eventos del temporizador de vigilancia para ejecutar las tareas.

Se pueden obtener ahorros de energía adicionales a través de los siguientes pasos:

  • Use el oscilador interno del microcontrolador y una frecuencia de reloj baja (8MHz en lugar de 16), pero asegúrese de que el código relacionado con la hora y la sincronización aún funcione como se esperaba. Podría ser necesaria una versión diferente del cargador de arranque para esto.
  • Evite mantener los LED encendidos por mucho tiempo si la aplicación los usa. El uso de un flash doble o triple rápido de corta duración (0.05 segundos encendido, 0.5 segundos apagado), con intervalos de segundos intermedios, garantiza una indicación notable con un consumo de energía mínimo
  • Use un regulador de conmutación en lugar de uno lineal, si se requiere un regulador.
  • Ejecute el microcontrolador a un voltaje más bajo si es compatible, 3.0 voltios (por ejemplo, celda de litio CR2032, no se necesita regulador) o 3.3 voltios en lugar de 5 voltios.
  • Siga las recomendaciones en la hoja de datos para la configuración de los pines de entrada y salida no utilizados para un mínimo desperdicio de energía.

La incorporación de estas sugerencias permite ejecutar aplicaciones de microcontroladores durante semanas o meses en una sola celda de moneda CR2032, y años en una celda de litio tipo LR123. Por supuesto, su millaje puede variar según los sensores, las salidas y el procesamiento real que requiera su aplicación.

Algunas referencias útiles:

respondido por el Anindo Ghosh
18

Tengo un Arduino Pro Mini en mi escritorio ahora mismo que funciona con 2 baterías AA y podría funcionar durante más de un año si es necesario.

Hay tres aspectos del diseño que lo han logrado.

1. Un regulador diferente

Estoy usando un regulador de impulso LTC3525. Tiene una corriente de reposo muy baja (7uA) y una alta eficiencia (> 90% @ 0.2mA). Algo como este tablero de sparkfun enlace debería hacer un trabajo similar. Asegúrate de conectarlo al pin de 5V en el Arduino, no al VIN, para que no se use el regulador Arduino.

2. Sleeeeeeep

La proporción de tiempo que el dispositivo está activo será pequeña. Durante el resto del tiempo, el dispositivo debe estar dormido en SLEEP_MODE_POWER_DOWN. Puede basar sus rutinas de sueño en la Biblioteca de baja potencia de Rocketscreem . De acuerdo con ese enlace, debería poder bajarlo a 1.7uA con ADC, BOD y WDT apagados y en modo de apagado.

3. Interrupciones

La otra mitad del sueño son interrupciones para activarlo. En el modo inactivo de apagado, solo las interrupciones de nivel en INT1 e INT2, TWI coinciden, y el WDT lo activará. Por lo tanto, debe tener un botón conectado a INT1 o INT2 para que al presionar el botón se active.

Otras cosas:

Apague todos los LED a menos que sea absolutamente necesario. Si la cerradura está en el interior, los LED no tienen que ser brillantes, lo que ahorra más energía. Además, si necesita que la MCU realice alguna tarea regularmente, use el temporizador de vigilancia para activarlo periódicamente.

Editar:

Un método que puede funcionar es utilizar la biblioteca de bajo consumo que se encuentra arriba y suspender durante unos 60 ms en cada ciclo gracias al temporizador de vigilancia. Al despertar, compruebe si pulsa el botón. La función a llamar sería

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);
    
respondido por el geometrikal
13

Todos estos comentarios son acertados. Me gustaría añadir algunas sugerencias más:

1) Para los LED, use LED de 20 mA de alto rendimiento. Aquí está la lógica. Digamos que desea un tenue LED de estado que parpadea cada 8 segundos. No quieres que sea brillante, así que usas un LED aleatorio. El problema es que un LED tenue todavía usa 20 mA (o más) para generar solo 100 mcd. En su lugar, obtenga un LED de alto rendimiento que aún tenga una capacidad nominal de 20 mA, pero que pueda generar 4000 mcd (asegúrese de mirar el ángulo de salida, probablemente aún quiera que esté a 30 grados o más). Con este LED de 4000 mcd, lo conecta con algo como una resistencia de 3,3 k Ohm y obtiene alrededor de 100 mcd de salida de luz, pero está utilizando menos de 1 mA. Entonces, en lugar de usar 20 mA para el LED de estado, estás usando una fracción de un solo mA. Por lo general, también configuro el flash LED de estado a tiempo para solo 5 a 15 ms, lo que también puede ahorrar mucha energía si anteriormente tenía el flash a tiempo a 100 ms.

2) Mi regulador de voltaje de elección es el Microchip MCP1700. Utiliza solo 1.6 µA de corriente de reposo y es súper barato (alrededor de $ 0.30 en pequeñas cantidades). La única limitación es que el voltaje de entrada máximo es de solo 6 voltios, por lo que no puede usar una batería de 9 voltios. Pero es perfecto para 4 baterías AA, una LiPo de celda única o dos monedas de litio.

3) Para alimentar un circuito ATmega con 4 baterías AA, normalmente uso un diodo 1N4001 en VCC para reducir el máximo de 6 voltios de las 4 baterías a 5,5 voltios. Además, el diodo protege al ATmega de la tensión inversa, por lo que cumple dos propósitos útiles. Al hacer esto, puedo crear un circuito alimentado por batería que puede usar tan solo 0.1 µA mientras duerme, ya que no hay un regulador de voltaje que consuma corriente todo el tiempo.

    
respondido por el Tim Eckel
8

Hice una prueba en un atmega328P-PU en una placa de pruebas usando biblioteca de RocketScream LowPower

Usé este boceto:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Con un uCurrent Gold medí 7.25 uA cuando estaba en modo de apagado.

    
respondido por el Guus
6

Aquí hay dos preguntas, pero solo la segunda es realmente parte del título de la pregunta, así que probablemente sea mejor si abres otra para la pregunta de programación de Arduino. Contestaré la segunda pregunta aquí.

Una sola batería alcalina AA de 1.5 V superior tiene una capacidad de aproximadamente 2600 mAh. Si opta por baterías de litio, puede obtener aproximadamente 3400mAh si tiene suerte. Vayamos con esa cifra como punto de referencia para el mejor de los casos.

La forma en que calcula el tiempo de ejecución máximo teórico para una carga es simplemente la capacidad dividida por la carga. Si su carga es de 1 mA, puede ejecutarla durante 3400/1 = 3400 horas = 141 días = ~ 5 meses. Sin embargo, esto es solo un máximo teórico , ya que comenzarás a obtener una caída de voltaje significativa de alrededor del 65% en ese tiempo. Si está regulando la salida, obtendrá un efecto desbocado donde, cuanto más bajo sea el voltaje de la batería, más alta será la corriente necesaria para mantener el voltaje regulado, lo que agota la batería más rápido. Me sorprendería si pudiera obtener más del 80% de la capacidad anunciada con un voltaje lo suficientemente alto para ejecutar su dispositivo.

Entonces, digamos que se obtiene el 80% de ese tiempo después de la caída de voltaje y las ineficiencias del regulador. Asumiremos que está funcionando a 3.3 V de tres baterías en serie. Esto aún le dará la misma capacidad, pero el voltaje será suficiente para un regulador. Si su dispositivo se ejecuta a 15 mA (que es una estimación bastante conservadora) los números se verán así:

  • capacidad después del 80% de eficiencia = 3400 * 0.8 = 2720mAh
  • Tiempo = 2720/15 = 181 horas = 7.54 días

Entonces necesitarías unas 144 baterías de litio (48 juegos de 3) para funcionar durante un año. ¡No tan bien!

En su lugar, sugeriría usar un suministro de CC regulado de la red eléctrica. Se puede incluir una batería de respaldo, que es fácil de configurar con un relé SPDT; simplemente conecte la bobina a la alimentación de CC y tenga el contacto de "apagado" conectado a la batería. Cuando el DC falla, el contacto se cae y la batería se usa en su lugar.

    
respondido por el Polynomial
4

Algo que nadie ha mencionado aún: debe tener alguna forma de apagar la fuente de alimentación de + 5V cuando no lo esté utilizando. Incluso cuando no se está moviendo, un servo seguirá consumiendo energía.

Un FET con la puerta controlada por un pin de E / S del arduino es una buena manera de hacerlo.

    
respondido por el jwygralak67
3

Podría considerar usar un microcontrolador especialmente optimizado para un bajo consumo de energía para su próximo diseño. Para un bajo consumo de energía es necesario tomar una potencia muy baja mientras duerme. Lo que a menudo se pasa por alto es que también es importante la rapidez con que puede despertarse de este sueño.

Lo que cuenta es la cantidad de carga que toma el sueño más profundo para manejar una interrupción lo más rápido posible (porque la ráfaga de energía será muy corta en ese momento) y volver a dormir nuevamente.

Un ejemplo de dicho micro-control es MSP430 de Texas Instruments . En su sitio web encontrará notas de aplicación sobre cómo conservar la energía y las aplicaciones de recolección de energía.

    
respondido por el Peer Stritzinger

Lea otras preguntas en las etiquetas

Comentarios Recientes

En resumen, eso significa asegurarse de comprar un ATmega328 legítimo (¡no el "Mega32U2" que acaba de comprar, como decimos en este sitio!). El ATmega328 con la EEPROM de 32 bytes debe instalarse en un kit (sacado o no) después de soldar todas las piezas juntas. Ver wiki, y obtienes el esquema. Asegúrese de obtener el tipo correcto de taburete para trabajar. Es posible que no se ajuste solo, por lo que necesitará el dispositivo adhesivo para mantenerlo en su lugar. El script para el controlador Philips BE227SPC... Lees verder