Forum: Mikrocontroller und Digitale Elektronik stromsparender Langzeittimer für ATmega328 gesucht


von Benjamin H. (garnienicht)


Lesenswert?

Hallo miteinander,

mit Begeisterung lese ich schon einige Zeit in diesem Forum. Bislang hat 
mir die Suche tolle Ideen und Ansätze für meine Fragen geliefert, aber 
der Punkt ist nun doch erreicht an dem ich verwirrter Weise keine Lösung 
finde. Also deswegen hier mein Versuch, "aktiv" teilzunehmen ;)



Meine Problemstellung: Ein ATmega328P bei 16MHz soll in einem 
definierbaren Bereich von 15min - 120min (eine Toleranz von +/- 10% 
spielt dabei keine Rolle) ein paar Messwerte erfassen. Da es mehr auch 
nicht zu tun gibt und Energie vor allem bei Batteriebetrieb ein knappes 
Gut ist, soll die Zeit dazwischen mit möglichst energiesparend im 
Sleep-Modus vergehen.

Ich stelle mir nun die Frage, wie ich den Timer für die nächste 
Messwerterfassung am energiesparendsten realisieren kann. Ich sehe dabei 
folgende Möglichkeiten:
1) den Mega328 nur in Power-Save versetzen, per Timer2 und Interrupt 
einen Zähler hochzählen, bis die nächste Messung erfolgt.
2) den Mega328 in Power-Down versetzen, und über einen externen 
Interrupt nur zur eigentlichen Messung wecken. Hierfür schweben mir 
wiederum zwei Möglichkeiten vor:
2a) ein Zeitgeber wie z.B. ein CD4536 wie aus folgendem Beitrag: 
Beitrag "Wer kennt sich mit CD4536 aus?"
2b) ein ATtiny45 der erst mit Spannung versorgt wird wenn der Mega328 in 
den Sleep-Modus versetzt wird, etwas energiesparender als der Mega328 
die Möglichkeit 1) realisiert, den Mega328 weckt und dann abgeschalten 
wird.

Doch welches ist die vermeintlich energiesparendste Lösung? Es handelt 
sich hier um keine kommerzielle, sonder rein hobbyistische Anwendung. 
Ein paar Cent mehr an Bauteilkosten gegen ein paar mW Energieeinsparung 
würden mich  daher nicht stören.

Oder habe ich gar den besten Weg noch übersehen?



Bitte entschuldigt eventuelle Fehler in meiner laienhaften Formulierung. 
Über das Thema Timer Interrupts und Watchdog Timer habe ich bislang nur 
einen groben Überblick gewonnen und muss ich mich noch tiefer 
einarbeiten. Mir geht es auch nicht um eine fertige Lösung, sondern nur 
um eure Einschätzung, damit ich mich nicht in die falsche Richtung 
verirre.

Achja, ein Geständnis am Ende noch: Ich bin zwar kein 
Elektronik-Neuling,  aber habe den Einstieg in die Mikrocontroller-Welt 
neulich über Arduino gefunden und möchte der Einfachheit halber für die 
ersten Gehversuche in der entsprechenden IDE arbeiten. Daher begrenze 
ich mich auf den Einsatz eines Mega328P, sowie die ATtiny 44/84 und 
45/85. Ich hoffe das verkompliziert das Thema nicht unnötig und 
brandmarkt mich hier nicht direkt als "Aussätzigen" ;)

von Michael (Gast)


Lesenswert?

Hallo Benjamin,

Schau mal bei http://www.jeelabs.org nach.
Dort gibt's einige Beitraege wie man mit den ATMEGAs stromsparend 
arbeitet.
Z.B. http://jeelabs.org/2012/06/23/low-power-uas-in-perspective/

Der Betreiber Jean-Claude hat seine eigene Arduino-kompatible Plattform 
entwickelt (JeeNode) fuer lokale Funk-Sensor-Netzwerke und seine Artikel 
sind eigentlich immer sehr interessant und detailliert.

MfG,
Michael

von Michael (Gast)


Lesenswert?

Hier ist noch ein weiterer passender Artikel zum Thema:
http://jeelabs.org/2010/10/18/tracking-time-in-your-sleep/

Oder einfach mal nach dem Tag "lowpower" suchen...
http://jeelabs.org/tag/lowpower/

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Benjamin H. schrieb:
> Ein ATmega328P bei 16MHz soll in einem
> definierbaren Bereich von 15min - 120min (eine Toleranz von +/- 10%
> spielt dabei keine Rolle) ein paar Messwerte erfassen. Da es mehr auch
> nicht zu tun gibt...

Wieso lässt Du den Controller nicht mit 128kHz Taktrate anstelle der 
16MHz laufen, dann kannst Du Dir den ganzen Stromsparquatsch schenken, 
weil der Controller dann nur noch 30µA im Active-Mode zieht.

von Falk B. (falk)


Lesenswert?

@  Benjamin H. (garnienicht)

>Meine Problemstellung: Ein ATmega328P bei 16MHz soll in einem

Voll Pulle. Ist das nötig?

>spielt dabei keine Rolle) ein paar Messwerte erfassen. Da es mehr auch
>nicht zu tun gibt und Energie vor allem bei Batteriebetrieb ein knappes
>Gut ist, soll die Zeit dazwischen mit möglichst energiesparend im
>Sleep-Modus vergehen.

Siehe Sleep Mode.

>1) den Mega328 nur in Power-Save versetzen, per Timer2 und Interrupt
>einen Zähler hochzählen, bis die nächste Messung erfolgt.

Würde ich so machen.

>2) den Mega328 in Power-Down versetzen, und über einen externen
>Interrupt nur zur eigentlichen Messung wecken. Hierfür schweben mir
>wiederum zwei Möglichkeiten vor:

