nRF52 Energieverwaltung
nRF52 Energieverwaltung
Übersicht
Das nRF52 Energieverwaltungsmodul bietet Funktionen zum Schutz der Batterie, um Tiefentladung zu verhindern, die Wahrscheinlichkeit von Brownout- und Flash-Korruptionszuständen zu minimieren und eine sichere spannungsbasierte Wiederherstellung zu ermöglichen.
Funktionen
Startspannungs-Schutz (Boot Voltage Protection)
- Überprüft die Batteriespannung unmittelbar nach dem Start und bevor Mesh-Operationen beginnen.
- Liegt die Spannung unter einem konfigurierbaren Schwellenwert (z.B. 3300mV), konfiguriert das Gerät das Aufwachen bei Spannungsschwankungen (LPCOMP + VBUS) und geht in einen schützenden Abschaltzustand (SYSTEMOFF).
- Verhindert Neustart-Schleifen, wenn die Batterie kritisch schwach ist.
- Wird übersprungen, wenn externe Stromversorgung (USB VBUS) erkannt wird.
Spannungs-Aufwecken (LPCOMP + VBUS)
- Konfiguriert den Low Power Comparator (LPCOMP) des nRF52, bevor das Gerät in den SYSTEMOFF-Modus wechselt.
- Ermöglicht die Erkennung von USB VBUS, sodass externe Stromversorgung das Gerät aufwecken kann.
- Das Gerät wacht automatisch auf, wenn die Batteriespannung über den Wiederherstellungsschwellenwert steigt oder wenn VBUS erkannt wird.
Frühe Startregister-Erfassung (Early Boot Register Capture)
- Erfasst RESETREAS (Grund für den Reset) und GPREGRET2 (Grund für das Herunterfahren), bevor SystemInit() diese löscht.
- Ermöglicht der Firmware zu bestimmen, warum sie gestartet wurde (Kaltstart, Watchdog, LPCOMP-Aufwecken usw.).
- Ermöglicht der Firmware zu bestimmen, warum sie zuletzt heruntergefahren wurde (Benutzeranfrage, niedrige Spannung, Startschutz).
Verfolgung des Abschaltgrundes (Shutdown Reason Tracking)
Codes für den Abschaltgrund (gespeichert in GPREGRET2):| Code | Name | Description |
|---|---|---|
| 0x00 | NONE | Normaler Start / kein vorheriges Herunterfahren |
| 0x4C | LOW_VOLTAGE | Schwellenwert für niedrige Spannung während des Betriebs erreicht |
| 0x55 | USER | Benutzer hat powerOff() angefordert |
| 0x42 | BOOT_PROTECT | Startspannungs-Schutz wurde ausgelöst |
Unterstützte Boards
| Board | Implemented | LPCOMP wake | VBUS wake |
|---|---|---|---|
Seeed Studio XIAO nRF52840 (xiao_nrf52) | Yes | Yes | Yes |
RAK4631 (rak4631) | Yes | Yes | Yes |
Heltec T114 (heltec_t114) | Yes | Yes | Yes |
| GAT562 Mesh Watch13 | Yes | Yes | Yes |
| Promicro nRF52840 | No | No | No |
| RAK WisMesh Tag | No | No | No |
| Heltec Mesh Solar | No | No | No |
| LilyGo T-Echo / T-Echo Lite | No | No | No |
| SenseCAP Solar | Yes | Yes | Yes |
| WIO Tracker L1 / L1 E-Ink | No | No | No |
| WIO WM1110 | No | No | No |
| Mesh Pocket | No | No | No |
| Nano G2 Ultra | No | No | No |
| ThinkNode M1/M3/M6 | No | No | No |
| T1000-E | No | No | No |
| Ikoka Nano/Stick/Handheld (nRF) | No | No | No |
| Keepteen LT1 | No | No | No |
| Minewsemi ME25LS01 | No | No | No |
Hinweise:
- "Implemented" (Implementiert) bezieht sich auf Phase 1 (Start-Sperre + Erfassung des Abschaltgrundes).
- Das benutzergesteuerte Ausschalten beim Heltec T114 aktiviert kein LPCOMP-Aufwecken.
- Die VBUS-Erkennung wird verwendet, um die Start-Sperre bei externer Stromversorgung zu überspringen, und VBUS-Aufwecken wird zusammen mit LPCOMP konfiguriert, wenn die unterstützte Hardware VBUS dem nRF52 zur Verfügung stellt.
Technische Details
Architektur
Die Energieverwaltungsfunktionalität ist in die Basisklasse NRF52Board in src/helpers/NRF52Board.cpp integriert. Board-Varianten stellen hardware-spezifische Konfigurationen über eine PowerMgtConfig-Struktur bereit und überschreiben initiateShutdown(uint8_t reason), um board-spezifische Abschaltarbeiten durchzuführen und bedingt das Spannungs-Aufwecken (LPCOMP + VBUS) zu aktivieren.
Frühe Start-Erfassung (Early Boot Capture)
Ein statischer Konstruktor mit Priorität 101 in NRF52Board.cpp erfasst die Register RESETREAS und GPREGRET2 bevor:
- SystemInit() (Priorität 102) – das RESETREAS löscht
- Statische C++-Konstruktoren (Standardpriorität 65535)
Board-Implementierung
Um die Energieverwaltung auf einer Board-Variante zu aktivieren:
- In
platformio.iniaktivieren:
- Konfiguration in
variant.hdefinieren:
- In der Board
.cpp-Datei implementieren:
Für benutzerinitiierte Abschaltungen bleibt powerOff() board-spezifisch. Die Energieverwaltung aktiviert LPCOMP nur für automatisierte Abschaltgründe (Startschutz/niedrige Spannung).
- Override in der Board
.h-Datei deklarieren:
Konfiguration des Spannungs-Aufweckens (Voltage Wake Configuration)
Der LPCOMP (Low Power Comparator) wird konfiguriert, um:
- Den angegebenen AIN-Kanal (0-7, entsprechend P0.02-P0.05, P0.28-P0.31) zu überwachen.
- Gegen eine VDD-Bruchteilreferenz zu vergleichen (REFSEL: 0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16).
- UP-Ereignisse (Spannungsanstieg über den Schwellenwert) zu erkennen.
- Eine Hysterese von 50mV für Rauschunempfindlichkeit zu verwenden.
- Das Gerät aus SYSTEMOFF aufzuwecken, wenn ausgelöst.
configureVoltageWake() verwendet wird. Dies erfordert, dass USB VBUS an den nRF52 geleitet wird (typisch bei nRF52840-Boards mit nativem USB).
LPCOMP Referenzauswahl (PWRMGT_LPCOMP_REFSEL):
| REFSEL | Fraction | VBAT @ 1M/1M divider (VDD=3.0-3.3) | VBAT @ 1.5M/1M divider (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 SoftDevice aktiviert ist, und verwendet die entsprechende API:
- Wenn SD aktiviert:
sd_power_*-Funktionen - Wenn SD deaktiviert: Direkter Registerzugriff (NRF_POWER->*)
CLI-Befehle
Der Status der Energieverwaltung kann über die Kommandozeilenschnittstelle (CLI) abgefragt werden:
| Command | Description |
|---|---|
get pwrmgt.support | Gibt "supported" (unterstützt) oder "unsupported" (nicht unterstützt) zurück |
get pwrmgt.source | Gibt die aktuelle Stromquelle zurück – "battery" (Batterie) oder "external" (extern, 5V/USB-Strom) |
get pwrmgt.bootreason | Gibt die Reset- und Abschaltgrund-Strings zurück |
get pwrmgt.bootmv | Gibt die Startspannung in Millivolt zurück |
Auf Boards ohne aktivierte Energieverwaltung geben get pwrmgt.source und
get pwrmgt.bootmv Folgendes zurück:
get pwrmgt.support gibt unsupported zurück. get pwrmgt.bootreason wird
überhaupt nicht auskompiliert und antwortet auf jedem Board: getResetReason() und
getShutdownReason() sind virtuelle Funktionen in der Basis-Board-Klasse, sodass ein Board, das
diese nicht überschreibt, Not available anstelle eines Fehlers meldet. ESP32-
Boards überschreiben die Reset-Hälfte mit esp_reset_reason(), sodass sie einen echten
Reset-Grund und Not available für den Abschaltgrund zurückgeben.
Debug-Ausgabe
Wenn MESH_DEBUG=1 aktiviert ist, gibt das Energieverwaltungsmodul Folgendes aus:
Phase 2 (Geplant)
- Spannungsüberwachung während des Betriebs
- Spannungszustandsmaschine (Normal -> Warnung -> Kritisch -> Abschaltung)
- Konfigurierbare Schwellenwerte
- Lastabwurf-Callbacks zur Leistungsreduzierung
- Integration von Tiefschlaf
- Geplantes Aufwecken
- Erweiterter Schlaf mit periodischer Überwachung