Forum: Mikrocontroller und Digitale Elektronik Stromreduzierung in Power-Down mit CKDIV8 ?


von Michael (Gast)


Lesenswert?

Hallo zusammen,

ich würde gerne den Power-Down-Stromverbrauch meiner Atmega168-Schaltung
noch weiter vermindern.
Die angeratenen Sachen wie disable von UART, Watchdog etc. habe ich 
angewandt, trotzdem verbaucht die Schaltung im power-down-Mode noch ca. 
0,75mA.

Das einzige was mir noch einfällt ist die Reduzierung des Taktfrequenz, 
allerdings funktioniert das Programm überhaupt nicht mehr, wenn ich das 
Häkchen in der CKDIV-Fusebit drinlasse.
Standardmäßig ist das Fuse ja gesetzt, und der Takt durch 8 geteilt, was 
ich für einen geringeren Stromverbrauch ja bräuchte, nur leider 
funktioniert es eben nicht.

Könnt ihr mir vielleicht einen Tip geben ?

Danke,
Michael

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


Lesenswert?

Michael schrieb:
> trotzdem verbaucht die Schaltung im power-down-Mode noch ca.
> 0,75mA.

Das klingt so, als würde da noch ein Ausgang Strom verlangen. Jedes mA, 
was der MC im Powerdown am Ausgang liefern muss, geht in die Bilanz. 
Auch vor sich hin floatende Eingänge ziehen oft Strom.

Michael schrieb:
> allerdings funktioniert das Programm überhaupt nicht mehr, wenn ich das
> Häkchen in der CKDIV-Fusebit drinlasse.

Tja, das ist wohl für 8MHz geschrieben. Ohne das ganze auf 1MHz 
umzutippen (und das betrifft z.B. auch etwaige Timereinstellungen) und 
neu zu kompilieren, wird das nichts.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> Das einzige was mir noch einfällt ist die Reduzierung des Taktfrequenz

Hat bei Powerdown keinen Sinn, denn da sind die Oszillatoren sowieso
ausgeschaltet.

0,75 mA sind für Powerdown eindeutig zu viel.

Wenn man dir helfen soll, musst du aber mehr verraten.

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)

>angewandt, trotzdem verbaucht die Schaltung im power-down-Mode noch ca.
>0,75mA.

Dann stimmt was nicht. Offene Eingänge? Angeschlossene Lasten? Falscher 
Sleep Mode?

>Das einzige was mir noch einfällt ist die Reduzierung des Taktfrequenz,

Nö, denn im Power Down sind ALLE Oszillatoren ausgeschaltet, siehe 
Sleeep Mode.

>allerdings funktioniert das Programm überhaupt nicht mehr, wenn ich das
>Häkchen in der CKDIV-Fusebit drinlasse.

Weil dein Prgramm auf die hohe, korrekte Taktdrequenz angewiesen ist, 
wie die meisten Programme.

>Könnt ihr mir vielleicht einen Tip geben ?

https://www.mikrocontroller.net/articles/Ultra_low_power

von Michael (Gast)


Lesenswert?

Vielen Dank für die raschen Antworten.
O.K., dann liegts nicht an der Taktfrequenz,
spielen die data direction bits dann eine Rolle ?
Kann ich hier Strom sparen, indem ich diese während des sleeps verändere 
im Vergleich zum Standard-Modus ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> Kann ich hier Strom sparen, indem ich diese während des sleeps verändere
> im Vergleich zum Standard-Modus ?

Jein.

Nochmal: du musst schon ein wenig mehr über dein Projekt schreiben,
was hängt an den Ausgängen dran, was passiert mit den Dingen, die da
dran hängen.

Sleep bedeutet nicht, dass irgendwelche Ausgangstreiber abgeschaltet
werden, sondern alle IOs bleiben so, wie sie zuvor waren.

von Bald (Gast)


Lesenswert?

Plenken ist ein sehr schlechte Angewohnheit. Das nicht posten von 
Quelltexten auch.