Kann man machen, loht sich aber bei 120min nicht.

>2a) ein Zeitgeber wie z.B. ein CD4536 wie aus folgendem Beitrag:
>Beitrag "Wer kennt sich mit CD4536 aus?"

Alter Mist. Vergiss es.

>2b) ein ATtiny45 der erst mit Spannung versorgt wird wenn der Mega328 in
>den Sleep-Modus versetzt wird, etwas energiesparender als der Mega328
>die Möglichkeit 1) realisiert, den Mega328 weckt und dann abgeschalten
>wird.

Unsinnig, die großen AVRs braucht praktisch genausoviel Strom wie die 
kleinen, die FLash- und RAM-GRöße hat das kaum Einfluß.

>sich hier um keine kommerzielle, sonder rein hobbyistische Anwendung.
>Ein paar Cent mehr an Bauteilkosten gegen ein paar mW Energieeinsparung
>würden mich  daher nicht stören.

32kHz Uhrenquarz an Timer 2.

>Über das Thema Timer Interrupts und Watchdog Timer habe ich bislang nur
>einen groben Überblick gewonnen und muss ich mich noch tiefer
>einarbeiten.

Siehe Interrupt.

von Schnurpsel (Gast)


Lesenswert?

Es gäbe auch noch die Möglichkeit den Takt des ATmega temporär per 
CLKPR-Register runterzuregeln. Wenn man den maximalen Prescaler von 256 
wählt käme man so schon auf einen Takt von 62.5 kHz herunter. Allerdings 
muss man dann natürlich aufpassen, dass man z.B. Zeitmessungen auch 
entsprechend anpasst, da bei 16 MHz pro Zeiteinheit natürlich mehr Takte 
vergehen als bei 62.5 kHz.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ja nach gewünschter Genauigkeit kannst du wirklich den Watchdog nehmen. 
Das lohnt sich auf einem Arduino nicht, falls du sowas benutzt, weil 
Spannungsregler und USB Bridge zu viel Strom verbrauchen, aber ein 
alleinstehender Mega328 geht da schon. Lass ihn langsam laufen (1 Mhz 
reicht vermutlich) und wecke ihn alle 8 Sekunden mit dem Watchdog. 
Beachte das Kapitel 'Minimizing Power Consumption' im Datenblatt und 
schalte alles ab, was du nicht brauchst.

von Benjamin H. (garnienicht)


Lesenswert?

erstmal ein herzliches Dankeschön euch allen, :-)
ich bin begeistert über die rege Rückmeldung!
ich habe definitiv genug Rückmeldung, mich heute Abend gezielt tiefer 
einzulesen.

Folgendes entnehme ich schon den ganzen Beiträgen: externer Interrupt 
lohnt sich nicht. Mein (vielleicht zu) naives Denken ging dahin, dass 
ein  Mega328 der innerhalb von 15-120min nur einen Bruchteil der Zeit 
(sagen wir mal max. 3 Sekunden) wirklich arbeitet und sonst im 
Power-Down vor sich hin schläft auch gerne ein 16MHz Quarz haben darf, 
nach dem Motto "fällt nicht ins Gewicht". Wäre schön gewesen, um 
"Arduino-kompatibel" zu bleiben.


Michael schrieb:
> Der Betreiber Jean-Claude hat seine eigene Arduino-kompatible Plattform
> entwickelt (JeeNode) fuer lokale Funk-Sensor-Netzwerke und seine Artikel
> sind eigentlich immer sehr interessant und detailliert.

sieht sehr hilfreich aus, und auf den ersten Blick sehr verständlich 
gehalten. Danke für den link!

Matthias Sch. schrieb:
> Das lohnt sich auf einem Arduino nicht, falls du sowas benutzt, weil
> Spannungsregler und USB Bridge zu viel Strom verbrauchen, aber ein
> alleinstehender Mega328 geht da schon. [...]
> Beachte das Kapitel 'Minimizing Power Consumption' im Datenblatt und
> schalte alles ab, was du nicht brauchst.

hatte ich leider vergessen zu erwähnen. Die Frage bezog sich auf kein 
Arduino-Board, sondern auf einen alleinstehenden Mega328P, für dessen 
Programm ich gerne auf die Arduino-Umgebung mit passendem Bootloader 
zurück gegriffen hätte.


Danke auch an Knut Ballhause, Falk Brunner und Schnurpsel. Eure Beträge 
mal zusammengenommen komme ich immer mehr an den Punkt, dass ich die 
Arduino IDE wohl hinter mir lassen sollte. Ich meine weniger als 16MHz 
geht wohl schon irgendwie mit der Arduino IDE, Register zu schreiben 
auch, aber bevor ich innerhalb dieser die große Rechnerei (und womöglich 
auch Bastelei) anfange, muss ich mir wohl ernsthaft überlegen bei meiner 
mir selbst gestellten Anforderung von der Arduino IDE Abstand zu nehmen 
und so langsam den Umstieg zu wagen ;)



Eine Möglichkeit habe ich noch gefunden, die ich allerdings trotz des 
Abratens von externen Interrupts doch noch nicht so ganz aus dem Kopf 
bekomme: DS2417P, "Real Time Clock, 1-wire, Interupt". Dem Datenblatt 
entnehme ich aufs erste die spannende Zeile "200 nA typically with 
oscillator running". Der Intrrupt-Intervall ist nur stufenweise 
einzustellen, aber die beiden Stufen 34min bzw. 68min decken sind wohl 
für meinen Zweck ziemlich brauchbar.

Zeit für ein wenig Datenblattstudium, IDE-Selbstfindung und Mathe! =)

Vielen Dank nochmal euch allen!

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.