Ich entwerfe eine kostengünstige SoC-Evaluierungssoftware (State of Charge) für eine LiFePo 4- Batteriezelle bei Nullstrom (eigentlich nur ein niedriger Strom aufgrund von Selbstentladung). Für diese besondere Anwendung bedeuten niedrige Kosten hier, dass wir wahrscheinlich kein Strommessgerät/Coulomb-Messgerät verwenden werden.
Ich führe meine Software auf einem BeagleBone AI auf Pin AIN4 aus, der maximal 1,8 V aushält, an den ich meinen Spannungsteiler angeschlossen habe. Der Pin hat einen 12-Bit signierten ADC.
Der BeagleBone AI wird an eine 1S24P-Batteriekonstruktion angeschlossen, die eine Nennspannung von 12 V und eine Kapazität von 51 Ah liefert.
Mein Teiler verwendet 10 kOhm 100 kOhm, was mir einen Skalierungsfaktor von 11 (AKA (10 + 100)/10) gibt.
Bei einer Lesespannung von 13,1 V liest AIN4 1384 AKA 1,217 V
v = 1384/(1<<11 - 1)*1.8 V
Was nach Anwendung der Skala zu 13,387 V wird:
Vbat = v*11
Ich stelle fest, dass die Genauigkeit für meinen Zweck nicht so groß ist, da ich die Spannung verwende, um die Soc / Spannungszellenkurve abzugleichen, da die Kurve zwei Plateaus hat.
Was sollte ich tun, um meine Genauigkeit zu verbessern?
Es gibt mehrere Dinge, die getan werden können, um die Genauigkeit Ihrer Messungen zu verbessern:
Versuchen Sie, mehr vom vollen Skalenbereich des ADC zu verwenden. Wenn das Maximum 1,8 V beträgt und Ihre maximale Batteriespannung 16,4 V beträgt, versuchen Sie es mit einem Skalierungsfaktor von 9,5 anstelle von 11.
Verwenden Sie Widerstände mit engeren Toleranzen (versuchen Sie es mit 0,1 % oder besser) und besseren Spezifikationen für die Temperaturdrift.
Kalibrieren Sie den ADC-Ausgang. Die meisten ADCs haben einen nicht idealen Offset und eine Nichtlinearität, die Sie in Hardware oder Software kalibrieren können. Eine Möglichkeit, dies in der Software zu tun, besteht darin, Messungen über den gesamten Bereich der ADC-Eingänge durchzuführen und die Messkurve an eine Interpolationsfunktion anzupassen. Verwenden Sie dann die Interpolationsfunktion, um den ADC-Ausgang zu skalieren.
12 Bit = = 4096 Zählungen/Skala.
Wenn vorzeichenbehaftet und 0b = 0 V, dann 1,8 V = 4096/2 = 2048 (und -1,8 V = -2048, wobei das letzte Bit ignoriert wird.)
1,8 V/2048 = ~88 µV/Bit. Das ist die kleinste „Schrittgröße“, die in dieser Konfiguration erkennbar ist (unter Verwendung des gesamten verfügbaren Dynamikbereichs).
Da der Teiler durch 11 "teilt", sind 88 µV / Bit * 11 = 9,7 mV "Schritt" -Größe der Batteriespannung, im besten Fall.
Um eine höhere Auflösung zu erreichen, verwenden Sie entweder nicht vorzeichenbehaftete 0-1,8-V-Vollaussteuerung, falls verfügbar (doppelte Auflösung, 44 µV/Bit), mehr Bits (besserer (langsamer) ADC) und/oder Mittelwertbildung (Oversampling). sowieso zu überabtasten, da Rauschen bei diesen niedrigen Spannungen ein größeres Problem darstellt.
Kann das Abtastrauschen etwas reduzieren, indem die Werte der Teilerwiderstände (mindestens eine Größenordnung) reduziert und nur bei Bedarf in die Schaltung geschaltet werden. Höherer Teilerstrom = geringeres Rauschen.
Untersuchen Sie auch die mathematische Gleitkommabibliothek, die in Ihrem MCU verwendet wird. Einige verwenden das 24-Bit-Exponenten-Mantissen-Format, was bei nur wenigen Operationen zu erheblichen Rundungsfehlern führen kann. Erstellen Sie eine Testroutine, um diesen Fehler zu quantifizieren.
Schließlich ist das Messen der Batteriespannung möglicherweise nicht der beste Indikator für den Ladezustand, insbesondere bei Lithium-Typen. Untersuchen Sie „Coulomb-Zählung“ und ähnliche SoC-Geräte. Diese verfolgen/berechnen die Ladungsmenge in der Batterie, indem sie den Stromeingang, den Stromausgang und sogar die Anzahl der Zyklen (Degeneration) verfolgen.
Der BeagleBone verwendet nur die 1,8-V-Digital-Vdd als Referenz, sodass jeder Fehler darin einen proportionalen Fehler im ADC-Messwert verursacht. Die Datenblattgrenzen bei Raumtemperatur liegen dafür bei +/-2%.
Hinzu kommen Ihre Widerstandstoleranz und etwaige Fehler aufgrund der ADC-Eingangsimpedanz. Und ADC-Fehler selbst.
Sie könnten eine genauere externe Referenz angeben (dafür gibt es auf dem Board keine Möglichkeit, aber es gibt eine 0 Widerstand, der entfernt werden könnte). Oder stellen Sie eine Referenzspannung bereit und messen Sie diese und skalieren Sie den Messwert durch die gefilterte Referenz. Zum Beispiel eine 1,225 V 0,1 % Referenz .
Sie könnten den Messwert einfach kalibrieren, indem Sie einen Bereichskalibrierungsfaktor speichern, aber das würde driften, wenn sich der LDO im PMIC erwärmt und abkühlt. Ich sehe keine Angabe zur Temperaturdrift.
Wenn Sie Dünnfilm-Widerstände mit 0,1 % 25 ppm/°C und eine externe Referenz verwenden und den Messwert kalibrieren (Einpunktkalibrierung), sollten Sie in der Lage sein, eine oder zwei Größenordnungen Verbesserung für ein Teilekosten-Delta von etwa 1,50 $ zu erzielen.
winzig
Elliot Alderson
brhans
Mu3
Kyle B
Daniel K.