EN

nRF52 Energieverwaltung

nRF52 Energieverwaltung

Überblick

Das nRF52-Energieverwaltungsmodul stellt Batterieschutzfunktionen bereit, die eine Tiefentladung verhindern, die Wahrscheinlichkeit von Brownouts (Spannungseinbrüchen) und Flash-Korruption minimieren und eine sichere spannungsbasierte Wiederherstellung ermöglichen.

Funktionen

Boot-Spannungsschutz

  • Prüft die Batteriespannung unmittelbar nach dem Hochfahren und bevor Mesh-Operationen starten.
  • Liegt die Spannung unter einem konfigurierbaren Schwellenwert (z. B. 3300 mV), konfiguriert das Gerät die Spannungsaufwach-Funktion (LPCOMP + VBUS) und geht in einen schützenden Abschaltzustand (SYSTEMOFF) über.
  • Verhindert Boot-Schleifen bei kritisch niedrigem Akkustand.
  • Wird übersprungen, wenn externe Stromversorgung (USB VBUS) erkannt wird.

Spannungs-Aufwachfunktion (LPCOMP + VBUS)

  • Konfiguriert den Low Power Comparator (LPCOMP, Niedrigstrom-Komparator) des nRF52 vor dem Eintritt in SYSTEMOFF.
  • Aktiviert die USB-VBUS-Erkennung, damit externe Stromversorgung das Gerät aufwecken kann.
  • Das Gerät wacht automatisch auf, wenn die Batteriespannung über den Wiederherstellungs-Schwellenwert steigt oder wenn VBUS erkannt wird.

Frühzeitige Boot-Registererfassung

  • Erfasst die Register RESETREAS (Reset-Ursache) und GPREGRET2 (Shutdown-Ursache), bevor SystemInit() diese löscht.
  • Ermöglicht der Firmware festzustellen, warum das Gerät gestartet wurde (Kaltstart, Watchdog, LPCOMP-Aufwachen usw.).
  • Ermöglicht der Firmware festzustellen, warum es zuletzt heruntergefahren wurde (Benutzeranforderung, Niederspannung, Boot-Schutz).

Shutdown-Ursachen-Tracking

Shutdown-Ursachencodes (gespeichert in GPREGRET2):

CodeNameBeschreibung
0x00NONENormaler Boot / kein vorheriges Herunterfahren
0x4CLOW_VOLTAGELaufzeit-Niederspannungsschwelle erreicht
0x55USERBenutzer hat powerOff() ausgelöst
0x42BOOT_PROTECTBoot-Spannungsschutz hat ausgelöst

Unterstützte Boards

BoardImplementiertLPCOMP-AufwachenVBUS-Aufwachen
Seeed Studio XIAO nRF52840 (xiao_nrf52)JaJaJa
RAK4631 (rak4631)JaJaJa
Heltec T114 (heltec_t114)JaJaJa
GAT562 Mesh Watch13JaJaJa
Promicro nRF52840NeinNeinNein
RAK WisMesh TagNeinNeinNein
Heltec Mesh SolarNeinNeinNein
LilyGo T-Echo / T-Echo LiteNeinNeinNein
SenseCAP SolarJaJaJa
WIO Tracker L1 / L1 E-InkNeinNeinNein
WIO WM1110NeinNeinNein
Mesh PocketNeinNeinNein
Nano G2 UltraNeinNeinNein
ThinkNode M1/M3/M6NeinNeinNein
T1000-ENeinNeinNein
Ikoka Nano/Stick/Handheld (nRF)NeinNeinNein
Keepteen LT1NeinNeinNein
Minewsemi ME25LS01NeinNeinNein

Hinweise:

  • „Implementiert" bezieht sich auf Phase 1 (Boot-Sperre + Shutdown-Ursachen-Erfassung).
  • Beim benutzerinitiiertem Ausschalten des Heltec T114 wird LPCOMP-Aufwachen nicht aktiviert.
  • Die VBUS-Erkennung wird verwendet, um die Boot-Sperre bei externer Stromversorgung zu überspringen. VBUS-Aufwachen wird zusammen mit LPCOMP konfiguriert, wenn die Hardware VBUS an den nRF52 weiterleitet.

