Forum: Mikrocontroller und Digitale Elektronik Abschaltung/Deepsleep µC bei Unterspannung


von Marc W. (mawame07)


Lesenswert?

Guten Tag zusammen,

ich möchte einen Atmega328p mit einem RTC und anderer Peripherie an 
einem 3,7V LiPo-Akku betreiben. Das Problem hierbei ist, dass dies 
soweit funktioniert bis der Akku fast leer ist und dann auch der RTC 
seine Uhrzeit nicht mehr lange halten kann. Jetzt würde ich gerne mit 
einem STM810
 https://www.st.com/resource/en/datasheet/stm810.pdf
die Spannung des Akkus messen und bei einem bestimmten Wert den Atmega 
ausschalten, sodass die Spannung nur noch am RTC anliegt und somit die 
Uhrzeit länger erhalten bleibt. Dies ist unabhängig von einem DW01 IC 
der den Akku gegen Überspannung unter Unterspannung absichert.

Jetzt stell ich mir die Frage welche Form von Abschaltung am 
energieeffizientesten ist. Ich könnte den RST Ausgang des IC an einen 
Eingang des Atmega hängen um dann bei einer "Unterspannung" den Atmega 
in Deepsleep zu versetzen. Gleichzeitig wird der RST Ausgang an einen 
Interrupt Eingang gehängt, wenn dann die Spannung durch eine Aufladung 
des Akkus wieder steigt, dann kann der Interrupt den Atmega aus seinem 
Schlaf aufwecken. Könnte ich hier auch die beiden Funktionen auf einen 
Pin packen?

Oder wäre es sinnvoller, über den RST Ausgang einen Transistor, welcher 
die Spannung bzw. Ground vom Arduino abschaltet, einzubauen?

oder gibt es noch eine weitere bessere Möglichkeit?

Würde mich über Antworten freuen!
Marc

von kenny (Gast)


Lesenswert?

Brown Out Detection wäre keine Lösung?

von Peter D. (peda)


Lesenswert?

Der Atmega328p kann beides intern:
- seine VCC überwachen, indem er sie als ADC-Referenz schaltet und damit 
die internen 1,1V mißt.
- mit Uhrenquarz an T2 im Power-Save (~1µA Verbrauch) einen 
Sekundeninterrupt erzeugen und darin die Zeit zählen.

von Drago S. (mratix)


Lesenswert?

Marc W. schrieb:
> soweit funktioniert bis der Akku fast leer ist
Der ATmega328 geht doch runter bis 1.8V. Ergo sollte er funktionieren 
bis der Akku vollständig ausgelutscht ist und in Tiefentladung fällt.

Marc W. schrieb:
> und dann auch der RTC
> seine Uhrzeit nicht mehr lange halten kann
Hat er keine Pufferbatterie?

Marc W. schrieb:
> sodass die Spannung nur noch am RTC anliegt
Dem RTC eine Knopfzelle spendieren/einsetzen.

Du erwähnst kein DevBoard, Module oder verwendete Breakouts, nur einen 
ATmega.
Daher gehe ich von einem separaten LDO aus. Wenn du den (gegen einen mit 
Enable-Pin) tauschst, könntest du den LDO triggern und abschalten. Der 
ATmega hat leider kein CE (Chip enable) dass man dort ansetzen könnte.

Marc W. schrieb:
> DW01 IC
> der den Akku gegen Überspannung unter Unterspannung absichert.
Mythos. Vodp des DW01 liegt bei 2.3-2.4V. Das ist alles andere als gegen 
Unterspannung sichern.

von Manfred (Gast)


Lesenswert?

Peter D. schrieb:
> - seine VCC überwachen, indem er sie als ADC-Referenz schaltet und damit
> die internen 1,1V mißt.

So etwas ähnliches habe ich gemacht, um Strom zu sparen: Der Arduino 
geht in Sleep, maximal 8s sind machbar (sehr ungenau). Aufwachen, Zähler 
inkrementieren und alle etwa Viertelstunde eine Spannung messen - 
Refernz intern 1,1V aktiv. Um Strom zu sparen, wird der Spannungsteiler 
vor dem Analogeingang per FET nur kurz zugeschaltet - der A* ist etwa 
4ms wach.

Mit MCP1703-5V und ein paar Elkos drumherum liegt der 
Durchschnittsverbrauch bei knapp 30µA.

Den Schlafmodus habe ich hier abgemalt:
http://www.home-automation-community.com/arduino-low-power-how-to-run-atmega328p-for-a-year-on-coin-cell-battery/

Mister A. schrieb:
> Der ATmega328 geht doch runter bis 1.8V.

Aber nur, wenn der Takt niedrig genug ist.

von Marc W. (mawame07)


Lesenswert?

Mister A. schrieb:
> Marc W. schrieb:
>> soweit funktioniert bis der Akku fast leer ist
> Der ATmega328 geht doch runter bis 1.8V. Ergo sollte er funktionieren
> bis der Akku vollständig ausgelutscht ist und in Tiefentladung fällt.

Dann muss der Fehler wohl irgendwie auf dem Board liegen, bei 3V gingen 
bei mir die LEDs aus, da hatte die Batterie noch 3V, aber der Atmega 
keine Funktion mehr...

> Marc W. schrieb:
>> und dann auch der RTC
>> seine Uhrzeit nicht mehr lange halten kann
> Hat er keine Pufferbatterie?

nein, der DS3231MZ+ wird vom Akku gespeist, eine zusätzliche Knopfzelle 
ist aus Platzgründen nicht möglich.


> Marc W. schrieb:
>> sodass die Spannung nur noch am RTC anliegt
> Dem RTC eine Knopfzelle spendieren/einsetzen.
>
> Du erwähnst kein DevBoard, Module oder verwendete Breakouts, nur einen
> ATmega.
> Daher gehe ich von einem separaten LDO aus. Wenn du den (gegen einen mit
> Enable-Pin) tauschst, könntest du den LDO triggern und abschalten. Der
> ATmega hat leider kein CE (Chip enable) dass man dort ansetzen könnte.

Nein, es ist kein zusätzlicher LDO verbaut, die Bauteile: RTC, IO 
Expander und Atmega werden direkt mit dem Akku versorgt.

> Marc W. schrieb:
>> DW01 IC
>> der den Akku gegen Überspannung unter Unterspannung absichert.
> Mythos. Vodp des DW01 liegt bei 2.3-2.4V. Das ist alles andere als gegen
> Unterspannung sichern.

den DW01 hab ich jetzt gegen einen BQ2970 getauscht. Hier hab ich mich 
an strinkt an das Datasheet gehalten.

von Marc W. (mawame07)


Lesenswert?

Manfred schrieb:
> Peter D. schrieb:
>> - seine VCC überwachen, indem er sie als ADC-Referenz schaltet und damit
>> die internen 1,1V mißt.

Wie muss ich das verstehen? Ich dachte die ADC-Referenz vergleicht die 
anliegende Spannung am PIN mit der Versorgungsspannung? Hierbei würde ja 
immer die Versorgungsspannung mit der Versorgungsspannung vergleichen? 
Wie müsste ich das verschalten?

> So etwas ähnliches habe ich gemacht, um Strom zu sparen: Der Arduino
> geht in Sleep, maximal 8s sind machbar (sehr ungenau). Aufwachen, Zähler
> inkrementieren und alle etwa Viertelstunde eine Spannung messen -
> Refernz intern 1,1V aktiv. Um Strom zu sparen, wird der Spannungsteiler
> vor dem Analogeingang per FET nur kurz zugeschaltet - der A* ist etwa
> 4ms wach.
>
> Mit MCP1703-5V und ein paar Elkos drumherum liegt der
> Durchschnittsverbrauch bei knapp 30µA.
>
> Den Schlafmodus habe ich hier abgemalt:
> 
http://www.home-automation-community.com/arduino-low-power-how-to-run-atmega328p-for-a-year-on-coin-cell-battery/
>
> Mister A. schrieb:
>> Der ATmega328 geht doch runter bis 1.8V.
>
> Aber nur, wenn der Takt niedrig genug ist.

Vielen Dank für die Tipps! Aber das passt zu meinem Aufbau nicht ganz so 
:)

von Drago S. (mratix)


Lesenswert?

Marc W. schrieb:
> Ich dachte die ADC-Referenz vergleicht die
> anliegende Spannung am PIN mit der Versorgungsspannung? Hierbei würde ja
> immer die Versorgungsspannung mit der Versorgungsspannung vergleichen?
> Wie müsste ich das verschalten?
Die Referenz nicht mit ADC verwechseln.

Die interne Referenz ist das eine, damit fährt man meistens gut. Wie 
oben bereits erwähnt, Brownout verwenden.
Externe Referenz anlegen geht auch, bringt nur mehr Genauigkeit.
Die Akkuspanung (über Teiler) an Referenz anlegen würde den 
Referenzpunkt konstant, mit sinkender Zellspannung, nach unten 
verlagern. Schlecht.
Akkuspannung über Teiler am ADC messen funktioniert soweit gut. Die 
Sache ist nur, was dann als Aktion folgen soll bzw. abgeschaltet werden 
soll.

Und da wären wir wieder an der Quelle, kein LDO, also den Akku per 
MOSFET abschalten/unterbrechen.

Den RTC könntest du weiter aus der Unterspannung puffern. Der saugt 
sicherlich nicht in die Tiefentladung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.