6. “Low-Power” Programmierung

6.1. Skala der Leistungsaufnahme

_images/power_scale.svg.png
  • 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 und lpsleep ü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

_images/pwrdoml476.png

Fig. 6.5.1 Die “Power-Domains” des STM32L476 (entnommen aus [RM0351R6], Kap. 5)

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 den sleep 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\). Im stop2 Modus werden etwa 1 \({\mu}A\) Stromaufnahme erreicht. Der LPUART funktioniert noch. Aus dem stop Modus kommt man in etwa 5 \({\mu}s\) wieder in den run 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 des standby 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

Die 11 low-power Betriebsarten des STM32L4

Fig. 6.6.1 Die 11 low-power Betriebsarten des STM32L4 (aus [NOVIELLO], Kap. 19)

Beispielanwendung als Zustandsdiagramm der Stromsparzustände

Fig. 6.6.2 Beispielanwendung als Zustandsdiagramm der Stromsparzustände (aus AN4365: Using STM32F4 MCU power modes with best dynamic efficiency).

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 und stop. Die beiden standby und shutdown sind nicht möglich.

  • “tick-less” idle mode

    https://www.freertos.org/low-power-tickless-rtos.html

    Beispielcode, der zeigt, wie man die sleep und stop 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

_images/solar-reader.jpg

Fig. 6.9.1 Ein mit Solarenergie betriebenes Lesegerät (aus Unterlagen von Arrow und Sharp).

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.

_images/dm3086.jpg

Fig. 6.10.1 Rigol DM3086 Multimeter.

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:

_images/current-shunt-monitor.jpg

Fig. 6.10.2 Schaltplan zum Messen der Stromstärke mit dem Oszilloskop. Der Shunt-Widerstand hat 17,22 Ohm, der Lastwiderstand \(R_L\) hat 5615 Ohm. Die Ausgangsspannund \(V_{OUT}\) des INA139 berechnet sich wie folgt: \(V_{OUT} = I_S \cdot R_S \cdot R_L / 1000 Ohm\). Der Masse-Anschluss des Oszilloskops muss mit der Masse der Schaltung verbunden werden.

Datenblatt zum Current Shunt Monitor INA139:

Der Aufbau sah so aus:

_images/ina139_aufbau.jpg

Fig. 6.10.3 Aufbau der Strommessung mit INA139. Die vier roten LEDs stammen noch von den FreeRTOS-Versuchen, sie haben hier keine Bedeutung.

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.

_images/tek0001.png

Fig. 6.10.4 Spannung \(V_{OUT}\) am Ausgang des INA139. Achtung: Die rote Linie zeigt den eingestellten Massepegel.

Literatur

[AN4621]

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.