6. “Low-Power” Programmierung¶
6.1. Skala der Leistungsaufnahme¶
MCU = Microcontroller Unit
ULP = Ultra low-power
LP = low-power
Die “normale” MCU-Programmierung im aktiven Modus ohne Berücksichtigung von Stromsparbetriebsarten liegt im grünen Bereich.
6.2. Ein paar physikalische Zusammenhänge¶
Ohm'sches Gesetz: U = I * R (Einheiten: V(olt), A(mpere), Ohm) Leistung: P = U * I (Einheit: W(att)) Energie: W = P * t (Einheit: W*s oder J(oule)) Eine mechanische Definition für ein Joule ist 1 kg * m/(s^2) * m. Wenn man 102 Gramm einen Meter hoch hebt, dann wird dafür 1 Joule Energie benötigt. Es gibt noch weitere Veranschaulichungen: https://de.wikipedia.org/wiki/Joule Akku-Kapazität (Ladung Q): Energie [V*A*s] / Spannung [V] = [A*s] Beispiel: CR2032 Li-Ionen Zelle (3V, 235 mA*h), ca. 0.7 Wh Energiegehalt, das entspricht ca. 2540 Joule. Wenn man alle Tricks nutzt, dann kann ein moderner Mikrocontroller mit Stromsparbetriebsarten bis zu 10 Jahren aus einer CR2032 Batterie versorgt werden.
6.3. CMOS Schaltungen¶
P_total = P_switching + P_shortcircuit + P_static + P_leakage
P_switching = Kapazitäten auf- bzw. umladen
P_shortcircuit = Kurzzeitiges Leiten beider CMOS (P-MOS, N-MOS)
Transistoren eines Ausgang.
P_static = Statische Stromaufnahme (bei CMOS ohne Bedeutung, wird durch
andere Schaltungsstrukturen eingeführt)
P_leakage = Leckstrom der Transistoren (nimmt mit kleineren Strukturen
zu; nimmt exponentiell mit der Temperatur zu)
P_switching = c * V^2 * f
P_shortcircuit = I_mean * V
Dynamic power consumption:
P_switching, P_shortcircuit
Static power consumption:
P_static, P_leakage
6.4. Stromsparmöglichkeiten¶
Taktfrequenz reduzieren (Leistungsaufnahme geht linear mit Frequenz). Siehe \({\mu}W\)/MHz bzw. mW/MHz Angaben.
Spannung reduzieren (Leistungsaufnahme geht quadratisch mit der Spannung)
DMA verwenden, so dass CPU schlafen kann.
Dynamic Voltage Scaling (DVS): Der CPU Kern wird über einen internen Spannungsregler versorgt, der 1.2 - 1.8 Volt erzeugen kann. Wenn eine geringere Taktfrequenz ausreicht, kann die Spannung reduziert werden. Der Bereich wird in der folgenden Abbildung V_core domain genannt. Er umfasst CPU Kern, SRAM, Flash-Speicher und digitale Peripherie.
Der STM32L Controller hat zusätzlich noch einen low-power Spannungsregler, der die Versorgung in den low-power Zuständen
lprun
undlpsleep
übernimmt. Er hat einen höheren Wirkungsgrad als der andere Spannungsregler. Die Taktfrequenz darf in den “lp” Zuständen höchstens 2 MHz sein.Clocks selektiv abschalten. Jede nicht getaktete Peripherieeinheit spart Strom (“clock gating”).
Clocks komplett abschalten (HSI, HSE, PLL)
Stromversorgung selektiv abschalten (“power gating”).
Den internen Spannungsregler abschalten, d.h. Core, SRAM und Flash sind ohne Spannung.
Code im SRAM ablegen braucht weniger Strom, als im Flash ablegen. Die Zugriffe auf den Flash-Speicher reduzieren (“ART accelerator”).
Das Reaktivieren aus dem Schlafmodus kostet um so mehr Strom, je mehr Gatter eingeschaltet werden müssen (Stromspitzen). Man kann schnell oder langsam aufwachen. Langsames Aufwachen dämpft die Stromspitzen.
6.5. Power Domains¶
6.6. Stromspar-Betriebsarten¶
Der Cortex M Core kennt nur drei Betriebsarten. Die STM32 Controller spalten diese Betriebsarten in weitere Zustände auf:
Cortex-M STM32F STM32L ------------------------------------------- run run run 1 (20-80 MHz) run 2 (0-25 MHz) lprun sleep sleep sleep lpsleep deep sleep stop stop0 standby stop1 stop2 standby shutdown
Der
sleep
Modus schaltet den CPU Takt aus. Der Spannungsregler des CPU Kerns (VREG) bleibt angeschaltet. Zum Aufwecken kann jeder Interrupt verwendet werden, die gesamte Peripherie bleibt aktiv. Die Leistungsaufnahme wird immer noch von HCLK bestimmt. Man kann densleep
Modus nutzen, wenn man einen DMA Transfer startet und dann die CPU in dieser Zeit schlafen legt.Der
lpsleep
Modus beim STM32L4 soll bei einer Taktfrequenz von 100 kHz und abgeschaltetem Flash-Speicher nur etwa 18 \({\mu}A\) Strom aufnehmen (laut [AN4621]).Im
stop
Modus wird der schnelle Takt (HSI, HSE, PLL) abgeschaltet, der langsame Takt läuft noch (peripheral clock gating). Das SRAM und die Peripherieregister behalten die Daten.Beim Aufwachen muss die Takteinstellung neu konfiguriert werden. Der
stop0
Modus liegt bei 100 \({\mu}A\),stop1
bei 4 \({\mu}A\). Imstop2
Modus werden etwa 1 \({\mu}A\) Stromaufnahme erreicht. Der LPUART funktioniert noch. Aus demstop
Modus kommt man in etwa 5 \({\mu}s\) wieder in denrun
Modus.Im
standby
Modus wird der VREG abgeschaltet. SRAM und Registerinhalte gehen verloren. Zum Aufwecken kann man noch einen von fünf Wakeup-Pins verwenden, sowie den Reset Pin oder den IWDG (independent watchdog). Der RTC funktioniert auch noch und kann zum Unterbrechen desstandby
Modus verwendet werden. In diesem Modus sollte die Stromaufnahme auf unter 1 \({\mu}A\) heruntergehen.Beim
shutdown
Modus wird auch das power monitoring (Brown-Out Reset) und die automatische Umschaltung auf VBAT abgeschaltet. Hier sollte die Stromaufnahme bei ein paar zehn nA sein.
Die Stromsparbetriebsarten des STM32L4
6.7. FreeRTOS und Stromsparen¶
Die “idle” Task kann den Prozessor in eine stromsparende Betriebsart versetzen. Das ist meist der “sleep” Modus. Mit “hooks” kann man benutzerdefinierte Funktionen von der Idle-Task aufrufen.
Es können in FreeRTOS nur Stromsparbetriebsarten verwendet werden, die das SRAM erhalten, das sind
run
,sleep
undstop
. Die beidenstandby
undshutdown
sind nicht möglich.“tick-less” idle mode
https://www.freertos.org/low-power-tickless-rtos.html
Beispielcode, der zeigt, wie man die
sleep
undstop
Betriebsarten in FreeRTOS verwenden kann:FreeRTOS/Demo/CORTEX_STM32L152_Discovery_IAR/
Demo für gewöhnlichen
sleep
Modus in FreeRTOS/opt/rtlab/share/stm32cubel4/src/Projects/STM32L476G-EVAL/Applications/FreeRTOS/FreeRTOS_LowPower
6.8. Beispielprogramme für das Nucleo L476 Board¶
In CUBE_HOME
unter src/Projects/NUCLEO-L476RG/Examples/PWR/
gibt es viele Beispielprogramme (ohne FreeRTOS):
PWR_LPRUN PWR_ModesSelection PWR_STANDBY PWR_STOP1_RTC
PWR_LPRUN_SRAM1 PWR_SHUTDOWN PWR_STANDBY_RTC PWR_STOP2
PWR_LPSLEEP PWR_SLEEP PWR_STOP1 PWR_STOP2_RTC
6.9. Solarbetriebenes Lesegerät¶
6.10. Praktische Strommessung¶
Auf den STM32 Nucleo Boards gibt es die “IDD” Steckbrücke, der in der Stromzuführung des STM32 liegt. Damit das Board funktioniert, muss die Steckbrücke eingesetzt sein. Wenn man sie entfernt, kann man den Versorgungsstrom des STM32 messen. Dazu verbindet man einfach ein Strommessgerät (“Amperemeter”) mit den zwei freien Pins, nachdem die Steckbrücke entfernt wurde.
Die meisten preiswerten Multimeter in der 100 Euro Region haben mehrere Strommessbereiche. Zum Beispiel hat das PeakTech 4390 Multimeter einen Milliampere-Messbereich mit zwei Nachkommastellen, die kleinste Ziffer löst also 10 Mikroampere auf. Ausserdem gibt es einen Mikroampere-Messbereich mit einer Auflösung von ein Mikroampere. Bei preiswerten Messgeräten ist in der Regel hier Schluss.
Teurere Messgeräte ab ca. 500 Euro bieten meist auch einen Messbereich kleiner als Mikroampere. Zum Beispiel hat beim Rigol DM3068 die kleinste Ziffer im Strommessbereich eine Auflösung von 10 nA.
Variante: Messen der Stromstärke mit dem Oszilloskop
Direkt geht das nicht, da das Oszilloskop nur Spannungen messen kann. Man muss daher zunächst den Stromfluss in eine Spannung umwandeln. Eine Spannungsdifferenz entsteht immer dann, wenn Strom durch einen Widerstand fliesst. Meist wird ein kleiner Widerstand (klein, damit er das Messobjekt - den STM32 - nicht stört) an die positive Versorgungsspannung geschaltet (engl. high-side current shunt). Da das Oszilloskop in der Regel nur gegen Masse messen kann (der negative Eingang ist geerdet), kann es nicht direkt zur Messung das Spannungsabfalls an dem Widerstand verwendet werden. Die Spannungsdifferenz über dem Widerstand muss erst in eine Spannung gegen Masse umgewandelt werden. Dazu gibt es spezielle integrierte Schaltungen, zum Beispiel den INA139 von Texas Instrument, den man im folgenden Schaltplan sieht:
Datenblatt zum Current Shunt Monitor INA139:
Der Aufbau sah so aus:
Die folgende Abbildung zeigt eine Messung mit dem Oszilloskop TDS 1002B von Tektronix. Auf dem Nucleo-Board lief das “starter” Beispiel, bei dem die grüne LED blinkt.
Literatur
STM32L4 and STM32L4+ ultra-low-power features overview, Rev. 4, March 2018.
https://hhoegl.informatik.hs-augsburg.de/es2/stm32l4/Manuals/en.DM00148033.pdf
[NOVIELLO], Kap. 19 (Power Management), S. 511-542
Das Kapitel bietet eine gute Übersicht zum Power Management bei STM32F und STM32L Mikrocontrollern. Es wird auch beschrieben, mit welchen HAL Funktionen aus der Cube Bibliothek man in die verschiedenen Stromsparzustände kommt. Ausserdem findet man hier Beispielprogramme.
[YIUDG] Kap. 9 (Low Power and System Control Features), S. 290 - 325.
- [WHITE] Making Embedded Systems, Kapitel 10 (Reducing Power
Consumption), S. 285-298, O’Reilly 2011.
https://learning.oreilly.com/library/view/making-embedded-systems/9781449308889
[KEIL] Designing energy efficient systems with Cortex-M Microcontrollers, 2009.