aus RN-Wissen, der freien Wissensdatenbank
Wechseln zu: Navigation, Suche



Der Stromverbrauch von CMOS µCs ist etwa proprotional zur Taktfrequenz und Spannung. Für einen geringen Stromverbrauch könnte man also die Frequenz so weit reduzieren, dass die Rechengeschwindigkeit gerade noch ausreicht. Sonderlich praktisch ist diese Methode aber nicht. Moderne µCs haben eine Möglichkeit den Stromverbrauch zu reduzieren, wenn keine Rechenzeit nötig ist. Der µC macht dann eine Pause in der deutlich weniger Strom verbaucht wird als im normalen Betrieb. Es ist durchaus üblich, das der größte Teil der Zeit in einem Stromsparmodus verbracht wird. Eine niedrigere Frequenz kann trotzdem sinnvoll sein, wenn dadruch eine niedrigere Spannung möglich ist und auch wegen weniger Funkstörungen. Eine reduzierte Spannung ist in jedem Fall sinnvoll.

Der folgende Teil bezieht sich auf die ATMEL AVR Controller. Vieles gilt so ähnlich aber auch für Pic, MSP430 und andere.


Stromsparmodi

Bei den AVRs gibt es verschiedene Stromsparmodi (Sleep Modes). Sie unterscheiden sich dadurch wie viel Perepherie noch läuft und wie der µC wieder in den normalen Zustand zurückkehrt. In der Regel ist dies durch das Auslösen eines Interrupts, der dann als erstes ausgeführt wird. Die Beschreibung bezieht sich im folgenden auf den Atmel Mega48/88/168. Die anderen AVR Controller sind aber recht ähnlich.


1) Idle : Dies ist der einfachste Sparmodus. Alle Timer, PWM Signale usw. laufen weiter und jeder Interrupt kann zum Aufwecken genutzt werden. Das aufwecken geht relativ schnell (6 Zyklen), so dass man diesen Mode auch für kürzere Wartezeiten gut nutzen kann. Die Stromaufnahmen reduziert sich immerhin auf etwa 20%-50%. Ein weiterer Vorteil ist es, dass die Antwortzeit auf den Interrupt genau definiert ist, da ja kein angefangener Befehl mehr abgearbeitet werden muß.

2) Powerdown: Fast alle Takte sind ausgeschaltet. Entsprechend gehen keine Timer, USART usw. Die Möglichkeiten zum Aufwecken sind entsprechend eingeschränkt. Ein Quarz als Takt ist in diesem Fall unpraktisch, denn es dauert etwas bis der Quarz wieder stabil schwingt. Die Verzögerung entspricht der nach einem Reset. Bevorzugt nutzt man hier also den internen Oszillator. Dafür ist der Stromverbauch in diesem Mode auch sehr niedrig (unter 1µA möglich) und es kann zum Teil auf ein echtes ausschalten verzichtet werden.

3) Powersave: Der Mode ist sehr änlich dem Powerdown, nur das Timer 2 im asyncronen Modus noch geht. Die Hauptanwendung ist es Timer 2 mit ein 32 kHz Quarz laufen zu lassen, um eine durchlaufende genaue Zeit (Echtzeituhr) zu haben. Der 32 kHz Takt kann dann auch zum kalibrieren des internen Taktes genutzt werden, um z.B. eine UART zu betreiben.

4) Standby: Ähnlich wie Powerdown, nur ist das Aufwachen schneller und definiert in 6 Zyklen. Nur der Oszillator läuft weiter. Sinnvoll ist das vor allem mit einem Quarz, der ja nicht so schnell starten kann.

5) ADC Noise Reduction mode: Dieser Mode dient dazu eine AD-Wandlung mit weniger Störungen zu bekommen. Die reduzierte Stromaufnahmen, ähnlich dem Idle Mode, ist dabei mehr ein Nebeneffekt. Das Aufwachen erfolgt hier in der Regel wenn die AD-Wandlung fertig ist.


