Schätzung des Akkuladezustands¶
Der Akkurechner des SiFli-SDK schätzt den Ladezustand eines Akkus anhand seiner gemessenen Spannung als Prozentwert. Er ordnet Spannungswerten einen Ladezustand zu, misst aber nicht wie ein Coulomb-Zähler die ein- und ausfließende Ladung. Die Genauigkeit hängt daher von der hinterlegten Akkukurve und der korrekten Ladegerätesterkennung ab.
Die Middleware erkennt den Ladegerätestatus, wählt die passende Lade- oder Entladekurve aus und schätzt den Prozentwert durch Interpolation. Zusätzlich stabilisieren ein primärer Sprungfilter und ein optionaler gewichteter Mittelwertfilter das Ergebnis. Die veröffentlichte Anleitung beschreibt die interne Reihenfolge der Filter nicht vollständig. Prüfen Sie daher die Implementierung der SDK-Revision Ihres Projekts, bevor Sie eine bestimmte Reihenfolge annehmen.
Was der Rechner tut¶
| Funktion | Verhalten |
|---|---|
| Lade- und Entladekurven | Wählt je nach Ladegerätestatus die passende Zuordnung von Spannung zu Ladezustand aus. |
| Lineare Interpolation | Berechnet den Prozentwert zwischen zwei Punkten der gewählten Kurve. |
| Primärfilter | Filtert Spannungssprünge anhand des konfigurierten Schwellenwerts und der erforderlichen Anzahl aufeinanderfolgender Messwerte, die diesen überschreiten. |
| Sekundärfilter | Berechnet optional einen gewichteten Mittelwert aus dem vorherigen und dem aktuellen Spannungswert. |
| Erkennung des Ladegerätestatus | Wählt anhand der Ladegeräteerkennung des Boards die Lade- oder Entladekurve aus. |
flowchart LR
A["Akkuspannung über ADC lesen"] --> B{"Ladegerät erkannt?"}
B -->|"Ja"| C["Ladekurve auswählen"]
B -->|"Nein"| D["Entladekurve auswählen"]
C --> F["Kurveninterpolation, Filter und Trendregel für Laden/Entladen<br/>(interne Reihenfolge gemäß SDK-Implementierung)"]
D --> F
F --> G["Ladezustand in Prozent ausgeben"]
Das Diagramm fasst den Ablauf konzeptionell zusammen und garantiert keine interne Aufrufreihenfolge. Die veröffentlichte Anleitung legt die genaue Reihenfolge von Interpolation, Filtern und der Trendregel für Laden und Entladen nicht fest. Prüfen Sie dafür die Implementierung der SDK-Revision Ihres Produkts. Laut Anleitung sinkt der gemeldete Prozentwert beim Laden nicht und steigt beim Entladen nicht.
Zuerst das Board konfigurieren¶
Konfigurieren Sie das Board vor der Nutzung der Middleware in menuconfig:
- ADC-Unterstützung zur Messung der Akkuspannung aktivieren.
- Die Akkurechner-Funktion aktivieren.
- Ladeunterstützung aktivieren.
- Den auf dem Board verwendeten Lade-IC auswählen. Die einfache Ladegeräteoption nur verwenden, wenn keiner der aufgeführten Lade-ICs zutrifft.
- Den Erkennungspin für das Einstecken des Ladegeräts am Board konfigurieren.
- Die Polarität des Erkennungspins passend zur Hardware wählen.
BSP_CHARGER_INT_PIN_ACTIVE_HIGH legt die Polarität der Ladegeräteerkennung fest. Ist das Makro definiert, bedeutet ein High-Pegel, dass das Ladegerät angeschlossen ist. Ist es nicht definiert, signalisiert ein Low-Pegel den Anschluss. Eine falsch konfigurierte Polarität führt zur Auswahl der falschen Akkukurve und kann bewirken, dass der angezeigte Prozentwert stehen bleibt oder sich in die falsche Richtung ändert.
Akkukurven der tatsächlich verwendeten Zelle verwenden¶
Die Standarddatei battery_table.c im Board-Verzeichnis ist ein Beispiel, kein universelles Akkumodell. Fragen Sie den Hersteller nach den Kurven, die Spannung und Ladezustand der tatsächlich verwendeten Zelle zuordnen, und konfigurieren Sie passende Nachschlagetabellen für das Produkt.
| Tabelle | Erforderliche Definition |
|---|---|
charging_curve_table |
const battery_lookup_point_t[]-Tabelle für das Laden. Spannungseinträge müssen von hoch nach niedrig geordnet sein. |
discharge_curve_table |
const battery_lookup_point_t[]-Tabelle für das Entladen. Spannungseinträge müssen von hoch nach niedrig geordnet sein. |
| Tabelleninhalt | Die Prozentwerte sind in absteigender Reihenfolge von 100 bis 0 anzugeben und müssen das tatsächliche Verhalten des Akkus widerspiegeln. |
| Tabellenspeicherort | Board-spezifische battery_table.c. |
Verwenden Sie getrennte Kurven, da die Zellspannung bei gleichem Ladezustand beim Laden und Entladen unterschiedlich ist. Ersetzen Sie die Kurve der tatsächlich verwendeten Zelle nicht durch eine beliebige 4,2-V-Kurve für Lithiumzellen, nur weil die Nennchemie übereinstimmt.
Spannungsskalierung für das verwendete SDK und Board prüfen
Die veröffentlichte SiFli-Dokumentation ist in sich widersprüchlich: voltage_mv und die Filterschwellen sind als mV bezeichnet, im Beispiel wird jedoch 38000 für 3.8 V übergeben und die Beispielkurve verwendet 41808 für 4.18 V. Diese Zahlen passen zu einer Skalierung in 0,1 mV, die Dokumentation benennt diese Skalierung aber nicht ausdrücklich. Das ist daher eine Schlussfolgerung aus den Zahlen und keine API-Garantie. Prüfen Sie vor der Verwendung den ADC-Umrechnungspfad, die Akkutabelle und die Schwellenwertvergleiche in der genauen SDK-Revision und Board-Konfiguration.
ADC-Messwert, ausgewählte Kurventabelle und Filterschwellen müssen kompatible Skalierungen verwenden. Die Dokumentation nennt für die Schwellen die Werte 50 und 30 und bezeichnet sie als mV. Rechnen Sie diese Werte nicht allein aufgrund der Spannungsbeispiele um. Prüfen Sie, wie die verwendete SDK-Revision die einzelnen Felder interpretiert und vergleicht. Ändern Sie nicht nur die Skalierung des ADC-Messwerts, während Tabelle oder Schwellenwerte eine andere Skalierung behalten.
Den Rechner konfigurieren¶
battery_calculator_config_t liefert die beiden Kurventabellen und Filtereinstellungen.
| Feld | Zweck | Literal aus dem veröffentlichten Beispiel (Einheit laut Dokumentation) |
|---|---|---|
charging_table, charging_table_size |
Ladekurve und Anzahl der Punkte | Board-spezifisch |
discharging_table, discharging_table_size |
Entladekurve und Anzahl der Punkte | Board-spezifisch |
charge_filter_threshold |
Schwellenwert für Spannungssprünge beim Laden | 50 (in der Dokumentation als mV bezeichnet; SDK-Skalierung prüfen) |
discharge_filter_threshold |
Schwellenwert für Spannungssprünge beim Entladen | 30 (in der Dokumentation als mV bezeichnet; SDK-Skalierung prüfen) |
filter_count |
Anzahl aufeinanderfolgender Messwerte, die den Schwellenwert für Spannungssprünge überschreiten müssen, damit der Primärfilter die Änderung bestätigt | 3 |
secondary_filter_enabled |
Aktiviert den gewichteten Sekundärfilter | true |
secondary_filter_weight_pre |
Gewichtung der vorherigen Spannung | 90 |
secondary_filter_weight_cur |
Gewichtung der aktuellen Spannung | 10 |
Wenn der Sekundärfilter aktiviert ist, muss secondary_filter_weight_pre + secondary_filter_weight_cur gleich 100 sein. Stimmen Sie Schwellenwerte, Messanzahl und Gewichtungen auf den verwendeten Akku, Lasttransienten und das gewünschte Produktverhalten ab. Die SDK-Referenzwerte ersetzen keine Kalibrierung.
Initialisieren und Berechnen¶
Initialisieren Sie den Rechner, bevor Sie einen Prozentsatz anfordern. Die veröffentlichte SiFli-Anleitung deklariert die Initialisierungsfunktion mit Rückgabetyp void; maßgeblich für die Kompilierung ist der Header der SDK-Revision Ihres Projekts.
void battery_calculator_init(battery_calculator_t *calc,
const battery_calculator_config_t *config);
Die Prozent-API liefert 0–100 als Ladezustand, nicht die Akkukapazität in mAh. Prüfen Sie vor der Integration den Header und die Implementierung der verwendeten SDK-Revision auf zusätzliche Parameterbedingungen oder einen Initialisierungsstatus.
Übergeben Sie die Akkuspannung in der Skalierung, die von der verwendeten SDK-Revision erwartet wird. Der veröffentlichte API-Parameter heißt voltage_mv; prüfen Sie die tatsächliche Skalierung dennoch wie oben beschrieben:
| Schritt | Aktion |
|---|---|
| 1 | ADC, Ladegerätetyp, Ladegeräte-Erkennungspin und dessen Polarität für das Board konfigurieren. |
| 2 | Validierte Lade- und Entladekurven in battery_table.c definieren. |
| 3 | battery_calculator_t mit battery_calculator_config_t initialisieren. |
| 4 | Die Akkuspannung über den konfigurierten ADC-Pfad auslesen. |
| 5 | Nach Prüfung der einheitlichen Skalierung von Spannung, Tabellen und Filterschwellen die Spannung an battery_calculator_get_percent() übergeben. |
| 6 | Das gefilterte Ergebnis für die Benutzeroberfläche, Warn- und Abschaltlogik bei niedrigem Akkustand sowie die Produkttelemetrie verwenden. |
Verhalten auf der Produkthardware verifizieren¶
Der angezeigte Prozentwert muss den tatsächlichen Produktzustand widerspiegeln und darf nicht nur im Labor plausibel wirken. Prüfen Sie beim Laden und Entladen sowie beim Anschließen und Abziehen des Kabels gemeinsam, ob das Ladegerät erkannt wird, welche Spannung gemessen und welche Kurve ausgewählt wird und welcher Prozentwert angezeigt wird.
| Symptom | Zuerst prüfen |
|---|---|
| Prozentsatz ändert sich zu abrupt | Zuerst prüfen, ob ADC-Messwert, Kurventabellen und Schwellen dieselbe Skalierung verwenden. Danach den relevanten Schwellenwert oder filter_count anpassen und bei Bedarf den Sekundärfilter aktivieren oder verstärken. |
| Prozentsatz ist ungenau | Eine zum tatsächlichen Akku passende Kurve beziehen und die Nachschlagepunkte neu kalibrieren. |
| Prozentsatz bleibt unverändert | Den gemeldeten Ladegerätestatus und die Polarität von BSP_CHARGER_INT_PIN_ACTIVE_HIGH prüfen. Laut der veröffentlichten Anleitung verhindert das Laden, dass der Prozentwert sinkt, und das Entladen, dass er steigt. |
| Prozentsatz ändert sich in die falsche Richtung | Den Ladegeräte-Erkennungspin, seine elektrische Polarität und die ausgewählte Lade- oder Entladekurve prüfen. |
Die offizielle Middleware-Referenz und aktuelle Konfigurations-Screenshots finden Sie unter Akkuladezustand mit dem SiFli-SDK berechnen. Für Abschätzungen der Akkulaufzeit auf Systemebene fahren Sie mit Stromverbrauchsanalyse einer Smartwatch fort; zur Überprüfung durch Messungen siehe Energieverbrauch messen und validieren.
Die veröffentlichte Anleitung ist ein Ausgangspunkt, ersetzt aber nicht die Prüfung der SDK-Revision, die Ihr Produkt verwendet. Klären Sie insbesondere die widersprüchliche Spannungsskalierung anhand des ADC-Pfads, der Akkutabelle, der Schwellenwertvergleiche und des API-Headers dieser Revision.
Zuletzt aktualisiert: