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" ;)
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
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/
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.
@ 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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.