LiPo Batterie, Ladezustand erfassen

Hallo zusammen,

ich möchte gerne den Ladezustand eines LiPo-Akkus erfassen und über ein einfaches LCD Display ausgeben. Es muss nicht wirklich präzise sein, soll nur den Zweck erfüllen, dass ich den Akku rechtzeitig entnehme und auflade.

Ich habe mich ein wenig in LiPo Akkus eingelesen und folgendes überlegt:

Eine Zelle besitzt i.d.R. 3.7V Nennspannung und allgemein wird empfohlen ab circa 3.3V (pro Zelle) den Akku wieder aufzuladen.

Wenn ich also beispielsweise einen 14,8V 10.000 mAh 4S LiPo-Akku kaufe, würde ich den Ladezustand pi mal Daumen so berechnen:

4 x 3,3V = 13,2V als Minimum festlegen

und dann 1% Schritte berechnen: (max - min)/100 bzw. (14,8V - 13,2V)/100 = 0,015V für 1%.

Dann einfach die aktuelle Spannung der LiPo Batterie messen und mit der obigen Berechnung den Ladezustand in Prozent ausgeben.

Macht das soweit Sinn?

P.s: Wie messe ich am besten die Akku-Spannung mit einem Arduino?

vielen Dank

Spannung misst du über einen Spannungsteiler, also 2 Widerstände in Serie zwischen Akku + und -. für 3s z.B.:

(Akku +)---[200k]---[A0]---[100k]---(GND)

Beachte: Die Entladekurve ist nicht konstant. Und je nach Akku ist die Entladespannung auch mal 2.5V (aber meistens nicht für die im "Plastikbeutel")

https://drohnen360.com/grundlagen-akkus-auswahl-des-richtigen-liion-oder-lipo-akkus-laden-entladen-und-akku-pflege/

Hallo,

hier ein Link

Lipo Wiki

demnach liegt der Spannungsbereich zwischen 3,0 und 4,2 Volt. Eingangsmessbereich ist bei 5V Systemen halt 5V beim ESP in der Regel 3,3V da wird dann ein zusätzlicher Vorwiderstand benötigt um den internen Spannungsteiler zu erweitern.

Deine Berechnung des Ladezustandes macht so nicht wirklich Sinn, da die Spannung nicht linear absinkt beim entladen. Kann man aber so machen um festzustellen wann man neu laden muss. Eigendlich müsste man beim entladen sicher das Integral des Stromes über der Zeit berechnen. Also mAh.

google mal nach "lipo akku entladekurve"

Heinz

da wird dann ein zusätzlicher Vorwiderstand benötigt um den internen Spannungsteiler zu erweitern.

Was meinst du damit? (interner Spannungsteiler)

Wenn du nur relativ zum Minimum (4*3.3V) messen willst, um eine höhere Auflösung zu erreichen, brauchst du einen opamp, eine Referenz-Spannung und hochgenaue Widerstände für deine Opamp-Beschaltung.

Aber: Wenn bei einem normalen Spannungsteiler dein effektiver Bereich ( 4.2 - 3.3 ) / 4.2 = 20 % deines Messbereichs ist, kannst du bei 10 bit ADC-Auflösung noch locker ganzzahlige Prozent ohne Sprünge darstellen.

Fraglich ist eher, wie hochohmig dein Spannungsteiler sein kann, um den Akku nicht übermäßig zu entladen. (Evtl. braucht es einen Kondensator am Analogeingang)

Oder ist der Akku sowieso nie unbelastet, und versorgt auch gleich den Arduino mit, der ( @noiasca ) die gemessene Spannung in 0 .. 100 % umrechnet?

