EN

nRF52 Energieverwaltung

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):
CodeNameDescription
0x00NONENormaler Start / kein vorheriges Herunterfahren
0x4CLOW_VOLTAGESchwellenwert für niedrige Spannung während des Betriebs erreicht
0x55USERBenutzer hat powerOff() angefordert
0x42BOOT_PROTECTStartspannungs-Schutz wurde ausgelöst

Unterstützte Boards

BoardImplementedLPCOMP wakeVBUS wake
Seeed Studio XIAO nRF52840 (xiao_nrf52)YesYesYes
RAK4631 (rak4631)YesYesYes
Heltec T114 (heltec_t114)YesYesYes
GAT562 Mesh Watch13YesYesYes
Promicro nRF52840NoNoNo
RAK WisMesh TagNoNoNo
Heltec Mesh SolarNoNoNo
LilyGo T-Echo / T-Echo LiteNoNoNo
SenseCAP SolarYesYesYes
WIO Tracker L1 / L1 E-InkNoNoNo
WIO WM1110NoNoNo
Mesh PocketNoNoNo
Nano G2 UltraNoNoNo
ThinkNode M1/M3/M6NoNoNo
T1000-ENoNoNo
Ikoka Nano/Stick/Handheld (nRF)NoNoNo
Keepteen LT1NoNoNo
Minewsemi ME25LS01NoNoNo

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)
Dies stellt sicher, dass wir den wahren Reset-Grund erfassen, bevor jeglicher Initialisierungscode ausgeführt wird.

Board-Implementierung

Um die Energieverwaltung auf einer 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   // Startet nicht unter dieser Spannung (mV)
   #define PWRMGT_LPCOMP_AIN          7      // AIN-Kanal für Spannungserfassung
   #define PWRMGT_LPCOMP_REFSEL       2      // REFSEL (0-6=1/8..7/8, 7=ARef, 8-15=1/16..15/16)
  1. In der Board .cpp-Datei 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-spezifische Abschaltvorbereitung (z.B. Peripheriegeräte deaktivieren)
     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();  // oder NRF52BoardDCDC::begin()
     // ... Board-Einrichtung ...

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

Für benutzerinitiierte Abschaltungen bleibt powerOff() board-spezifisch. Die Energieverwaltung aktiviert LPCOMP nur für automatisierte Abschaltgründe (Startschutz/niedrige Spannung).

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

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.
VBUS-Aufwecken wird über das POWER-Peripheriegerät mit dem USBDETECTED-Ereignis aktiviert, wann immer 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):
REFSELFractionVBAT @ 1M/1M divider (VDD=3.0-3.3)VBAT @ 1.5M/1M divider (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 einem Spannungsteiler am Batteriesensorpin misst LPCOMP die geteilte Spannung. Verwenden Sie: 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->*)
Dies gewährleistet Kompatibilität unabhängig vom Zustand des BLE-Stacks.

CLI-Befehle

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

CommandDescription
get pwrmgt.supportGibt "supported" (unterstützt) oder "unsupported" (nicht unterstützt) zurück
get pwrmgt.sourceGibt die aktuelle Stromquelle zurück – "battery" (Batterie) oder "external" (extern, 5V/USB-Strom)
get pwrmgt.bootreasonGibt die Reset- und Abschaltgrund-Strings zurück
get pwrmgt.bootmvGibt die Startspannung in Millivolt zurück

Auf Boards ohne aktivierte Energieverwaltung geben get pwrmgt.source und get pwrmgt.bootmv Folgendes zurück:

CLI
ERROR: Power management not supported

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:

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)

  • 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

Referenzen

Quelle: docs.meshcore.io