Technische Details

Architektur

Die Energieverwaltungsfunktionalität ist in die Basisklasse NRF52Board in src/helpers/NRF52Board.cpp integriert. Board-Varianten liefern hardwarespezifische Konfiguration über eine PowerMgtConfig-Struktur und überschreiben initiateShutdown(uint8_t reason), um boardspezifische Abschaltarbeiten durchzuführen und bedingt die Spannungs-Aufwachfunktion (LPCOMP + VBUS) zu aktivieren.

Frühzeitige Boot-Erfassung

Ein statischer Konstruktor mit Priorität 101 in NRF52Board.cpp erfasst die Register RESETREAS und GPREGRET2, bevor:

  • SystemInit() (Priorität 102) – welche RESETREAS löscht
  • Statische C++-Konstruktoren (Standard-Priorität 65535)
ausgeführt werden. Dadurch wird sichergestellt, dass die tatsächliche Reset-Ursache erfasst wird, bevor irgendein Initialisierungscode läuft.

Board-Implementierung

Um die Energieverwaltung für eine Board-Variante zu aktivieren:

  1. In platformio.ini aktivieren:
CLI
-D NRF52_POWER_MANAGEMENT
  1. Konfiguration in variant.h definieren:
CLI
#define PWRMGT_VOLTAGE_BOOTLOCK    3300   // Won't boot below this voltage (mV)
   #define PWRMGT_LPCOMP_AIN          7      // AIN channel for voltage sensing
   #define PWRMGT_LPCOMP_REFSEL       2      // REFSEL (0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16)
  1. Im Board-.cpp-File implementieren:
CLI
#ifdef NRF52_POWER_MANAGEMENT
   const PowerMgtConfig power_config = {
     .lpcomp_ain_channel = PWRMGT_LPCOMP_AIN,
     .lpcomp_refsel = PWRMGT_LPCOMP_REFSEL,
     .voltage_bootlock = PWRMGT_VOLTAGE_BOOTLOCK
   };

   void MyBoard::initiateShutdown(uint8_t reason) {
     // Board-specific shutdown preparation (e.g., disable peripherals)
     bool enable_lpcomp = (reason == SHUTDOWN_REASON_LOW_VOLTAGE ||
                           reason == SHUTDOWN_REASON_BOOT_PROTECT);

     if (enable_lpcomp) {
       configureVoltageWake(power_config.lpcomp_ain_channel, power_config.lpcomp_refsel);
     }

     enterSystemOff(reason);
   }
   #endif

   void MyBoard::begin() {
     NRF52Board::begin();  // or NRF52BoardDCDC::begin()
     // ... board setup ...

   #ifdef NRF52_POWER_MANAGEMENT
     checkBootVoltage(&power_config);
   #endif
   }

Für benutzerinitiiertes Herunterfahren bleibt powerOff() boardspezifisch. Die Energieverwaltung aktiviert LPCOMP nur bei automatisierten Abschaltgründen (Boot-Schutz/Niederspannung).

  1. Override im Board-.h-File deklarieren:
CLI
#ifdef NRF52_POWER_MANAGEMENT
     void initiateShutdown(uint8_t reason) override;
   #endif

Konfiguration der Spannungs-Aufwachfunktion

Der LPCOMP (Low Power Comparator, Niedrigstrom-Komparator) wird folgendermaßen konfiguriert:

  • Überwacht den angegebenen AIN-Kanal (0–7, entsprechend P0.02–P0.05, P0.28–P0.31)
  • Vergleicht gegen eine VDD-Bruchteils-Referenz (REFSEL: 0–6 = 1/8..7/8, 7 = ARef, 8–15 = 1/16..15/16)
  • Erkennt UP-Ereignisse (Spannung steigt über den Schwellenwert)
  • Verwendet 50 mV Hysterese für Störfestigkeit
  • Weckt das Gerät aus SYSTEMOFF, wenn ausgelöst
