Wie kann ich meinen atmega328 für ein Jahr mit Batterien betreiben?

51

Szenario

Ich habe ein schönes elektronisches Türschloss für meinen Schlafsaal geschaffen. Es ist derzeit ein Arduino Diecimila mit einem Servo [un], der die Tür verriegelt. Es hat eine numerische Tastatur mit 3x4 Tasten und 5 LEDs (2 Serienpaare und eine einzelne LED). Es läuft derzeit auch auf einem Handy-Ladegerät.

Ich habe es jetzt neu gestaltet, um es auf einem eigenständigen Arduino (ATmega328) laufen zu lassen, möchte es aber wirklich auf AA-Batterien oder sogar einer 9-V-Batterie laufen lassen.

Für den Softwareteil dachte ich, ich könnte sleepAufrufe für bestimmte Zeiten innerhalb der Schleifenmethode platzieren, um den ATmega-Stromverbrauch so gering wie möglich zu halten. Und lassen Sie die LEDs so lange wie möglich "blinken".

Frage 1

Wenn ein Knopf in den wenigen Millisekunden gedrückt wird, in denen das Board schläft, wird er "erinnert" / "gehalten", bis er nicht mehr schläft, und wird dann als Knopfdruck aufgenommen?

Was wäre der beste Weg, um mit diesem Knopfdruck im Schlaf umzugehen? Kann ich es codieren, um nach einer Tastenaktivität aufzuwachen, oder muss ich es einfach für z. B. 10 Minuten schlafen lassen. in jeder Schleife?

Frage 2

Wie würde ich rechnen, wie viele AA-Batterien benötigt werden, um dieses Gerät 10 Monate lang zu betreiben?

Außerdem weiß ich nicht, wie ich den durchschnittlichen Stromverbrauch pro Minute messen soll, da er sich schnell abwechselt usw.

Das Gerät

Mein Türschloss

LouwHopley
quelle

Antworten:

35

Der Atmega328 bietet sechs Energiesparmodi, die von minimal bis exzellent sortiert sind (geschätzter Stromverbrauch in diesem Forumsbeitrag ):

  • 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

Zitiert die ursprüngliche Frage:

Ich dachte, ich könnte sleepAnrufe für bestimmte Zeiten innerhalb der Schleifenmethode platzieren. "

Sie müssten sleep_cpu()nach dem Einrichten des gewünschten Ruhemodus aus der obigen Liste verwenden. Der Arduino-Spielplatz hat einen nützlichen Beitrag dazu .

Die Anwendung muss unterbrechungsgesteuert sein, die oben genannten Ruhemodi ausgiebig verwenden und den Prozessor bei Tastendruck, Timerüberlauf und Watchdog-Timer-Ereignissen aufwecken, um tatsächlich Aufgaben auszuführen.

Zusätzliche Energieeinsparungen können durch die folgenden Schritte erzielt werden:

  • Verwenden Sie den internen Oszillator des Mikrocontrollers und eine niedrige Taktrate (8MHz statt 16) - stellen Sie jedoch sicher, dass der Code für Zeit und Timing weiterhin wie erwartet funktioniert. Möglicherweise wird hierfür eine andere Version des Bootloaders benötigt.
  • Vermeiden Sie es, die LEDs lange eingeschaltet zu lassen, wenn sie von der Anwendung verwendet werden. Die Verwendung eines schnellen Doppel- oder Dreifachblitzes von kurzer Dauer (0,05 Sekunden an, 0,5 Sekunden aus) mit Abständen von Sekunden dazwischen gewährleistet eine wahrnehmbare Anzeige bei minimalem Stromverbrauch
  • Verwenden Sie einen Schaltregler anstelle eines linearen Reglers, wenn ein Regler erforderlich ist.
  • Den Mikrocontroller bei niedrigerer Spannung (falls unterstützt), 3,0 Volt (z. B. CR2032-Lithiumzelle, kein Regler erforderlich) oder 3,3 Volt anstelle von 5 Volt betreiben.
  • Befolgen Sie die Empfehlungen im Datenblatt für nicht verwendete Eingangs- und Ausgangs-Pin-Einstellungen für minimalen Stromverbrauch.

Durch die Berücksichtigung dieser Vorschläge können Mikrocontroller-Anwendungen für Wochen oder Monate auf einer einzelnen CR2032-Knopfzelle und für Jahre auf einer Lithiumzelle vom Typ LR123 ausgeführt werden. Natürlich kann Ihr Kilometerstand variieren, je nachdem, welche Sensoren, Ausgänge und tatsächlichen Verarbeitungen Ihre Anwendung erfordert.

Einige nützliche Hinweise:

