LiFePo4 Balancer und BMS (Batteriemanagement Controller) - Eigenbau mit Raspberry Pico W

BMS Controller V00.99.14 – (letzte Änderung an dieser Seite 13.04.2024)

Ein BMS – Batterie-Magement-System Controller hat die Aufgabe, eine größere Zahl von LiFePo4, Li-Ion, LiPo Akkuzellen so zu überwachen, dass diese beim Laden und Entladen keinen Schaden nehmen und möglichst lange störungsfrei genutzt werden können.

Mein BMS Controller kommuniziert dafür über einen Datenbus mit den Balancermodulen und steuert direkt über Schaltrelais das Laden und Entladen der Akkuzellen. Bei mir schalten diese Relais je ein Victron Smart BatterieProtect (SSR 65-220A Halbleiterrelais). Die Akkuzellen werden durch den BMS Controller vor Überladung, zu tiefer Entladung, vor hohen und zu tiefen Temperaturen geschützt. Die galvanisch getrennte Bus Verbindung nutzt ein eigenes serielles Datenprotokoll und kann jederzeit aus den Balancern die Akkuspannung, die Akkutemperatur und die Temperatur der Lastwiderstände auslesen. Sobald eine zu hohe, zu tiefe Temperatur erkannt wird oder eine Fehlfunktion beim Lesen der Daten auftritt, reagiert der BMS Controller passend und trennt die Last oder unterbricht das Laden. Im Fehlerfall kann ein Tonsignal zur Signalisierung ausgegeben werden. Zusätzlich ist ein geschalteter Relaiskontakt frei nutzbar. Bei schwerwiegenden Fehlfunktionen schaltet das BMS das Laden oder Entladen komplett ab. Der Fehler muss dann über die Webschnittstelle oder direkt per Taster am BMS Modul quittiert werden. Der BMS Controller hat  eine WLAN Webschnittstelle und kann sich mit einem vorhandenen WLAN Netzwerk verbinden. Die wichtigsten Parameter aller Akkuzellen und der Funktion das BMS kann im Netzwerk per Browser aufgerufen werden. Als Schutz vor Manipulationen ist es über die Webschnittstelle nicht möglich, Einstellungen abzuändern. Ein OLED Display auf dem BMS Controller kann zusätzlich die wichtigsten Parameter der Akkuzellen zeigen. Besteht der Wunsch die Daten der Akkuzellen aufzuzeichnen oder weiterzuverarbeiten, dann kann der BMS Controller diese auch an einen kostenfreien Thingspeak Cloud-Account senden. 

Auch die Nutzung eines eigenen MQTT Brokers (FHEM, ioBroker, IP-Symcon, Mosquito …) wäre möglich, wenn ein passender Softwarebaustein hinzugefügt wird.

Funktionen

  • 1 bis 50 Balancer können über den isolierten seriellen Bus angeschlossen werden
  • Buslänge maximal 10m (Linientopologie)
  • Akkuspannungsmessung über Balancer aus jeder Zelle
  • Akkutemperaturmessung über Balancer aus jeder Zelle
  • Temperaturmessung am Lastwiderstand über Balancer aus jedem Balancer
  • Softwareversion und Uptime jedes Balancers auslesen 
  • OLED Display (Betrieb des BMS Controllers ist auch ohne OLED Display möglich)
  • Bei Fehlfunktionen wird das Laden oder Entladen abgeschaltet (je ein Relais)
  • Tongeber integriert (kann per Software deaktiviert werden)
  • LED Alarmfunktion mit zusätzlichem Relaisausgang
  • WLAN Verbindung (Betrieb auch ohne WIFI möglich) 
  • Logging über Thingspeak oder MQTT (WLAN notwendig)
  • LED’s zeigen den Schaltzustand der drei Relais an
  • blinkende LED auf dem Raspberry Pico W als Funktionskontrolle
  • Webansicht aller Parameter und Funktionen (WLAN notwendig)
  • 24 Stunden skalierter Graph der Akkugesamtspannung (WLAN notwendig)
  • einstellbare Entladeschluss-Spannung (Wert der Zelle mit der geringsten Spannung)
  • einstellbare Ladeschluss-Spannung (Wert der Zelle mit der höchsten Spannung)
  • einstellbare Übertemperaturschutz des Akkus beim Laden und Entladen
  • einstellbarer Untertemperaturschutz des Akkus beim Laden
  • einstellbarer Alarm bei extremer Unterspannung einer Zelle (lange Lagerung ohne Laden)  
  • einstellbarer Alarm bei extremer Überspannung einer Zelle (Balancer oder SSR ist defekt) 
  • 3 Varianten der Spannungsversorgung möglich.
    a) über USB Anschluss
    b) über 12-40 Volt Gleichspannung vom Akku
    c) mit 230 Volt aus dem Stromnetz. (stromsparende Schaltnetzteiltechnik)
  • Watchdog (automatischer Neustart der Software, wenn diese längere Zeit nicht reagiert)
  • Fehlerzustände können über die Webansicht oder über den Mode Taster quittiert werden
  • Firmware im Raspberry Pico W kann jederzeit geändert und aktualisiert werden
  • Firmware nutzt die Scriptsprache Micropython, ist gut und komplett kommentiert
  • BMS Controller hat wie jedes Balancermodul einen eigenen Uptimer
  • Zeitsynchronisierung (WLAN notwendig)

