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):
| Code | Name | Beschreibung |
|---|---|---|
| 0x00 | NONE | Normaler Boot / kein vorheriges Herunterfahren |
| 0x4C | LOW_VOLTAGE | Laufzeit-Niederspannungsschwelle erreicht |
| 0x55 | USER | Benutzer hat powerOff() ausgelöst |
| 0x42 | BOOT_PROTECT | Boot-Spannungsschutz hat ausgelöst |
Unterstützte Boards
| Board | Implementiert | LPCOMP-Aufwachen | VBUS-Aufwachen |
|---|---|---|---|
Seeed Studio XIAO nRF52840 (xiao_nrf52) | Ja | Ja | Ja |
RAK4631 (rak4631) | Ja | Ja | Ja |
Heltec T114 (heltec_t114) | Ja | Ja | Ja |
| GAT562 Mesh Watch13 | Ja | Ja | Ja |
| Promicro nRF52840 | Nein | Nein | Nein |
| RAK WisMesh Tag | Nein | Nein | Nein |
| Heltec Mesh Solar | Nein | Nein | Nein |
| LilyGo T-Echo / T-Echo Lite | Nein | Nein | Nein |
| SenseCAP Solar | Ja | Ja | Ja |
| WIO Tracker L1 / L1 E-Ink | Nein | Nein | Nein |
| WIO WM1110 | Nein | Nein | Nein |
| Mesh Pocket | Nein | Nein | Nein |
| Nano G2 Ultra | Nein | Nein | Nein |
| ThinkNode M1/M3/M6 | Nein | Nein | Nein |
| T1000-E | Nein | Nein | Nein |
| Ikoka Nano/Stick/Handheld (nRF) | Nein | Nein | Nein |
| Keepteen LT1 | Nein | Nein | Nein |
| Minewsemi ME25LS01 | Nein | Nein | Nein |
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)
Board-Implementierung
Um die Energieverwaltung für eine Board-Variante zu aktivieren:
- In platformio.ini aktivieren:
- Konfiguration in variant.h definieren:
- Im Board-.cpp-File implementieren:
Für benutzerinitiiertes Herunterfahren bleibt powerOff() boardspezifisch. Die Energieverwaltung aktiviert LPCOMP nur bei automatisierten Abschaltgründen (Boot-Schutz/Niederspannung).
- Override im Board-.h-File deklarieren:
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
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):
| REFSEL | Bruchteil | VBAT bei 1M/1M-Teiler (VDD=3,0–3,3) | VBAT bei 1,5M/1M-Teiler (VDD=3,0–3,3) |
|---|---|---|---|
| 0 | 1/8 | 0,75–0,82 V | 0,94–1,03 V |
| 1 | 2/8 | 1,50–1,65 V | 1,88–2,06 V |
| 2 | 3/8 | 2,25–2,47 V | 2,81–3,09 V |
| 3 | 4/8 | 3,00–3,30 V | 3,75–4,12 V |
| 4 | 5/8 | 3,75–4,12 V | 4,69–5,16 V |
| 5 | 6/8 | 4,50–4,95 V | 5,62–6,19 V |
| 6 | 7/8 | 5,25–5,77 V | 6,56–7,22 V |
| 7 | ARef | - | - |
| 8 | 1/16 | 0,38–0,41 V | 0,47–0,52 V |
| 9 | 3/16 | 1,12–1,24 V | 1,41–1,55 V |
| 10 | 5/16 | 1,88–2,06 V | 2,34–2,58 V |
| 11 | 7/16 | 2,62–2,89 V | 3,28–3,61 V |
| 12 | 9/16 | 3,38–3,71 V | 4,22–4,64 V |
| 13 | 11/16 | 4,12–4,54 V | 5,16–5,67 V |
| 14 | 13/16 | 4,88–5,36 V | 6,09–6,70 V |
| 15 | 15/16 | 5,62–6,19 V | 7,03–7,73 V |
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->*)
CLI-Befehle
Der Status der Energieverwaltung kann über die CLI (Kommandozeile) abgefragt werden:
| Befehl | Beschreibung |
|---|---|
get pwrmgt.support | Gibt „supported" oder „unsupported" zurück |
get pwrmgt.source | Gibt die aktuelle Stromquelle zurück – „battery" oder „external" (5V/USB-Versorgung) |
get pwrmgt.bootreason | Gibt Reset- und Shutdown-Ursache als Zeichenketten zurück |
get pwrmgt.bootmv | Gibt die Boot-Spannung in Millivolt zurück |
Auf Boards ohne aktivierte Energieverwaltung geben alle Befehle außer get pwrmgt.support folgende Meldung zurück:
Debug-Ausgabe
Wenn MESH_DEBUG=1 aktiviert ist, gibt das Energieverwaltungsmodul folgende Informationen aus:
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