Anindo Ghosh
quelle
Nach meiner Erfahrung können Sie in SLEEP_MODE_PWR_DOWN den Wert auf 0,1 bis 6,0 uA senken, wenn Sie es schlau gemacht haben, jede Kleinigkeit auszuschalten (z. B. die Brownout-Erkennung). Ich habe Builds mit weniger als 60 uA erstellt, die mit einem Satz AA-Alkalibatterien 3-5 Jahre halten.
Tim Eckel
@TimEckel Ich bin verrückt nach dem Anzeigen des Status mit LEDs - das verschlingt das Strombudget, als wäre es aus der Mode gekommen.
Anindo Ghosh
3
Muss es nicht. Verwenden Sie leistungsstarke LEDs mit hohem Widerstand. Verwendet einen Bruchteil eines mA anstelle von über 20 mA. Blinken Sie außerdem die Status-LED alle paar Sekunden für 5-15 ms, anstatt ständig zu leuchten. Ich hatte eine billige Dimm-Status-LED, die 30 mA verbrauchte. Ich habe sie gegen eine Hochleistungs-LED mit einem 3,3 kOhm-Widerstand ausgetauscht, die ich alle 8 Sekunden 15 ms lang aufleuchtete. Ging von 30 mA auf 2,9 uA Durchschnittsstrom, 1/1000 der Leistung!
Tim Eckel
4
@TimEckel Du verstehst das Ausmaß meiner Leidenschaft für blinkende Lichter eindeutig nicht :-D Es ist nicht so, als ob ich die Intensität reduzieren möchte, ich mag diese kleinen Dinge, die wie die Flammen des Hades glitzern. Im Ernst: Ich kenne diese kleinen Tricks und habe sogar ein paar eigene Tricks entwickelt, die die visuelle Alarmwirkung erhöhen und gleichzeitig den Stromverbrauch durch die LEDs verringern. Dieser vorherige Kommentar war ( nur teilweise ) ein Scherz, um die vielen lustigen LED-Fragen zu beantworten, die ich hier beantworte .
Anindo Ghosh
3
Ich habe den Stromverbrauch des ATMega328P bei verschiedenen Spannungen und Frequenzen gemessen und dieses Diagramm erstellt. Docs.google.com/spreadsheets/d/…
Cano64
19

Ich habe gerade einen Arduino Pro Mini auf meinem Schreibtisch, der 2 AA-Batterien verbraucht und bei Bedarf über ein Jahr lang laufen kann.

Es gibt drei Aspekte des Designs, die dies erreicht haben.

1. Ein anderer Regler

Ich verwende einen LTC3525-Boost-Regler. Es hat einen sehr niedrigen Ruhestrom (7 uA) und einen hohen Wirkungsgrad (> 90% bei 0,2 mA). So etwas wie dieses Sparkfun Board https://www.sparkfun.com/products/8999 sollte einen ähnlichen Job machen. Stellen Sie sicher, dass Sie ihn an den 5-V-Pin des Arduino und nicht an die VIN anschließen, damit der Arduino-Regler nicht verwendet wird.

2. Schläfrig

Der Anteil der Zeit, in der das Gerät aktiv ist, ist gering. Für den Rest der Zeit sollte das Gerät in SLEEP_MODE_POWER_DOWN eingeschlafen sein. Sie können Ihre Schlafroutinen auf der Grundlage der Rocketscreem Low Power Library erstellen . Laut diesem Link sollten Sie in der Lage sein, es mit ADC, BOD und WDT aus und im Power-Down-Modus auf 1,7 uA herunterzufahren.

3. Interrupts

Die andere Hälfte des Schlafs wird unterbrochen, um es aufzuwecken. Im Energiesparmodus werden nur die Pegelunterbrechungen von INT1 und INT2, TWI, berücksichtigt und der WDT aktiviert. Sie müssen also eine Taste an INT1 oder INT2 anschließen, damit sie durch Drücken der Taste aktiviert wird.

Andere Sachen:

Schalten Sie alle LEDs aus, sofern dies nicht unbedingt erforderlich ist. Wenn sich das Schloss in einem Gebäude befindet, müssen die LEDs nicht hell sein, wodurch mehr Strom gespart wird. Wenn die MCU regelmäßig Aufgaben ausführen muss, aktivieren Sie sie regelmäßig mit dem Watchdog-Timer.

Bearbeiten:

Eine mögliche Methode besteht darin, die oben beschriebene Low-Power-Bibliothek zu verwenden und dank des Watchdog-Timers für etwa 60 ms in jeder Schleife zu schlafen. Überprüfen Sie beim Aufwachen, ob eine Taste gedrückt wurde. Die aufzurufende Funktion wäre

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);
geometrikal
quelle
14

Alle diese Kommentare sind genau richtig. Ich möchte noch ein paar Vorschläge hinzufügen:

