Karlsolar (de)

Zusammenfassung

Ursprünglich ab Mitte 2022 geplant als Selbstbau-OpenSource-BMS für kleine PV-Inselanlagen in Mietwohnungen auf 48V-Basis.
Die Inbetriebnahme der Hardware ist erfolgt, kleinere Fehler wurden ausgemerzt (und die hier hochgeladenen Daten korrigiert), die grundlegende EMV (mit Hausmitteln) überprüft.
Karlsolar besteht aus mehreren Einzelprojekten:

Lizenz

CERN-OHL-S 2.0

Übersicht

Folgendes Diagramm stellt die Gesamtstruktur dar, so wie sie für Karlsolar angedacht war/ist:

Software

Eine Software für den BMM, die weit über das Testen der Hardware hinausgehende Funktionen bietet, ist aktuell nicht vorhanden. Allerdings kann der BMM mittels Micropython bereits alle Teile des BMFEs steuern, alle Daten auslesen und auf Sinnhaftigkeit prüfen. Es fehlt hier u.U. eine bessere Architektur, Geschwindigkeitsoptimierungen, Schätzung des Ladezustands und Logging.

Battery module front-end (BMFE)

Elektronik zur Erfassung aller Daten eines 16-Zell LiFePO4-Batterimoduls (<60V). Für den ersten Versuch wurden 50A Dauerentladestrom (75Apk/10s innerhalb 60s) und 25A Dauerladestrom (40Apk/10s innerhalb 60s) an 16x EVE LF105 angenommen. Dies stellte sich als sehr konservativ heraus – die Verringerung des Shuntwiderstands, so wie die Bestückung aller MOSFETs, wird problemlos eine höhere Leistungsfähigkeit ermöglichen. Kühlung (passiver Kühlkörper oder aktive Kühlung) sollte erneut eine deutliche Leistungssteigerung erlauben.

  • Das BMFE ist derart konzipiert, dass keine Software auf dem Batteriemodul läuft. Damit wird vermieden, dass sich sicherheitsrelevante Fehler an mehreren Stellen in der Softwareentwicklung einschleichen sein können.
  • Für wichtige Schaltungsteile stehen Hardware Diagnosen zu Verfügung stehen (teils in diskreter Hardware, teils im Analg-Front-End (AFE, ADBMS1818ASWZ) enthalten).
  • Kommunikation erfolgt über isoSPI mit 1MBaud, oder, während getunnelter I2C-Kommunikation, 800kBaud.
  • Für die Strommessung stehen zwei Messbereichen mit je 16 Bit zur Verfügung (über TSC214 und TSZ124IYPT). Bei dem aktuelle vorgesehenem Shunt (300µΩ) entspricht die Skalierung -100..+66.7A (IHigh) und -10..+6.67A (ILow). Negative Werte sind als Entladen, positive Werte als Laden vorgesehen, sodass eine einfache Summe über Zeit (theoretisch) den SOC ergäbe.
  • Externe Kurzschlüsse (mind. 200nH, max. 5kA) werde ohne Softwareintervention mittels Analogkomparator (NCV2252SQ2T2G) abgefangen. Dessen Auslösung wird in einem Flip-Flop (aus 74AHC00PW) gespeichert. Die MOSFETs (8-12x IPT012N08N5) sind Avalange-gerated, sodass keine zusätzlichen Freilaufdioden für den Abschaltfall notwendig sind.
  • Der Gate-Treiber (UCC5304DWV) wird über einen Fly-Buck (MAX17552AUB) sowohl galvanisch getrennt mit 10V versorgt als auch gesteuert. Auf diese Weise kann eine erzwungene Aufladung des Batteriemoduls durch deutlich höhere externe Spannung zuverlässig verhindert werden. Ein ebenfalls isoliertes Power-Good-Signal ist vorhanden (TLV431AQFTA über ACPL-217-56CE).
    Für den AFE werden mittels Linearregler (TPS7A2450DBVR) 5V VReg erzeugt.
  • Für jede Zelle gibt es einen eigenen Temperatursensoren (angeschlossen über die CVTT-M4-Platine). Des weiteren verfügt der Shunt sowie alle Schraubterminals (PCB-5, M5) über Temperaturmessungen (als Überwachung auf sich verschlechternde Verbindungen).
  • Der Balancingstrom beträgt ca. 200mA/3.6V.
  • Die Vorladung des externen DC-Zwischenkreises wird über eine geschaltete Konstantstromquelle (>350mA, kurzschlussfest) vorgenommen, die Zwischenkreise bis mehrere Millifarad problemlos und recht schnell vorladen kann (<900mV Differenz).
  • Eine möglicherweise nötige Kühlung kann galvanisch isoliert vollflächig über die Unterseite der einseitig bestückten Platine erfolgen. Falls eine aktive Kühlung notwendig ist steht zu diesem Zweck ein Lüfterausgang zur Verfügung (12V, 400mA, LM5169).
  • Um die Anzahl der GPIOs des AFEs auf die benötigte Anzahl zu erhöhen werden ein I2C IO-Expander (TCA9539PWR) sowie vier 8-zu-1 Analogmuxe (SN74LV4051APWR) verwendet.
  • Ein I2C EEPROM (M24C08-DRDW) ist vorgesehen um darin z.B. Modell, Seriennummer (in verriegelbarer Speicherseite) sowie Kalibrierdaten als auch Energieumsatz über Lebenszeit, Kurzschlussabschaltungen in der Vergangenheit und ähnliches speichern zu können.
  • Es ist ein geschalteter Aux-Ausgang für externen Zugang zur Batteriespannung, an den Haupt-MOSFETs vorbei, vorhanden (max. 420mA). Hiermit könnte z.B. der BMM bei nicht leitenden MOSFETs versorgt werden. Dieser Ausgang kann manuell einmalig in Hardware aktiviert werden und dann über eine GPIO zur Selbsthaltung übergehen.