VBUS-Aufwachen wird über das POWER-Peripheral-USBDETECTED-Event aktiviert, wann immer configureVoltageWake() verwendet wird. Dafür muss USB VBUS an den nRF52 geführt sein (typisch bei nRF52840-Boards mit nativem USB).

LPCOMP-Referenzauswahl (PWRMGT_LPCOMP_REFSEL):
REFSELBruchteilVBAT bei 1M/1M-Teiler (VDD=3,0–3,3)VBAT bei 1,5M/1M-Teiler (VDD=3,0–3,3)
01/80,75–0,82 V0,94–1,03 V
12/81,50–1,65 V1,88–2,06 V
23/82,25–2,47 V2,81–3,09 V
34/83,00–3,30 V3,75–4,12 V
45/83,75–4,12 V4,69–5,16 V
56/84,50–4,95 V5,62–6,19 V
67/85,25–5,77 V6,56–7,22 V
7ARef--
81/160,38–0,41 V0,47–0,52 V
93/161,12–1,24 V1,41–1,55 V
105/161,88–2,06 V2,34–2,58 V
117/162,62–2,89 V3,28–3,61 V
129/163,38–3,71 V4,22–4,64 V
1311/164,12–4,54 V5,16–5,67 V
1413/164,88–5,36 V6,09–6,70 V
1515/165,62–6,19 V7,03–7,73 V
Wichtig: Bei Boards mit Spannungsteiler am Batterie-Messpin misst LPCOMP die geteilte Spannung. Die Berechnung lautet: VBAT_threshold ≈ (VDD * fraction) * divider_scale, wobei divider_scale = (Rtop + Rbottom) / Rbottom (z. B. 2,0 für 1M/1M, 2,5 für 1,5M/1M, 3,0 für XIAO).

SoftDevice-Kompatibilität

Der Energieverwaltungscode prüft, ob das SoftDevice (der BLE-Protokollstack von Nordic) aktiv ist, und verwendet die entsprechende API:

  • Wenn SD aktiv: sd_power_*-Funktionen
  • Wenn SD inaktiv: Direkter Registerzugriff (NRF_POWER->*)
Dadurch ist die Kompatibilität unabhängig vom BLE-Stack-Zustand gewährleistet.

CLI-Befehle

Der Status der Energieverwaltung kann über die CLI (Kommandozeile) abgefragt werden:

BefehlBeschreibung
get pwrmgt.supportGibt „supported" oder „unsupported" zurück
get pwrmgt.sourceGibt die aktuelle Stromquelle zurück – „battery" oder „external" (5V/USB-Versorgung)
get pwrmgt.bootreasonGibt Reset- und Shutdown-Ursache als Zeichenketten zurück
get pwrmgt.bootmvGibt die Boot-Spannung in Millivolt zurück

Auf Boards ohne aktivierte Energieverwaltung geben alle Befehle außer get pwrmgt.support folgende Meldung zurück:

CLI
ERROR: Power management not supported

Debug-Ausgabe

Wenn MESH_DEBUG=1 aktiviert ist, gibt das Energieverwaltungsmodul folgende Informationen aus:

CLI
DEBUG: PWRMGT: Reset = Wake from LPCOMP (0x20000); Shutdown = Low Voltage (0x4C)
DEBUG: PWRMGT: Boot voltage = 3450 mV (threshold = 3300 mV)
DEBUG: PWRMGT: LPCOMP wake configured (AIN7, ref=3/8 VDD)

Phase 2 (geplant)

  • Laufzeit-Spannungsüberwachung
  • Spannungs-Zustandsmaschine (Normal → Warnung → Kritisch → Abschaltung)
  • Konfigurierbare Schwellenwerte
  • Load-Shedding-Callbacks (Rückrufe zur Lastreduktion) zur Energieeinsparung
  • Deep-Sleep-Integration (Tiefschlaf)
  • Geplantes Aufwachen
  • Erweiterter Schlafmodus mit periodischer Überwachung

Referenzen

Quelle: docs.meshcore.io