1) Verwenden Sie für LEDs Hochleistungs-20-mA-LEDs. Hier ist die Logik. Nehmen wir an, Sie möchten eine Dimmstatus-LED, die alle 8 Sekunden blinkt. Sie möchten nicht, dass es hell ist, und verwenden daher eine zufällige LED. Das Problem ist, dass eine Dimm-LED immer noch 20 mA (oder mehr) benötigt, um nur 100 mcd auszugeben. Verwenden Sie stattdessen eine LED mit hoher Ausgangsleistung, die noch für 20 mA ausgelegt ist, aber 4000 mcd ausgeben kann (achten Sie darauf, dass Sie den Ausgangswinkel betrachten, und möchten, dass er wahrscheinlich 30 Grad oder mehr beträgt). Mit dieser 4000-mcd-LED schließen Sie sie an einen 3,3-k-Ohm-Widerstand an und erhalten eine Lichtleistung von ca. 100 mcd, verbrauchen jedoch weniger als 1 mA. Anstatt also 20 mA für die Status-LED zu verwenden, verwenden Sie einen Bruchteil eines einzelnen mA. Ich setze die Status-LED-Einschaltdauer normalerweise auch auf nur 5-15 ms, was auch viel Strom spart, wenn Sie die Einschaltdauer zuvor auf 100 ms eingestellt haben.

2) Mein Spannungsregler der Wahl ist der Microchip MCP1700. Es verbraucht nur 1,6 µA Ruhestrom und ist super günstig (ca. 0,30 USD in kleinen Mengen). Es ist nur eine Einschränkung, dass die maximale Eingangsspannung nur 6 Volt beträgt, sodass Sie keine 9-Volt-Batterie verwenden können. Aber es ist perfekt für 4 AA-Batterien, eine Einzelzellen-LiPo oder zwei Lithium-Knopfzellen.

3) Um eine ATmega-Schaltung mit 4 AA-Batterien zu versorgen, verwende ich normalerweise eine 1N4001-Diode auf VCC, um die maximalen 6 Volt der 4 Batterien auf 5,5 Volt zu senken. Außerdem schützt die Diode den ATmega vor Verpolung, sodass er zwei nützliche Funktionen erfüllt. Auf diese Weise kann ich einen batteriebetriebenen Schaltkreis erstellen, der im Schlaf nur 0,1 µA verbraucht, da kein Spannungsregler ständig Strom aufnimmt.

Tim Eckel
quelle
8

Ich habe einen Test mit einer nackten atmega328P-PU auf einem Steckbrett mit der RocketScream LowPower-Bibliothek durchgeführt

Verwendet diese Skizze:

#include "LowPower.h"

void setup(){}

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

Mit einem uCurrent Gold habe ich im Power-Down-Modus 7,25 uA gemessen.

Guus
quelle
1
Nett! Ich werde es so schnell wie möglich versuchen. Kann damit ein atmega238 jahrelang mit einer CR2032-Batterie betrieben werden?
Basj
6

Es gibt hier zwei Fragen, aber nur die zweite ist wirklich Teil des Fragentitels. Daher ist es wahrscheinlich besser, wenn Sie eine andere Frage für die Arduino-Programmierfrage öffnen. Ich beantworte die zweite Frage hier.

Eine einzelne 1,5-V-AA-Alkalibatterie der Spitzenklasse hat eine Kapazität von ca. 2600 mAh. Wenn Sie sich für Lithium-Batterien entscheiden, können Sie mit etwas Glück bis zu 3400 mAh erreichen. Lassen Sie uns mit dieser Zahl als Basis für den absoluten Best-Case gehen.

Die Art und Weise, wie Sie die theoretische maximale Laufzeit für eine Last berechnen, ist einfach die Kapazität geteilt durch die Last. Wenn Ihre Last 1 mA beträgt, können Sie sie für 3400/1 = 3400 Stunden = 141 Tage = ~ 5 Monate betreiben. Dies ist jedoch nur ein theoretisches Maximum , da in dieser Zeit eine signifikante Spannung von ca. 65% auftritt. Wenn Sie den Ausgang regulieren, kommt es zu einem außer Kontrolle geratenen Effekt. Je niedriger die Batteriespannung ist, desto höher ist der Strom, der zur Aufrechterhaltung der geregelten Spannung erforderlich ist, wodurch die Batterie schneller entladen wird. Es würde mich wundern, wenn Sie mit einer Spannung, die hoch genug ist, um Ihr Gerät zu betreiben, mehr als 80% der angegebenen Kapazität nutzen können.