Bilder

TODO: Bilder auf Kühlkörper

Downloads

Version: 0.1.2 (2025-07-24)
Schaltplan
Simulationen (LTSpice, Python)
Erstinbetriebnahmedokumentation (0.1.0)
KiCad-Projekt
Produktionsdaten

Cell voltage/temperature tap (CVTT-M4)

Die Aluminiumplatine soll zwischen Schraube und Busbar montiert werden um sowohl Spannungsabgriff als auch Temperaturmessung je Zelle zu erlauben. Es ist möglich R1 durch z.B. 1Ω zu ersetzten um eine einfacher Sicherungsfunktion zu ermöglichen – dieser Widerstand ist hier allerdings bereits auf dem BMFE vorhanden. Er wird dort genutzt um eine Diagnose des Balancingstroms zu ermöglichen.

Bilder

Downloads

Version: 0.1.2 (2025-07-29)
Schaltplan
KiCad-Projekt
Produktionsdaten

Battery module manager (BMM)

Um nur eine einzige Software in einen System (aus mehreren Batteriemodulen) zu benötigen implementiert der BMM sowohl die „master“ als auch die „slave“-Logik. Zur Kommunikation mit den AFEs auf den BMFEs stehen zwei isoSPI-Transceiver (LTC6820IMS; vorwärts/rückwärts) zur Verfügung. Weitere Kommunikationsschnitterstellen wäre das Bluetooth und WiFi eines RaspberryPi Pico 2 W, eine galv. isolierte RS-485 Schnittstelle (ISOW1412BDFMR), 4x galv. isolierte UARTs (ISO6721QDWVRQ1; müssen über PIO erzeugt werden) sowie jeweils 4x optisch isolierte Digitalein- und -ausgänge (ACPL-217-56CE). Die UARTs sind gedacht um insb. ve.direct-Geräten wir einem PV-Laderegler oder einem Wechselrichter zu kommunizieren.
Auf dem Board befinden sich zwei EEPROMs: 8kBit als Konfigurationsspeicher (M24C08-DRDW), 1MBit als Datenspeicher (CAV24M01YE-GT3). Die Konfiguration kann nur verändert werden, wenn über einen kleinen Schiebeschalter das Write-Control-Signal auf „low“ gesetzt wird. Wenn die Software so erstellt wird, dass eine Konfiguration nur geladen werden kann, wenn diese auf dem EEPROM gelesen wird (oder aus Standardwerten besteht) schützt dies gegen unautorisierte Änderungen aus der Ferne, als eine Art Hardware-Authentifikation.
Ein Taste erlaubt, wenn die Eine Applikationssoftware irgendwann vorhanden wäre, das Zuschalten oder Freischalten, sowie das Quittieren eines Fehlers. Dies sollte immer auch ohne App möglich sein. Des weiteren befindet sich ein Piezo-Piepser (PKLCS1212E20A0-R1) für Hinweise an den Benutzer auf dem Board.

Software