Das verwendet Gehäuse ist ein Gehäuse von BOX4U bezogen über www.reichelt.de mit der Bezeichnung 4U63120806437 und kostet nur 4,55 Euro. Es passt perfekt und als Schrauben können einfache M3 Schrauben verwendet werden.

Download Schaltung BMS Controller V2 als PDF (70 Kb)
Download Bestückung BMS Controller V2 als PDF (185 Kb)
Link zur aktuellen Software auf Github (Software BMS Controller V2)

Je nach Verfügbarkeit kann ich Ihren Nachbau mit Leerplatinen oder komplett bestückte Leiterplatten unterstützen. Bitte per Mail anfragen. 

Wenn man sich die aktuellen Files über GitHub heruntergeladen hat, muss man die Zeilen 7 bis 32 in der main.py nach den eigenen Erfordernissen anpassen. In das File secrets.py tragen Sie Ihre eigenen WLAN Zugangsdaten ein. Dann kann man alles z.B. mit Thonny zum Raspberry Pico W übertragen.

Technische Daten:
Stromverbrauch vom BMS Controller mit OLED Display bei unterschiedlichen Spannungen
12 Volt = 55 mA
18 Volt = 36 mA
24 Volt = 27 mA
28 Volt = 24 mA

LiFePo4 Balancer Version 2

Der Balancer V2 ist eine Weiterentwicklung meines ersten selbstgebauten Balancers V1 aus dem Jahre 2020. Die Version V1 hat bis zum heutigen Tag seine Funktion voll und ganz erfüllt. An meinem 8 Zellen 160 Ah LiFePo4 Winston Akku  musste in den vergangenen 4 Jahren nie händisch eingegriffen oder nachgeladen werden. In den 5 Wintermonaten konnten die Zellen durch viel zu wenig Solarertrag oft wochen- oder monatelang nicht mehr komplett vollgeladen werden. Dennoch habe ich sie jeden Tag bis auf die Klemmspannung von etwa 3,1 Volt mit meinem Nulleinspeise-Netzwechselrichter entladen. Die ersten Vollladungen erfolgten dann wieder im Frühjahr und schon nach den ersten Volladungen konnte die kleine Spannungsdrift der Zellen komplett ausgleichen werden. Jeden meiner Winston 160Ah LiFePo4 Akkus hatte ich mit je einem Balancer ausgestattet, der maximal 4 A balancieren kann. Geladen wurden die Zellen mit einem Victron Laderegler der maximal 50 A Ladestrom liefern konnte.

