Batteriemanagement-System (BMS) mit Arduino selbst bauen

  • Ich wollte noch ein weiteres Detail meines Insel-Solar-Konzepts erläutern: Das Batteriemanagement-System für LiIonen-Akkupacks.


    Ich verwende eine fertiges und billiges BMS-Platinchen für 25A und Balancing und Protection eines 3s Akkupacks. Diese Platinen gibt es auch für 4s.

    Eigentlich soweit in Ordnung, allerdings stört es mich, dass man nurgendwo die Spannungen der einzelnen Packs (3 bis 4V) mitloggen kann. Mit dem Multimeter kann man die ab und zu messen, aber das ist mir nicht genug.


    Nun habe ich lange Ausschau nach einem Cell-Meter gehalten, welches man per Serielle Schnittstelle auch auslesen kann. Es gibt zwar Power-Analyzer, die bis zu 6 oder 7 Zellen messen und auf einem kleinen Display anzeigen können, manche piepen sogar, wenn eine Spannung zu weit von den anderen entfernt ist, aber keine hatte eine Schnittstelle zum Auslesen der Daten. Es gibt zwar teure Profi-Lösungen (Batrium), aber das erscheit mit für meine Test-Anlage Overkill.


    Wiemisst man also Potentialfrei Spannungen (von in Serie geschalteten Batteriezellen), ohne Auf dauer Strom aus den Batterien zu ziehen?


    * Spannungsteiler kommt zwar bei 3s oder 4s noch in Frage, zieht aber dauerhaft etwas Strom und man muss eine gemeinsame Masse für das Batteriepack schaffen.

    * Einzelmessung mit vielen Microcontrollern, welche jeweils von "ihrem" Batteriepack gespeist werden und die Daten dann über einen galvanisch isolierten Link an eine Zentrale schicken, scheidet wegen des hohen Stromverbrauchs aus.
    * Man könnte noch eine Elektronik-Schaltung für dedizierte BMS-CHips (Infinion etc...) entwickeln, das ist aber AUfwendig.


    Letztlich denke ich, man könnte eine Messung per Schaltung mit "fliegendem Kondensator" und einigen Relais aufbauen. Das wollte ich hier mal vorstellen. Nehme aber gerne noch andere Ideen entgegen (Materialkosten bitte <50EURO).


    Man benötigt, um Spannung von 3 Zellen zu messen, 3 Relais (2xWechsel), sowie einen Kondensator, einen Widerstand und einen Arduino mit 3 Digitalen Ausgängen und einem Analogen Eingang, und der Seriellen Schnittstelle (ttyUSB). Bei 4 Zellen braucht man 4 solche Doppelwechsler-Relais und bei n Zellen genau (1+(n-1)), also n Relais. Es wird für die Messung kein Strom aus den Batteriepacks entnommen.


    R1 und C1 bestimmen die Zeitkonstante für eine Messung, und wieviel Ladung jeweils einem Batteriepack entnommen wird.

    R2 = 1kOhm

    R3 sind nur Kurzschluss-Angst-Widerstände, für den fall, dass ein Relais intern kaputt geht. Sollten etwas 10 mal kleiner sein als R1


    Ein Balancing ist mit dieser Schaltung im Prinzip auch möglich, wenn C1 gross und R2 klein sind. Mir geht es aber hauptsächlich um die Messung der Spannungen.


    Eine Messung geht dann so:

    Es wird erst die Kombination Relais 2 und drei auf die Richtige Zelle eingestellt, es sind hier vier Stellungen möglich, eine davon hat aber keinen Effekt.

    Dann wird Relais 1 für eine bestimmte Zeit vom ADC weg auf die Messung geschaltet, dabei laed sich der Kondensator auf die Zellenspannung auf (oder ab). Dann wird Relais 1 auf den ADC geschaltet, dieser misst nun die Zellenspannung (hochohmig). Wir nun pause gemacht, entläd sich C1 langsam, wenn gleich eine andere Zelle gemessen wird, bleibt C1 im wesendlichen Aufgeladen, so dass nicht mal Ladung von der nächsten Zelle abtransportiert wird, wenn sie dieselbe Spannung besitzt. Hat sie eine unterschiedliche Spannung, dann wird vom Kondensator eine winzige Menge in oder aus der Zelle transportiert. Nach einer längeren Pause sollte man mit einer zufällig ausgewählten Zelle beginnen (am Anfang ist der Kondensator entladen, und es wird etwas mehr Ladung aus der ersten Zelle gezogen). Diese Ladungsmengen sind allerdings winzig bei kleinem C1 und grossem R1.


    Die Zeitkonstante ergibt sich aus dem Produkt R1 mal C1.

    Man sollte ca 3 Zeitkonstanten abwarten, dann ist der Kondensator auf ca. 95% aufgeladen.


    Also T=100kOhm * 100 Mikrofarad = 10 Sekunden, oder

    T=100kOhm * 1 Mikrofarad = 0.1 Sekunden


    R1=100kOhm

    R3=10kOhm

    C1=1 Mikrofarad

    Messzeit 0.5 Sekunden.


    Der ADC des Arduino hat ca 100MOhm Einganzs-Widerstand, die Ladung im C1 bleibt dann also mehrere Minuten erhalten und kann gemessen werden.

  • Hast dir schon mal den Verlust am spannungsteiler ausgerechnet. Wie du schon geschrieben hast 100Mohm am eingang.. Das verträgt eien dementsprechend großen teiler

  • Ja, aber ein Spannungsteiler hat auch folgende Nachteile:


    * Man muß eine gemeinsame Masse verbinden, also Minus-Pol der untersten Batterie mit GND vom Mess-Equipment. Das verträgt sich nicht, wenn die Batterie z.B. ein Protection system hat, was einen Pol hochohmig schalten kann, oder wenn ein zusaetzlicher Balancer verbaut ist Damit fängt die Masse an zu floaten, je nach Strom, der gerade fliesst.


    * Je nach Widerstandsteilertoleranz, sind die Spannungen, welche gemessen werden, leicht unterschiedlich (was man natürlich durch eine Kalibration verbessern könnte).


    * Aus der untersten Batterie (ohne Spannungsteiler) wird kein Strom entnommen (100MOhm), aus den anderen Abzweigungen schon (ist zwar nur mikroampere, aber über viele Tage entläd sich der Akku).


    * Man muß, um die Spannung der einzelnen Zellen zu bestimmen, zwei ADC-Messwerte voneinander abziehen. Hierbei sinkt die Genauigkeit.


    * Das Ganze ist nicht so einfach erweiterbar auf 4s, 5s, n*s. Wenn man z.B. 14 Packs in Serie messen möchte, dann muss man die Gesamtspannung (56V) schon 13:1 runterteilen.


    Er würde wahrscheinlich gehen, aber der erste Punkt mit der gemeinsamen Masse stört mich daran, außerdem der, wenn auch noch so kleine, Dauerstrom. In einer Anlage in der aus dem Akku oder in den Akku nur moderat Strom fließt, muß man die Spannung nicht so oft messen. EInmal pro 5 Minuten würde völlig reichen. Wenn man schneller messen muß, dann ist das mit den Relais natürlich nix. Hat jemand eine Idee, wir man auf Relais verzichten kann, aber ohne eine gemeinsame Masse mit der Batterie herstellen zu müssen?

  • Für mich persönlich viel zu kompliziert für sowas einfaches was du hier baust. Ich hab hier schon genug zellüberwachungen für 48v einzelzellen systeme gesehen.. 24 zellen und eine Basis masse.. bei 4 zellen machst dir sorgen wegen der genauigkeit bei 4fach spannungsteiler? Schießt du das ding auf den Mond für 4 stellen hinter dem Komma? ;)


    Natürlich entläd ein BMS das system über monate.. Aber die frage willst es lagern oder nutzen? Das is ja bei allen bms so.. Dein loging und co hängt auch an der Batterie.. Alles braucht strom


    Dann nimmst halt einen hochauflösenden adc pro einheit und hängst ein gav. Datentrenner zwischen. relais sind wohl das letzte was man für sowas nimmt.

  • @petzibaer: ich hab die Relaisschaltung schnell aufgebaut, und sie funktioniert. Das ist nicht das Problem. Etwas unschön ist der Stromverbrauch jedes Relais von ca 50mA@5V, wenn es angezogen ist. Die Schaltung muss dann (3x Relais plus Arduino) also ca 200mA ziehen können, bei 14 Relais wird das schon ein Problem. Die Galvanische Trennung des Akkus ist aber schon ein Vorteil.


    @emphopa: DG412, danke, kannte ich noch nicht. Sieht gut aus. Allerdings wird der Akkupack über irgendeinen Weg (DC/DC-Wandler) mit dem Arduino-GND verbunden sein. Wie genau, das soll gar keine Rolle spielen. In der Vergangenheit hatte ich schon Probleme mit Masseschleifen und Potentialunterschiedenen bei verwendung von Spannungsteilern. Das will ich unbedingt vermeiden. Aber kann der DG412 nicht auch anders beschaltet werden, so dass er meine Doppelrelais einfach ersetzt? Wie hoch ist die Spannungsfetigkeit?


    Ach so, nochwas zu Deiner Schaltung: Beim Einschalten des Arduino nehmen die Ausgänge ggf. undefinierte Schaltzustaende ein. Dabei soll alles sicher sein und keine Zelle versehentlich kurzgeschlossen werden. Ich weiss, der 4k7 Widerstand verhindert das Schlimmste, aber schön waere das nicht, denn es kann ja auch dauerhaft unentdeckt bleiben (Arduino hängt sich auf). Aber einfacher ist es so.... Hm...

  • Mit DG413 könnte man Umschalter realisieren. Pro Chip kann man dann ein Doppelrelais ersetzen. Das Konzept mit dem Fying Capacitor sollte trotzdem funktionieren.

  • Ihr solltet mal über PhotoMOS nachdenken. Wir haben eine Zelleinzelspannungsmessung an µC damit realisiert. 2xPhotoMOS pro Zelle...

    Arduino aus = aus= kein Problem. Verschleissfrei,...

    Läuft in unseren Batteriesystemen seit 2011 im 24 / 7 Betrieb.


    Alternativ habe ich Privat einen OZ890 in Betrieb. Der kann 13s und wird über I²C an einen Arduino gekoppelt.

    Sonnige Grüße


    Das EVA-LOG Supportteam


    13,9 kWp PV / 7,8 kWh Speicher / Elektroauto / Wärmepumpe.


    Herstellerunabhängiges Datenlogging mit Speicherwirkungsgradanalyse: EVA-LOG flex (http://www.eva-log.de)

    Kein Support per Forum-PN. Wir haben eine Hotline.