von Philipp K. (philipp_k59)


Angehängte Dateien:

Lesenswert?

Die Angaben zwischen 5V und 3V bzw 1,8V sind auch Relevant.

Das Optimum erreicht man nur bei 1,8V/1Mhz.

Hab die Tabelle zufällig auf da ich auch auf 100uA kommen möchte.

Ich bin noch mit nem 32khz Quarz, 8Mhz Intern im Powersave Modus bei 
8ma, mein Plan ist nun alles wegschalten und auf Bedarf TWI wieder 
zuschalten und notfalls auch auf die 1Mhz runter.

Im Prinzip biste doch schon gut dabei.

von Falk B. (falk)


Lesenswert?

@ Michael (Gast)

>spielen die data direction bits dann eine Rolle ?

Ja! ALLE unbenutzen IOs müssen entweder als Ausgang oder als Eingang mit 
aktiviertem, internen Pull-Up Widerstand konfiguriert werden.

>Kann ich hier Strom sparen, indem ich diese während des sleeps verändere
>im Vergleich zum Standard-Modus ?

Nein. Es reicht, das einmal richtig einzustellen.

von Michael (Gast)


Lesenswert?

Bald schrieb:
> Plenken ist ein sehr schlechte Angewohnheit. Das nicht posten von
> Quelltexten auch.

Das nicht nur der Controller Strom zieht, sondern die komplette 
Schaltung ist mir klar. Doch diese kann ich ja nicht mehr weiter 
reduzieren.

Eigentlich kann ich ja nur noch an den Ausgängen Strom sparen, indem ich 
eben die Ausgangstrieber vielleicht ausschalte (wie geht das ?), während 
des Sleep-Modus.

Konrket hängt über SPI ein Sensor und ein DOG-Display (braucht ca. 
0,2mA) und ein Taster (zum Aufwachen) an der Schaltung.

Muss ich hier die DD-Register auf high oder low schalten um hier Strom 
zu sparen ?
Oder bringst was, wenn ich die Portpins, an denen der SPI hängt, auf low 
schalte ?

von Michael (Gast)


Lesenswert?

Falk B. schrieb:
> Ja! ALLE unbenutzen IOs müssen entweder als Ausgang oder als Eingang mit
> aktiviertem, internen Pull-Up Widerstand konfiguriert werden.

Danke, das werde ich (leider heute nicht mehr) ausprobieren.
Ob Eingang oder Ausgang wird stromspartechnisch egal sein, oder ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Philipp K. schrieb:

> Das Optimum erreicht man nur bei 1,8V/1Mhz.

Keineswegs.  Bei 1 MHz brauchst du eben auch 8mal so lange zum Rechnen
wie bei 8 MHz, entsprechend kannst du dich nicht so lange schlafen
legen.

Was wirklich dabei das Optimum ist, hängt von einer Reihe
Einflussfaktoren ab.

> Hab die Tabelle zufällig auf da ich auch auf 100uA kommen möchte.

Du sprichst von Idle mode, der TE von Powerdown.  Das sind zwei sehr
verschiedene Paar Schuhe.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> Ob Eingang oder Ausgang wird stromspartechnisch egal sein, oder ?

Solange der Ausgang keinen Strom zieht oder treibt: ja.

Strom treiben kann ein Ausgang auch durch Kriechströme (feucht
werdende Flussmittelreste).  Das spielt aber erst eine Rolle, wenn
du auf 1 µA oder weniger runter kommen willst.

von Stefan F. (Gast)


Lesenswert?

Du kannst auch an den Eingängen Strom sparen, indem du sicherstellst, 
dass sie einen eindeutigen Logikpegel haben. Ganz schlecht sind 
unbeschaltete unbenutzte Eingänge. Die schaltest du besser als Ausgang 
um oder aktivierst Pull-Up Widerstände.

Siehe http://www.ti.com/lit/an/scba004c/scba004c.pdf

von Philipp K. (philipp_k59)


Lesenswert?