Wenn man im Stromsparmode auf ein Ereignis wartet, kann man natürlich auch nicht den Watchdog zurücksetzen. Hier muß man dann eventuell ohne arbeiten, wenn kein passender Zeitgesteuerter Interrupt auftritt. Der Watchdog kann auch als langsamer und sparsamer Timer benutzt werden, um den µC gelegentlich (z.B. etwa jede Sekunde) aufzuwecken, um Hardware abzufragen. Neuere µCs wie Mega88 erlauben dazu über den Watchdogtimer einen Interrupt auszulösen. Eine genaue Zeitmessung ist damit allerdings nicht möglich.

Die Debugwire Funktion sollte abgeschaltet sein, vor allem für Powerdown und Powersave mode.

Aufwachen aus den Stromsparmodes

Nicht jeder Interrupt kann zum Aufwachen genutzt werden; genaueres im Zweifelsfall im Datenblatt nachsehen. Im Idle mode gehen alle Interrupts. In allen Modes reichen die folgenden Interrupts zum Aufwachen:

  • Pin Change
  • Int0 , Int1 , aber nur als Level Interrupt
  • TWI Address match
  • Watchdog timer, auch als Interrupt

Im Powersave mode geht auch ein Interrupt von Timer 2, der in diesem Mode ja gerade weiter laufen kann. Damit das Aufwachen funktioniert muß ein Interrupt auch per SEI freigegeben werden.

Softwarebeispiele

Praktisch immer, wenn auf einen Interrupt gewartet wird, kann ein sleep-mode genutzt werden. Im Extremfall kann man damit sogar die Schleife und das Flag ersetzen. Um das Risiko zu vermindern versehentlich (z.B. ohne Brownout) in den sleep-mode zu gelangen, gibt es ein extra Bit im Register SMCR, um den Sleep mode zu blockieren.

In Assembler gibt es den Befehl Sleep, um in den im Register SMCR eingestellten Sparmodus zu wechseln. Nach der ISR die den Sparmodus aufgehoben hat, wird hinter dem sleep-Befehl normal weitergemacht.

Bei WinArv (C) werden über #include <avr/sleep.h> die Stromsparfunktionen weitgehend hardwareunabhängig eingebunden. Ein Beispiel ist bereits hier: Timer/Counter_(Avr)#Input_Capture.

BASCOM hat für die Stromsparmodi extra Befehle: IDLE und POWERDOWN für einige µCs. Für andere Modes müßte man wohl inline ASM nutzen.

Sonstiges zum Stromsparen

ungenutzte Pins

Ein vermeidbarer weiterer Stromverbraucher sind Eingänge die unbeschaltet sind oder eine etwa mittlere Spannung haben. Besser ist es ungenutzte Pins als Ausgang zu definieren, oder einen definierten H oder L Pegel zu erzeugen, ggf. auch durch die internen Pullup Widerstände. Der eingeschaltete interne Pullup-widerstand braucht an sich noch keinen nennenswerten Strom. Bei den Eingängen für den AD und Comperator kann man den digitalen Eingang meist abschalten. Dies hilft auch gegen den zusätzlichen Stromverbrauch durch eine mittleren Spannungswert.

Taktquelle

Auch die Takterzeugung braucht Strom. In Standby Mode ist dies sogar der wesenliche Stromverbrauch. Der interne RC-Takt braucht dabei etwas mehr Strom als ein Quarz. Beim Quarz kann zum Teil zwischen geringem Stromverbrauch und höherer Störfestigkeit gewählt werden. Die sparsamste Taktquelle ist in der Regel ein 32 kHz Uhrenquarz oder der Takt vom Watchdog timer.