Du kannst die Auflösung des ADC um ein paar Bit raufdehen, indem du mehrere Messungen mittlelst (Da gibt's von Atmel eine Applicationnote mit Herleitung). Den Akku entlädt der Spannungsteiler immer, aber wenn man' mal durchrechnet (und sich hoffentlich nicht verrechnet): 356 Tage * 24 Stunden * 12V / 300 k => 0.35 Ah ... die Selbstentladung vom LiPo liegt auch in dem Bereich (je Akku und Hersteller, Temperatur, Alter ...)

Hallo,

@michael_x

richtig ich hab eine Outdoor Wetterstation an einer Solarzelle 6V/100mA mit einem LIPO-Laderegler und einem LiPo Aku. Ein Wemos D1 wird dann über einen Stepup Regler mit 5V betrieben. von dem Aku messe ich die Spannung. Dazu hab ich mit eimem zusätzlichen externe Widerstand von 200 K den interne Spannungsteiler am Analogeingang erweitert. Damit hab ich den Messbereich von 3,3 auf 5,2V geändert. Hochohmig ist es auch geblieben, damit ist die Last für den Aku auch gering, ich hab ja keinen zusätzlichen Spannungsteiler aufgebaut.

U2= U1*(R1+R2)/R1 = 1V*(1K+4,2K)/1K

der Aku wird im deepSlep mit etwa 0,5mA belastet.

Heinz

nyquist:
P.s: Wie messe ich am besten die Akku-Spannung mit einem Arduino?

Hi,

ich ermittle für mein Projekt am Nano die Spannung eines LiPo 1s1p, über einen Analogpin, mit einem ElKo (25V/22µF) zwischen Pin und GND (Minus des C an GND). Da hier nur Spannungen bis 5V gemessen werden können, eignet sich der Sketch nur für eine Zelle, bzw. mehrere parallele Zellen (ungetestet). Kannst ja mal schauen ob du damit was anfangen kannst.

Die Berechnungen können auch kombiniert werden, ich hatte die nur gesplittet um Werte im Seriellen Monitor zu prüfen. Da Map offenbar nicht mit float funktioniert, hab ich den analogen Rohwert mit 100 multipliziert, ob das so für dich nötig ist musst du entscheiden. Ich benötigte zwei verschiedene Prozentwerte für verschiedene Funktionen.

Die Funktion rufe ich im Intervall von 5000 ms auf (Lib "Ticker") und ermittle von 10 direkt hintereinander erfolgten Messungen den Mittelwert (Lib "RunningMedian")

#include "Ticker.h"                                 //Zeitgesteuerte Funktionen (Intervall) https://github.com/sstaub/Ticker
#include "RunningMedian.h"                            //Mittelwert/Durchschnitt von Messergebnissen https://github.com/RobTillaart/Arduino/tree/master/libraries/RunningMedian
const byte BatPin = A7;

void getBattery();                                          //Funktionsdeklaration
Ticker timer1(getBattery, 5000);                      //Funktion alle X ms

RunningMedian median1 = RunningMedian(10); //Mittelwert mittels X Durchläufen ermitteln

void setup()
{
  Serial.begin(9600);                                 //Serieller Monitor PC
  pinMode(BatPin, INPUT_PULLUP);
  PulseStatus = false;
  timer1.start();                                     //Initialisierung timer1 - getBattery()
}

void loop()
{
  timer1.update();                                    //Intervall timer1 ermöglichen - getBattery()
}

void getBattery()
{
  int x = analogRead(BatPin);                                            //Rohwert (0-1023) über Analogpin auf Basis von 5V (=1023)
  median1.add(x);                                                            //Wert für Mittelwert setzen
  long m = median1.getMedian();                                       //Mittelwert ermitteln

/*Nachdem der Median ausgerechnet ist, oder der Wert ermittelt wurde, werden die Daten weiterverarbeitet:*/

  unsigned long BatValue = m * 100L;                               //Wert um hundert multiplizieren, Vorbereitung zur Umrechnung in float/double
  float BatVoltage1 = BatValue * 5 / 1024L;                       //Ermittelter multiplizierter Rohwert in Spannung umrechnen (inkl. 2 Nachkommastellen als Ganzzahl) 

/*Folgende 2 map()-Umwandlungen sind für unterschiedliche Weiterverarbeitung gedacht*/
  byte BatRate = map(BatVoltage1, 240, 420, 0, 100);       //Spannung in Prozent (2,40V=0%/4,20V=100%)
  byte BatRate1 = map(BatVoltage1, 350, 420, 0, 100);     //Spannung in Prozent (3,50V=0%/4,20V=100%)

  float BatVoltage = BatVoltage1 / 100.0;                          //Spannung in float 0.00 umwandeln

/*Ausgabe im Seriellen Monitor*/
  Serial.print(BatValue / 100);
  Serial.print("\t");
  Serial.print(BatVoltage1);
  Serial.print("\t");
  Serial.print(BatRate);
  Serial.print("\t");
  Serial.println(BatVoltage);
}

Gruß
Jörg

EDIT: setup() und loop() nachgetragen.