Jörg W. schrieb:
> Du sprichst von Idle mode, der TE von Powerdown.  Das sind zwei sehr
> verschiedene Paar Schuhe.

Ich spreche von Power_Save und nicht Idle.

Jörg W. schrieb:
> Keineswegs.  Bei 1 MHz brauchst du eben auch 8mal so lange zum Rechnen
> wie bei 8 MHz, entsprechend kannst du dich nicht so lange schlafen
> legen.

Wer jeden uA sparen will rechnet nicht viel und ist eigentlich selten 
Powered.
Sonst würde das ja auch keinen Sinn machen.

von Michael (Gast)


Lesenswert?

Unter 300µA muss ich mit dem Stromverbrauch gar nicht können.
Leider muss ich bei 5V Spannungsversorgung bleiben wegen des Sensors.
Die unbeschalteten, unbenutzten Portpins sind aktuell noch undefiniert, 
hätte nicht gedacht, dass sich das auf den Stromverbrauch auswirkt.
Das werde ich noch ändern.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Philipp K. schrieb:

> Ich spreche von Power_Save und nicht Idle.

Das passt nicht zur von dir markierten Stelle (da steht „Idle“) und
auch nicht zu deiner Aussage: bei Powerdown (und Powersave genauso)
läuft der Hauptoszillator nicht, daher spielt seine Frequenz keine
Rolle.

> Wer jeden uA sparen will rechnet nicht viel und ist eigentlich selten
> Powered.
> Sonst würde das ja auch keinen Sinn machen.

Irgendwas will man ja auch berechnen, sonst bräuchte man keine CPU.

Was beim AVR allerdings auf jeden Fall stimmt ist, dass man mit
geringerer Versorgungsspannung immer spart.  Man muss dann nur sehen,
ob mit der noch zulässigen Taktfrequenz die Aufgabe erfüllbar ist.

von Mein grosses V. (vorbild)


Lesenswert?

Michael schrieb:
> Die angeratenen Sachen wie disable von UART, Watchdog etc. habe ich
> angewandt, trotzdem verbaucht die Schaltung im power-down-Mode noch ca.
> 0,75mA.

> Könnt ihr mir vielleicht einen Tip geben ?

Du bist zufällig stolzer Besitzer eines Atmel Ice oder eines anderen 
Debuggers?

Im Debug Wire Mode tut der Controller nur so als wäre im Sleep.

von npn (Gast)


Lesenswert?

Philipp K. schrieb:
> Im Prinzip biste doch schon gut dabei.

Ich glaube, hier verwechselst du was. Es geht um den PowerDown-Mode. Da 
steht in der Tabelle eine Stromaufnahme von 0.1µA und bei Michael 
fließen aber 0.75mA - das ist ca. 7500mal so viel! :-))

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Michael schrieb:
> Die unbeschalteten, unbenutzten Portpins sind aktuell noch undefiniert,
> hätte nicht gedacht, dass sich das auf den Stromverbrauch auswirkt.

Wenn sie floaten, dann schalten sie u. U. ständig zwischen zwei
Pegeln.  Bei CMOS kosten vor allem die Schaltvorgänge den Hauptanteil
des Stroms (zumindest bei Strukturgrößen der klassischen AVRs, bei
denen Leckströme noch nicht die Rolle spielen).

von Philipp K. (philipp_k59)


Lesenswert?

Wenn man nur einen Taster zum anschmeissen benutzt kann man doch 
bestimmt ne sparsamere Schaltung aufbauen als den AVR unbedingt in den 
PowerDown zu schicken.

Wobei PowerDown ist doch PowerDown.. alles was da mehr zieht sind 
externe Komponenten und man brauch erst garnicht anfangen zu 
diskutieren..

Zitat zum PowerDown wenn Watchdog deaktiviert ist:
Die Stromaufnahme wird nur noch von den Leckströmen bestimmt und liegt 
typisch bei 300 nA.

von (prx) A. K. (prx)


Lesenswert?