Bei neueren AVR Controllern kann der Takt intern geteilt werden. Man kann den Teiler auch zur Laufzeit verstellen. Man braucht also nicht den Quarz zu wechseln und kann trotzdem einen sparsameren langsamen Takt wählen. Besonders wenn man den Standby mode nutzt, ist es aber besser gleich den richtigen Quarz zu wählen.

IO Module

Neben der Recheneinheit brauchen auch die IO Module etwas Strom. Viele der Module lassen sich besonders bei neueren µCs einzelen zur Laufzeit abschalten. Bei älteren Modellen geht das wenigstens für den Watchdog, den Brownout Detektor, den analogen Komparator und ggf. den AD Wandler. Beim AD Wandler und der internen Referenz dauert es nach dem Einschalten aber etwas, bis gute Ergebnisse erzielt werden.

Die Abschaltung des digitalen Teil des AD-Wandlers bei neueren µCs ist etwas trickreich: nur wenn der Takt zum digitalen Teil eingeschaltet ist (Register PRR), kann man auf das Register ADCSRA zum an- und abschalten des analogen Teils zugreifen.

Daten zum Stromverbrauch

Die Wirksamkeit der Stromsparmodi kann man wohl am besten an Beispieldaten abschätzen. Die Beispieldaten aus dem Datenblatt (zum Teil aus Kurven abgelesen) sind für 3 V. Die Werte für den Mega16/Mega32 sind ähnlich (etwas höher) dem Mega8.

. Mega48/88 Mega8L Mega88PA
aktive 4 MHz (Q) 1,7 mA 6,8 mA 1,6 mA
aktive 1 MHz (RC) 550 µA 1,8 mA 450 µA
aktive 128kHz (WD) 60 µA n.A. 45 µA
aktive 32kHz (Q) 27 µA 65 µA ca.20 µA
idle 4 MHz (Q) 360 µA 1 mA 260 µA
idle 1 MHz (RC) 160 µA 300 µA 140 µA
idle 32kHz (Q) 15 µA 16 µA ca. 9 µA
power down 0,25µA 0,25µA 0,1 µA
power down+watchdog 4 µA 20 µA 4 µA
powersave, 32 kHz(Q2) 7 µA 10 µA 1 µA
Standby 4 MHz (Q) 80 µA 70 µA 65 µA

Taktquellen: Q = Quarz, RC = interner RC Takt, WD = Watchdog-takt, Q2 = Quarz für Timer2


Beim Mega48 u.Ä. lassen sich viele IO Module über das Register PRR einzeln abschalten. Zum Stromverbrauch im aktiven oder Idle Mode kommt dann noch etwas dazu. Die Daten sind für 3 V und 4 MHz, und in etwa proportional zum Takt:

IO-Module Mega 48/88/168 Mega88PA
USART 51 µA 21 µA
TWI 75 µA 46 µA
Timer0 24 µA 10 µA
Timer1 32 µA 25 µA
Timer2 72 µA 35 µA
SPI 95 µA 40 µA
ADC 75 µA 50 µA
Summe 424 µA 227 µA

Wenn alles eingeschaltet ist, sind das ca. 20% bzw. 100% des Stromes im aktiven bzw. Idle Mode. Beim Mega8 lassen sich diese Teile nicht seperat abschalten und der Strom ist schon oben enthalten.


Beim Stromverbrauch des ADCs ist das Datenblatt nicht so ganz eindeutig. Man hat einen taktunabhängigen Teil und einen der vom Takt abhängt. Eine Unterscheidung nach dem ADC Takt oder ob gerade ein Wandlung stattfindet ist noch nicht gemacht.

Die analogen Teilschaltungen haben einen vom Takt unabhängigen Teil des Stromverbrauchs:

Mega88 Mega8L Mega88PA
Bandgap Ref. 10 µA 10 µA 10 µA
Brownout incl. Bandgap. 23 µA 15 µA 20 µA
AComperator 80 µA 60 µA 55 µA
ADC 300 µA 250 µA 170 µA

siehe auch

Interrupt