Die Inbetriebnahmesoftware ist in Micropython geschrieben, unter Verwendung von asyncio. Letzteres ist insb. hilfreich um die Kommunikation mit I2C-Komponenten, getunnelt durch das isoSPI-Protokoll, ordentlichen. In Kürze: Der BMM stellt ein BMM-Request an die instantiierten Batteriemodule (z.B. Init). Die Batteriemodule erzeugen daraus interne, durch andere Teilnehmer nicht unterbrechbare, isoSPI-Transaktionen, die durch den isoSPI-Controller ausgeführt werden. Diese Architektur stellt sicher, dass unterschiedliche Batteriemodule, die nichts voneinander wissen (müssen), möglichst unabhängig agieren können. Selbstverständlich ist es hilfreich, wenn es identische Module sind. Auf diese Weise können die Module, welche die aktuelle isoSPI-Transaktion nicht „anführen“, sondern lediglich folgen und Daten für die Schreib-/Lesevorgänge zur Verfügung stellen, die Buszeit ebenfalls genauso sinnvoll nutzen. Wenn das eine isoSPI-Transaktion führende Batteriemodul diese beenden will in ein anderes Modul diese verlängern möchte, beispielsweise I2C-Bus-Interaktionen, so übernimmt letzteres bis zum Ende der isoSPI-Transaktion die Führerschaft. Bei mehreren gleichzeitigen Anforderungen an isoSPI-Transaktionen an den isoSPI-Buscontroller wird nach Round-Robin-Verfahren das nächste führende Modul ausgewählt.
Während alle Hardware des BMFEs angesprochen werden kann, alle Daten gemessen und auch auf Sinnhaftigkeit vergleichen werden, alle diskreten Diagnosen funktionieren, die Zwischenkreisvorladung und auch das Zuschalten der Haupt-MOSFETS funktioniert… fehlt aktuell die eigentliche, richtige Applikationsfirmware. Diese sollte mindestens Daten nach außen geben können, z.B. über MQTT, Energieumsätze erheben und Logdaten schreiben.
Der durch die Flexibilität des isoSPI-Transaktionen erzeugte Overhead (viele Kontextwechsel) ist nicht unerheblich und beeinträchtigt – in der aktuellen Micropython-Implementierung – die Performance erheblich. Ein RaspberryPi Pico 2 ist mit einem einzigen Batteriemodul bereits gut ausgelastet, wenn auch nicht überlastet. Es wäre daher einen Gedanken wert evtl. das Verfahren in C mit entsprechend leichtgewichtigerem RTOS zu portieren.

Bilder

Downloads

Version: 0.1.1 (2025-07-31)
Schaltplan
Erstinbetriebnahmedokumentation (0.1.0)
KiCad-Projekt
Produktionsdaten
Software (Micropython, 2025-07-23)
isoSPI-Kommunikationsfluss (2024-07-24)

Stromversorgung 48/5V 3A galv. isol. (PS-48-i5/3)

Ein kompakter, galvanisch isolierter Sperrwandler für 30..60V auf 5V/3A um den LT8304 und einen 6:1 Würth-Trafo (750315125) herum gebaut. Der Controller regelt die Ausgangsspannung primärseitig über die Messung der reflektierten Spannung. Aus diesem Grund ist eine Mindestlast nötig, die im standardmäßig über die Power-LED sichergestellt wird.

Die Idee ist, den BMM aus einem Batteriemodul-Aux-Ausgang mit guter Effizienz, also ohne Umweg über Netzspannung, versorgen zu können. Zusätzlich kann dieses Netzteil als universelles 15W USB-Ladegerät für Niederspannung genutzt werden (oder 10W/2A bei 20V Eingangsspannung).

  • Die gemessene Ausgangsspannung liegt im Bereich 5.22..4.93V bei 100mA..3A Ausgangsstrom und 30V Eingangsspannung. Bei höheren Eingangsspannungen ist die Regelung tendenziell besser. Daten zur Effizienz finden sich in der Erstinbetriebnahmedokumentation.
  • Ausgänge: Klemme, USB-A (bis 2A; USB Dedicated Charging Port (DCP) controller: TPS2514DBVR) und USB-C (RP: 10kΩ für bis zu 3A).
  • Die Leerlaufstromaufnahme beträgt rund 2,7mA bei 48V (130mW). Dies enthält die ausgangsseitige Power-LED, welche mit ihren 15mA gleichzeitig als Grundlast (80mW/5.2V) dient. Wenn der Jumper JP2 durchtrennt wird, kann die Effizienz bei leichten Lasten deutlich verbessert werden – sofern eine angeschlossene Last des Ausgangs die Grundlast sicherstellt. (Achtung: Fehlt diese steigt die Ausgangsspannung bis die Ausgangselkos kapitulieren)

Bilder

Downloads

Version: 0.1.1 (2025-07-29)
Schaltplan
Simulationen (LTSpice)
Erstinbetriebnahmedokumentation (0.1.0)
KiCad-Projekt
Produktionsdaten

Capacitor bank 25x18mm, 60V (CPBNK-25×18-60)

Radiale Elektrolytkondensatoren bis zu einem Gehäusedurchmesser von 18mm können hier schnell und ohne viel Bastellei zu einer Kondensatorbank zusammen geschaltet werden. Beispiele wären 25x Chemi-Con EKY-B630ELL102ML25S für 25mF oder 25x Nichicon UPW1J222MHD für 55mF.
Die Kondensatorbank wird über eine 15mA Konstantstromquelle mit LED dauerhaft entladen. Von 60V ausgehend dauert dies 2:50 (25mF) bis 6:15 (55mF). Unterhalb der Vorwärtsspannung der LED wird über Widerstände die letzte Energie in Wärme umgesetzt.