Offene Eingänge spielen nur dann eine Rolle, wenn sie für die Beendigung 
vom Sleep relevant sind. Andernfalls klemmt die Innenschaltung den Pin 
per Transmission Gate ab und hängt die Folgeschaltung auf GND. Floatende 
Pins führen also im Powerdown nicht zu erhöhtem Stromverbrauch.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> Ansonsten klemmt die Innenschaltung den Pin per Transmission Gate ab und
> hängt die Folgeschaltung auf GND.

Stimmt natürlich.  Allerdings ist beim Signal DIEOVxn nicht wirklich
erklärt, wann es gesetzt wird.  Da beim ATmega168 alle IO-Pins einen
Pin-Change-Interrupt triggern können, müssen diese unter bestimmten
Umständen den Eingang schon öffnen.  Man sollte hoffen, dass das
Signal nur dann generiert wird, wenn das entsprechende PCINTnn-Bit
gesetzt ist.

Aber dennoch eine interessante Anmerkung.

Philipp K. schrieb:
> Wenn man nur einen Taster zum anschmeissen benutzt kann man doch
> bestimmt ne sparsamere Schaltung aufbauen als den AVR unbedingt in den
> PowerDown zu schicken.

Nicht unbedingt.  Da AVRs relativ wenig Leckstrom haben, ist ein AVR
im Powerdown + externer Interrupt zum Aufwachen gar keine schlechte
Variante in vielen Fällen.

von (prx) A. K. (prx)


Lesenswert?

Jörg W. schrieb:
> Man sollte hoffen, dass das
> Signal nur dann generiert wird, wenn das entsprechende PCINTnn-Bit
> gesetzt ist.

Behauptet zumindest das Datasheet: "SLEEP is overridden for port pins 
enabled as external interrupt pins. If the external interrupt request is 
not enabled, SLEEP is active also for these pins."

: Bearbeitet durch User
von Mein grosses V. (vorbild)


Lesenswert?

Jörg W. schrieb:
> Da beim ATmega168 alle IO-Pins einen
> Pin-Change-Interrupt triggern können, müssen diese unter bestimmten
> Umständen den Eingang schon öffnen.  Man sollte hoffen, dass das
> Signal nur dann generiert wird, wenn das entsprechende PCINTnn-Bit
> gesetzt ist.

Aber nur die, die mit den Maskenregistern gesetzt werden. Wer dann keine 
Pullups setzt, sondern die Eingänge offen lässt, ist selber Schuld.

von (prx) A. K. (prx)


Lesenswert?

Jörg W. schrieb:
> Signal nur dann generiert wird, wenn das entsprechende PCINTnn-Bit
> gesetzt ist.

Ist so, wie aus der Detailbeschreibung der GPIO Steuerung hervorgeht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

OK, das wäre erstmal eine genügend fundierte Aussage.

Danke, ich wusste zwar, dass man bei einigen neueren AVRs die Eingänge
generell abklemmen kann, aber dass dies auch beim SLEEP passiert, war
mir so nicht bewusst.  Gerade nachgesehen, AT90S1200 und ATmega103
hatten das noch nicht, beim ATmega163 und ATmega128 scheint man es
eingeführt zu haben.

von Stefan F. (Gast)


Lesenswert?

> Wenn sie floaten, dann schalten sie u. U. ständig zwischen
> zwei Pegeln.

Schlimmer noch, es kann passieren, dass sowohl der High-Side Transistor 
als auch der Low-Side Transistor gleichzeitig leiten. Dann fließt ein 
verhältnismäßig hoher Strom direkt von VCC nach GND (durch die beiden 
Transistoren).

Das kann bei einem AVR durchaus mehrere Milliampere bewirken.

In der Ausbildung hatte ich lernen müssen, das CMOS Chips durch diesen 
Effekt sogar durchbrennen können - habe ich im realen leben allerdings 
noch nicht erlebt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Schlimmer noch, es kann passieren, dass sowohl der High-Side Transistor
> als auch der Low-Side Transistor gleichzeitig leiten.