Nehmen wir also an, Sie erhalten 80% dieser Zeit nach Spannungsabfall und Ineffizienzen des Reglers. Wir gehen davon aus, dass Sie mit 3,3 V aus drei in Reihe geschalteten Batterien arbeiten. Dies gibt Ihnen immer noch die gleiche Kapazität, aber die Spannung reicht für einen Regler. Wenn Ihr Gerät mit 15 mA betrieben wird (das ist eine eher konservative Schätzung), sehen die Zahlen folgendermaßen aus:

  • Kapazität nach 80% Wirkungsgrad = 3400 * 0,8 = 2720 mAh
  • Zeit = 2720/15 = 181 Stunden = 7,54 Tage

Sie benötigen also etwa 144 Lithiumbatterien (48 3er-Sets), um das Gerät ein Jahr lang zu betreiben. Nicht so gut!

Ich würde vorschlagen, stattdessen eine geregelte Gleichstromversorgung aus dem Netz zu verwenden. Ein Batterie-Backup kann mitgeliefert werden, das mit einem SPDT-Relais einfach eingerichtet werden kann. Schließen Sie einfach die Spule an das Gleichstromnetz an und lassen Sie den "Aus" -Kontakt an die Batterie anschließen. Wenn der Gleichstrom ausfällt, fällt der Kontakt ab und die Batterie wird stattdessen verwendet.

Polynom
quelle
Meine schnurlosen Träume sind zermalmt;) Danke für die ausführliche Antwort. Dies schien mir auch die beste Option zu sein.
LouwHopley
Zufälligerweise war dies die gleiche Frage, die ich mir beim Entwurf eines elektronischen Türschlosses gestellt habe. Selbst mit einem klobigen 10.000mAh Akku hat es sich nicht gelohnt. Endete nur mit einem 250mA DC-Adapter und einem alten Handy-Akku als Backup.
Polynom
4
15 mA Durchschnitt klingt für mich nicht sehr konservativ! Der 328 kann im Schlafmodus mit einstelligen Mikroampere betrieben werden, und Sie könnten mit Sicherheit davonkommen, wenn Sie ihn die meiste Zeit im halbtiefen Schlaf haben. Auch bei tiefen Frequenzen (zB 0,5 MHz) kommt man im aktiven Modus mit <1 mA aus. Natürlich müssen andere Komponenten (Spannungsregler usw.) ausgewählt werden, um der Niedrigleistungsnatur zu entsprechen.
Exscape
4
@Polynomial Ich habe mir den Schaltplan nicht genau angesehen, aber das Projekt könnte sicherlich ohne eine "Power-LED" erstellt werden. Oder Sie können es blinken lassen, so dass es zB bei halber Helligkeit (über PWM) nur für etwa 25 ms alle 2 Sekunden eingeschaltet ist, so dass der Stromverbrauch auf einen Durchschnitt von ~ 0,09 mA statt 15
sinkt
1
Arduino ist macht hungrig. Der Bau eines eigenen Boards würde dies lösen. Der Atmega328 verbraucht 0,2 mA bei 32 kH und 0,75 uA im Stromsparmodus.
Vorac
4

Was noch niemand erwähnt hat: Sie müssen eine Möglichkeit haben, die + 5V-Versorgung des Servos auszuschalten, wenn Sie es nicht verwenden. Selbst wenn es sich nicht bewegt, zieht ein Servo immer noch Strom.

Ein FET mit dem Gate, das von einem I / O-Pin vom Arduino gesteuert wird, ist eine gute Möglichkeit, dies zu tun.

jwygralak67
quelle
Ich verwende normalerweise einen 2N3904 für jeden Sensor oder was auch immer, um ihn ein- / auszuschalten. Oder wenn der Sensor schwach ist und die gleiche Spannung wie der ATmega hat, verwende ich einfach einen Pin direkt, um den Stromstatus zu steuern.
Tim Eckel
1
Verwenden Sie einen 2n7000, um deutlich weniger Strom zu verbrauchen als einen 2n3904, und Sie benötigen keinen Basiswiderstand.
John Meacham
3

Sie können einen Mikrocontroller verwenden, der speziell für den geringen Stromverbrauch Ihres nächsten Designs optimiert ist. Für einen geringen Stromverbrauch ist es notwendig, im Schlaf sehr wenig Strom aufzunehmen. Was oft übersehen wird, ist, dass es auch wichtig ist, wie schnell es aus diesem Schlaf aufwachen kann.

Was zählt, ist, wie viel Ladung vom tiefsten Schlaf benötigt wird, um eine Unterbrechung so schnell wie möglich zu bewältigen (da der Stromstoß dann sehr kurz ist) und wieder einzuschlafen.

Ein Beispiel für einen solchen Mikrocontroller ist MSP430 von Texas Instruments. Auf ihrer Website finden Sie Anwendungshinweise zum Einsparen von Energie und zur Energiegewinnung.

Peer Stritzinger
quelle