Bilder

Downloads

Version: 0.1.1 (2025-07-29)
Schaltplan
Simulation (LTSpice)
KiCad-Projekt
Produktionsdaten

Cell voltage temperature current simulator
(CVTCS-C und CVTCS-P)

Bestehend aus zwei Projekten: dem Steuerungsteil (CVTCS-C) sowie dem Leistungsteil (CVTCS-P). In Kombination können somit alle nötigen Spannungen, z.B. durch Spannungen abgebildete Strom- und Temperaturmessungen, erzeugt werden, um das BMFE und den BMM in Betrieb zu nehmen. Während Zellspannungen und -temperaturen mit jeweils einem Stecker direkt vom Leistungsteil abgegriffen werden, ist die Verbindung des Steuerungsteils zum BMFE etwas aufwendiger: Für z.B. die am Shuntwiderstand (für die Strommessung) abfallende Spannung ist selbstverständlich keine Verbinder vorgesehen, sodass hier die Messabgriffe an einem BMFE unterbrochen werden müssten.

Der Steuerungsteil steuert (mittels Raspberry Pi Pico) die gewünschten Größen (Spannungen, Strom und Temperatur) über 16-Bit DACs (DAC60508MRTE) und wertet Messwerte des Leistungsteils (Strom, Spannung, Temperatur) über einen externen ADC mit interner Referenz (ADS1118IRUG) und 4x SPDT-MUX (TMUX1574PWR) aus. Die Ansteuerung ist über einen Sperrwandler (LT8403) und Digitalisolatoren (ISO6761DWR, ISO6731FDWR) vollständig galvanisch vom Leistungsteil getrennt, wird aber von dort versorgt. Es ist ein EEPROM (M24C08-DRDW) vorhanden um Konfigurationsdaten zu speichern. Als Erweiterungsmöglichkeit für Digitalsignale stehen jeweils zwei optisch getrennte Ein- und Ausgänge zur Verfügung.
Um die anfallende Abwärme besser abzuführen kann ein Lüfter über einen Tiefsetzsteller (LM5169PDDAR) in zwei Geschwindigkeitsstufen angesteuert werden.

Der Leistungsteil (CVTCS-P) wird auf einen Kühlkörper montiert (auf 200mm gekürzter 125379 von Wakefield-Vette) und trägt den Steuerungsteil. Er enthält die Shuntregler (NCV333AS mit Darlingtontransistor-Ausgang) für die gestapelten Zellspannungen sowie die Temperaturausgänge (NCV333AS mit Kompensation). Die Zellspannungen (1.8..4.6V) werden auf ihren jeweiligen Potentialen mittels Stromsenken, ausgehend vom Bat-Potential, gesteuert.
Wichtig: Der Leistungsteil muss immer durch einen strombegrenztes Netzteil <1A/<80V versorgt werden. Wenn man die Zellen mit beispielsweise mit max. 200mA balancieren möchte wären 300mA ein geeigneter Querstrom. Ein Übertemperaturschutz kann auf dem Steuerungsteil in Software implementiert werden – drei Temperatursensoren sind vorhanden. Ohne eine Möglichkeit das eigentliche Netzteil zu steuern, wäre die sicherste Möglichkeit die Zellspannung auf das abs. Minimum zu reduzieren.

Software

Die Software für den Steuerungsteil besteht aus einem Satz Micropython Klassen, die in der Lage alle vorhandenen Bauteile (meines Wissens) korrekt und vollständig anzusteuern. Es besteht allerdings leider aktuell keine echte API oder interaktiver Modus um Dinge zur Laufzeit an zu passen.
Mittels asyncio könnte vieles relativ einfach ermöglicht werden (z.B. Hintergrundüberwachung der Temperatur, Steuerung des Lüfters etc.).

Bilder

Die deutlichen Unterschiede zwischen Rendering und Fotos des Steuerungsteils rühren daher, dass die Version 0.2.x deutlich angepasst wurde (werden musste).

Downloads (Steuerungsteil)

Version: 0.2.1 (2025-07-30)
Schaltplan
Simulationen (LTSpice, Python; inkl. Leistungsteil)
Erstinbetriebnahmedokumentation (0.1.1; inkl. Leistungsteil)
KiCad-Projekt
Produktionsdaten
Software (Micropython, 2025-01-18)

Downloads (Leistungsteil)

Version: 0.2.1 (2025-07-29)
Schaltplan
KiCad-Projekt
Produktionsdaten