Wie sollte sowas bei einem Eingang mit Schmitt-Trigger-Verhalten
auftreten können?

Die Eingangsstufen sind ja auch nicht anders, wenn man einen Eingang
als ADC benutzt, und dort darf man sehr wohl jeden Pegel zwischen
GND und Vcc anlegen.

Davon abgesehen, hatte A. K. uns ja drauf hingewiesen, dass die
Digitaleingänge während des Schlafs vom Pin abgetrennt sind.

von Soul E. (Gast)


Lesenswert?

Jörg W. schrieb:

> Wie sollte sowas bei einem Eingang mit Schmitt-Trigger-Verhalten
> auftreten können?

Wenn die AVRs grundsätzlich Schmitt-Trigger-Eingänge haben, um so 
besser.

Bei einem Renesas RH850 mach ein offener Eingang im Deepstop Mode ca 
300..500 µA aus. Grundsätzlich sollte man sich angewöhnen, 
Controllerpins entweder auf Ausgang zu schalten oder über Pullups mit 
einem definierten Pegel zu versehen.

von Falk B. (falk)


Lesenswert?

@ Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite

>> Schlimmer noch, es kann passieren, dass sowohl der High-Side Transistor
>> als auch der Low-Side Transistor gleichzeitig leiten.

>Wie sollte sowas bei einem Eingang mit Schmitt-Trigger-Verhalten
>auftreten können?

Ein weit verbreiteterr Irrtum, dem auch ich erlegen bin ;-)

Miss mal die Stromauchnahme eines 74HC14 bei langsam steigender Spannung 
ein einem Eingang und staune.

>Die Eingangsstufen sind ja auch nicht anders, wenn man einen Eingang
>als ADC benutzt, und dort darf man sehr wohl jeden Pegel zwischen
>GND und Vcc anlegen.

>Davon abgesehen, hatte A. K. uns ja drauf hingewiesen, dass die
>Digitaleingänge während des Schlafs vom Pin abgetrennt sind.

Nicht bei allen AVRs und nicht immer, dazu muss man ein paar 
Registerbist richtig setzen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Falk B. schrieb:
> Nicht bei allen AVRs

Laut Doku seit dem ATmega163/128.  Die alten AT90Sxxx, die es noch
nicht haben, dürften heute keine Rolle mehr spielen.

> und nicht immer, dazu muss man ein paar
> Registerbist richtig setzen.

Welche denn?

Laut Doku sollte es andersrum sein, also by default sind im Sleep
die Eingangsstufen immer abgetrennt.  Die Abtrennung wird nur 
verhindert,
wenn der Eingang zum Aufwecken benutzt werden soll.

von Falk B. (falk)


Lesenswert?

@  Jörg Wunsch

>> Nicht bei allen AVRs

>Laut Doku seit dem ATmega163/128.  Die alten AT90Sxxx, die es noch
>nicht haben, dürften heute keine Rolle mehr spielen.

Ist lange her, daß ich mich explizit um das Thema gekümmert habe. Die 
letzte Messung war glaub ich an einem ATmega32, dort konnte man mit 
offenen Eingängen noch mA fließen lassen. Die Pull-Ups dort 
einzuschalten ist auf jedden Fall nicht falsch.

>> und nicht immer, dazu muss man ein paar
>> Registerbist richtig setzen.

>Welche denn?

Weiß ich nicht, mit den diversen Power Reduction Bits hab ich mich auch 
nie beschäftigt, nur mal überflogen ;-)

>Laut Doku sollte es andersrum sein, also by default sind im Sleep
>die Eingangsstufen immer abgetrennt.  Die Abtrennung wird nur
>verhindert,
>wenn der Eingang zum Aufwecken benutzt werden soll.

Theroetisch ja, praktisch scheint aber beim OP was zu klemmen. Entweder 
offene Einänge bei einem älteren AVR oder angeschlossene ICs ziehen den 
Strom, im Zweifel parasitär durch die Schutzdioden der IOs.

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.