Für den neuen Balancer V2 habe ich eine passende zweiseitige Leiterplatte entwickelt und mir diese professionell herstellen lassen. Der neue Balancer V2 hat aber weitere interessante Funktionalitäten. Er kann die Temperatur der Lastwiderstände aber auch die Temperatur des Akkus messen und diese Daten über einen isolierten Bus an das BMS übertragen. Bei zu hohen Temperaturen der Lastwiderstände kann dann das BMS das Laden unterbrechen. Durch die Temperaturmessung vom Akku selbst kann man Schäden am Akku verhindern, wenn dieser zu heiss oder zu kalt für das Laden ist.

In den nun folgenden Zeilen nenne ich den Balancer V2 nur noch Balancer.

Das grundlegende Konzept des Balancers hat sich nicht verändert. Er wird mit Hilfe der M8 Schraube direkt auf dem Pluspol des LiFePo4 Akkus geschraubt. Mit einem kurzen flexiblen Kabel und einer Lötöse wird dieser zum Minuspol verbunden. Wenn man abweichende Schraubverbindungen hat, müssen zwei Kabel mit Lötösen am Balancer angebracht werden. Ein BMS oder eine Busverbindung zwischen jedem der Balancer ist für die Funktion des Balancers nicht zwingend erforderlich. Jeder Balancer ist für sich genau justiert und balanciert die LiFePo4 Zelle allein. Mit Hilfe der Busverbindung können 1 bis 50 Balancer mit dem BMS kommunizieren. Das BMS kann die Funktion des Balancers, die genaue Spannung jeder Zelle, die Temperatur der Zelle und auch die Temperatur der Lastwiderstände kontrollieren. Der hierfür notwendige 4-adrige Bus darf dabei nicht 10 m Bus-Leitungslänge überschreiten. Für die Busverbindung verwende ich ein leicht zu verarbeitendes flexibles 10-poliges Flachbandkabel ohne Schirmung mit aufpressbaren Buchsenleisten.

Balancer (ohne Busverbindung)

Nach dem Verbinden mit dem LiFePo4 Akku leuchten die beiden LED’s (rot >U und grün <U) für etwa 10 Sekunden dauerhaft. Im Anschluss zeigen die drei verbauten LED’s folgende Zustände und Funktionen je nach Spannungslage das Akkus an.
Grundlegend hat die rote LED (>U) die Funktion eine zu hohe Spannung des Akkus zu signalisieren. Die grüne LED (<U) leuchtet bei zu geringer Spannung. Die dritte LED eine rote LED BAL zeigt mit dem Leuchten, das gerade aktive Balancieren = aktive Lastwiderstände an.

AkkuspannungLED <U und LED >ULED BalBemerkung
< 2,7 Voltgrün Dauerlichtdauerhaft ausextreme Unterspannung
=2,7 bis < 2,8 Voltgrün Blinken dreimal dauerhaft ausgroße Unterspannung
=2,8 bis < 2,9 Voltgrün Blinken zweimaldauerhaft ausUnterspannung
=2,9 bis < 3,0 Voltgrün Blinken einmaldauerhaft ausleichte Unterspannung
=3,0 bis < 3,4 Voltrot/grün Blinken einmaldauerhaft ausNormalspannung
=3,4 bis < 3,5 Voltrot Blinken einmal1 sec ein / 7 sec ausleichte Überspannung
=3,5 bis < 3,6 Voltrot Blinken zweimal1 sec ein / 1 sec ausÜberspannung
=3,6 bis < 3,7 Voltrot Blinken dreimaldauerhaft eingroße Überspannung
>= 3,7 Voltrot Dauerlichtdauerhaft einextreme Überspannung

Balancer (mit Busverbindung und BMS Modul)

Über den isolierten seriellen Bus kann das BMS mit 300 Baud (1 Stoppbit, ohne Parität) mit jedem der Balancer kommunizieren.

Gesendet werden immer 4 ASCII Zeichen. Die ersten zwei Zeichen entsprechen der Nummer des anzusprechenden Balancers. Es können wie schon erwähnt zwischen 1 und maximal 50 verschiedene Balancer angesprochen werden. Mit den Zeichen 01 wird der erste und mit 02 der zweite Balancer angesprochen. Es folgen nun zwei weitere ASCII Zeichen des Befehls. Anfragen an nicht vorhandene Balancer werden nicht beantwortet bzw. ignoriert. Nach jedem gesendeten Befehl (4 Zeichen) sollte der angesprochene Balancer 5 Sekunden Zeit bekommen um seine Messungen und Berechnungen ausführen zu können bzw. um zu antworten. 

