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 das 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 kurze Pause in der weniger Strom verbaucht wird als im normalen Betrieb. 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.
Inhaltsverzeichnis
Variabler Takt
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. Besser ist es aber in der Regel den Controller zum warten in einen Stromsparmodus zu schicken, denn so kann man sparsam warten und trotzdem schnell rechnen wenn nötig.
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.
1) Idel : 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%.
2) Powerdown: Fast alle Takte sind ausgeschaltet. Entsprechend gehen keine Timer, USART usw. DieMö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 Quarzlaufen zu lassen, um eine durchlaufen de genaue Zeit 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 Idel Mode, ist dabei mehr ein Nebeneffekt.
Wenn man im Stromsparmode auf ein Ereigniss wartet, kann man natürlich auch nicht den Watchdg zurücksetzen. Hier muß man dann eventuell ohne arbeiten, wenn kein Zeitgesteuerter Interrupt auftritt.
Der Watchdog kann auch als langsamer Timer benutzt werden, um den µC gelegentlich (z.B. etwa jede Sekunde) aufzuwecken, um Hardware abzufragen. 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 Idel 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 Im Power save mode geht noch ein Interrupts von Timer 2, der in diesem Mode ja gerade weiter laufen kann.
Softwarebeispiele
Im Assembler gibt es den Befehl Sleep, um in den im Registe SMCR eingestellten Sparmodus zu wechseln.
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 AD Eingängen kann man den Digitalen Eingang abschalten. Dies hilf auch gegen den zusätzlichen Stromverbrauch durch eine mittleren Spannungswert.
Taktquelle
Auch die Takterzeugung braucht Strom. 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. Beim Mega48 u.Ä. läuft der interne RC Talt mit 8 MHz und braucht daher relativ viel Strom. Die Sparsamste Taktquelle ist in der Regel ein 32 kHz Uhrenquarz oder der Watchdog timer.
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. Beim AD Wandler und der internen Referenz dauert es nach dem Einschalten aber etwas, bis gute Ergebnisse erziehlt werden. Wie viel Strom die einzelnen Module brauchen hängt von der Controllerversion, der Spannung und dem Takt ab.
Daten zum Stromverbrauch
Die Beispieldaten sind für 3 V aus dem Datenblatt. Die Werte für den Mega16/Mega32 sind ähnlich (etwa 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 |
idel 4 MHz (Q) | 360 µA | 1 mA | 260 µA |
idel 1 MHz (RC) | 160 µA | 300 µA | 140 µA |
idel 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 Idel 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 |
Wenn alles eingeschaltet ist sind das ca. 20 % bzw. 100 % des Stromes im aktiven bzw. Idel Modes. 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.
Vom Takt unabhängiger Teil des Stromverbrauchs:
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 |