Die genannten Befehle beziehen sich auf die Balancer Softwareversion 00.01.48. Mit den Zeichen xx ist der anzusprechende Balancer gemeint. Mit 01 ist also Balancernummer 1 und mit 02 Balancer 2 gemeint. Um als Beispiel die Spannung von Balancer 5 zu erhalten muss der Befehl 0505 gesendet werden.

Befehl xx00
>>> Lastwiderstände für 5 Minuten abschalten, egal welche Klemmspannung am Akku anliegt. Wenn vorher über den Befehl xx01 die Lastwiderstände eingeschaltet wurden, werden diese jetzt ausgeschaltet. Wird innerhalb der laufenden 5 Minuten erneut dieser Befehl gesendet, beginnen erneut 5 weitere Minuten in dem der Lastwiderstand abgeschaltet ist.
>>> Rückgabe wenn ok = 1 (0x31)

Befehl xx01
>>> Lastwiderstände für 5 Minuten einschalten, egal welche Klemmspannung am Akku anliegt. Wenn vorher über den Befehl xx00 die Lastwiderstände ausgeschaltet wurden, werden diese jetzt eingeschaltet. Wird innerhalb der laufenden 5 Minuten erneut dieser Befehl gesendet, beginnen erneut 5 weitere Minuten wo der Lastwiderstand eingeschaltet ist.
>>> Rückgabe wenn ok = 1 (0x31)

Befehl xx02
>>> Akkutemperatur mit Vorzeichen ausgeben. Gemessen wird aber die Temperatur im Controller, der ja direkt über dem Akku angebracht ist und die Zellentemperatur sehr gut abbildet. Es werden ganze Gradzahlen ausgegeben „-11“ für -11 °C und +34 für 34 °C.

Befehl xx03
>>> Temperatur des Lastwiderstandes mit Vorzeichen ausgeben. Gemessen wird die Temperatur über den DS1820 der direkten Kontakt mit den Widerständen hat. Es werden auch hier ganze Gradzahlen ausgegeben „-11“ für -11 °C und +55 für 55 °C.

Befehl xx04
>>> Ausgabe der Uptime in Sekunden des Balancers. Die Anzahl der ausgegebenen ASCII Zeichen richtet sich nach der Laufzeit. Maximal wären reichlich 34 Jahre in Sekunden darstellbar. Beispiel: Die Ausgabe von 345610 entspricht der Laufzeit der Software von 4 Tagen und 10 Sekunden.

Befehl xx05
>>> Ausgabe der Klemmspannung des Akkus in mVolt. Es wird +3351 ausgegeben, wenn am Akku eine Spannung von 3,351 Volt anliegt.

Befehl xx06
>>> Ausgabe der Softwareversion in 6 ASCII Zeichen. 000148 bedeutet, dass die Software die Version 00.01.48 besitzt.

Befehl xx07
>>> Ausgabe ASCII 1 = 0x31. Dieser Befehl kann für einen Kommunikationstest zwischen BMS und Balancer genutzt werden. Der Balancer beantwortet diese Anfrage mit 1, wenn die Verbindung einwandfrei funktioniert.

Befehl xx98
>>> Es erfolgt keine Ausgabe. Die Software im Balancer wird neu gestartet. Dabei wird die Uptime wieder auf Null zurückgesetzt. Hatten Sie gezielt die Lastwiderstände mit Befehl xx00 aus- oder mit xx01 eingeschaltet, dann wird auch diese Zeitspanne gelöscht.

Wird der Balancer mit Spannung versorgt sendet er einmalig die fest einprogrammierte Balancernummer mit einer ASCII Ausgabe von z.B. 03 – für Balancer Nummer 3. Die Balancernummer kann nicht geändert werden. Bei Bedarf können die Controller aber im spannungslosen Zustand umgesteckt werden. Die Balancernummer kann direkt auf der Leiterplatte mit einem wasserfesten Stift notiert werden.

Die Balancer Temperaturmessung des Akkus und der Lastwiderstände kann nicht ohne ein BMS Modul mit Busverbindung genutzt werden. Ein Balancer allein kann auch nicht das Laden unterbrechen oder die angeschlossene Last abwerfen. Der Balancer erkennt und begrenzt eine zu hohe Klemmspannung des Akkus und gibt Spannungs- und die Temperaturinformationen an das BMS weiter. Am BMS sind kleinere Steuerrelais, die über hochbelastbare Halbleiterrelais SSR-Relais das Laden oder Entladen unterbrechen können.

Da der Balancer über den Bus komplett fernsteuerbar ist, können sehr leicht eigene Besonderheiten und Wünsche realisiert werden. Es ist denkbar, dass Ihre eigene BMS Steuerung die Spannungen und Temperaturen der Zellen über den Bus abruft und dann nach eignen Vorgaben das Laden und Entladen steuert. Wer also schon bei 3,5 Volt das Balancieren aktivieren möchte kann das durch Lesen der Spannung und gezieltes Einschalten der Lastwiderstände über den Befehl xx01 machen.

Download der Schaltung vom Balancer V2 als PDF (50 Kb)
Download der Bestückung vom Balancer V2 als PDF (151 Kb)

Je nach Verfügbarkeit kann ich Ihren Nachbau mit Leerplatinen oder komplett bestückte Leiterplatten unterstützen. Bitte per Mail anfragen. 

Technische Daten:
Balancerstrom mit 3 bestückten 2,7 Ohm Widerständen = 4 A
Stromverbrauch < 2mA
Balancer Leiterplatte 80 x 31mm (Bohrloch LiFePo4 Akku 10,5mm)

Aufbau meines LiFePo4 Akkupacks mit 8 x 2P Winston Zellen 16 x 160Ah. Gesamtkapazität etwa 8 kWh.

  • 8 Zellen werden parallel geschaltet und auf exakt 3,60 Volt mit meinem Einzelzellenlader bei 10 A Ladestrom geladen. Das dauerte zwei mal 3-4 Tage, da ich ja 16 Zellen verwenden werde. Mit meinem BMS Controller ohne bestückte Lastwiderstände konnte ich über die Webseite des BMS bequem die aktuelle Spannung der Zellen in der Garage ablesen.
  • alle Zellenanschlüsse werden vor dem Verschrauben mit feinem Schleifpapier gesäubert und anschließend mit dem Antioxidationsmittel Noalox eingestrichen. Auch die Schrauben sollen leicht eingestrichen werden. So erhält man eine dauerhaft erstklassige elektrische Verbindung.
  • Mit Kanthölzern und einem Schweerlast-Möbel-Roller habe ich mir einen schmalen Akkuwagen mit zwei Etagen gebaut.
  • Es werden immer zwei Zellen parallel geschaltet und dann je ein selbstgebauter Balancer montiert.
  • Die 8 Akkuzellen sind auf beiden Etagen mit langen M10 Gewindebolzen und an den Enden mit 3mm Stahlplatten (250 x 150 mm) leicht verspannt.
  • Ein kurzes 25 mm² Kabel verbindet die Akkupacks der beiden Etagen.
  • Am Ende wird noch die Busverbindung (Flachbandkabel) von Balancer zu Balancer gesteckt und an den BMS Controller angeschlossen.
  • In den kommenden Tagen werde ich den Akku noch mit Platten verkleiden.

Echtzeitwerte von meinem Akkupack. Der BMS Controller kann die Spannungsdaten an die Cloud von Thingspeak (kostenfrei) senden. Aus den Daten kann man dann schöne aussagekräftige Graphen mit Mathlab erstellen. Die Zeitachsen der drei Diagramme muss ich noch korrekt beschriften.

Details des Spannungsverlaufs aller 8 Zellen von heute als Vollbild. Sollten die Graphen nicht komplett zu sehen sein, dann einfach noch mal in einigen Minuten die Seite neu laden.