BMS för upp till 192 st LiFePO4 celler.
Postat: 22 mars 2010, 17:48:33
Det har ju kommit upp lite antydningar i trådar här och där kring detta projekt, men nu tänkte jag att det skulle bli en egen projekttråd.
Jag håller alltså på att utveckla en BMS för seriekopplade Litium-Jon celler till elbilar.
BMS:en ska ha bland annat följande funktioner:
1) kunna logga ström samt alla cellspänningar kontinuerligt.
2) avge larm vid tre olika nivåer av maxspänning samt tre nivåer av minspänning.
3) kunna reglera ner ("shunta") cellspänning som är för hög eller reglera upp för låg spänning (enskilda celler i förhållande till genomsnittet). Reglera "upp" enskild cell gör man genom att alla andra celler "shuntas".
4) loggning av data till lokalt flashminne och / eller direkt via UART till PC.
5) Display och några knappar med meny för hantering av diverse funktioner så som inmatning av larmspänningar, olika "mode" osv. samt visning av ström, SOC (batteripaketes "state of charge", dvs hur mycket laddning som finns för tillfället)
6) loggning av temperaturer för varje enskild cell
med mera...
Jag kommer inte att lämna all info om projektet nu eftersom då hade jag fått sitta och skriva hela dagen. Men det blir en kort sammanfattning till att börja med.
Det hela består av ett processorkort med en ATMega644 som går på 19.88060 MHz i centrum. Denna kommunicerar via en SPI-buss med "moduler" som ansluts till cellerna. SPI-bussen isoleras galvaniskt genom en ADUM1401.
Modulerna består främst av en specialanpassad AD-omvandlare för stackade Litiumceller, Linears LTC6802-1
LTC6802-1 har 12 AD-kanaler för 12 st litiumceller, samt ytterligare två AD -kanaler för t.ex. temperaturmätning eller spänningsreferens. Med hjälp av multiplexrar kan jag via mjukvara välja att läsa av upp till 13 st externa 100k NTC-motstånd samt en spänningsreferens på 4.096 volt.
För att kunna ansluta flera moduler i serie (med 12 cellers spänningspotential mellan varje kort) finns en funktion i LTC6802-1 som kallas "daisy chain". Det är en strömstyrd dataöverföring som klarar en spänningsskillnad på +60 volt utan behov av galvanisk isolering. Dataöverföringen mellan modulerna fungerar då så att processorn skickar och läser data till /från det första kortet. Detta fungerar sedan som en rad med shiftregister som datan slussas igenom för att sedan gå vidare upp till nästa kort osv.
Inlästa cellspänningar representeras av 18 bytes; varje spänning består av 12 bitar (ett värde mellan 0 och 4096) där 1 = 1.5 mV.
Avläsning av data från t.ex. 48 celler sker då genom att , efter att "läs" kommandot skickats på SPI-bussen, shiftas först 18 bytes från första kortet in till processorn följt av ett CRC-byte. (en slags checksumma). sedan läses 19 bytes in från nästkommande modul osv... till sista modulen. Försöker man läsa mer data skickas bara nollor ut efter att sista modulens data shiftats ut.
Här kommer en översikt på systemet:

I vissa elbilar är cellpaketen uppdelade på två gånger 48 celler (totalt 96 celler). För att BMS:en ska kunna fungera på båda paketen samtidigt måste de ha var sin galvaniskt isolerad databuss. Därför finns här "linje1" och "linje2".
Ett separat kort byggdes för uppdelning av SPI-bussen i två linjer. På samma kort finns även två stycken 200A strömsensorer från Allegro med inbyggd isolering. Dessa avläses kontinuerligt av en Attiny461 som integrerar inlästa data till ett medelvärde som skickas vid förfrågan från processorkortet. Integreringen av strömmen sker dels via ett lågpassfilter, dels genom att 250 AD-omvandlingar utförs per sekund och adderas till en summa som sedan divideras med antalet läsningar som gjorts - resultatet blir ett medelvärde. Noggrannheten efter kalibrering blir i mjukvaran ca 1 mA, men själva hallsensorn har större avvikelse än så, dels pga temperatur, men även pga magnetiska förändringar i omgivningen mm. (t.ex. En 8mm rostfri bult med mutter ca 15 mm från sensorn som genomflödas av strömmen magnetiseras vid höga strömmar och påverkar sedan hallsensorn med över 200mA avvikelse i mätvärdet!)
(tar en paus... postar detta och skriver vidare senare...)
-----------------------------------------------------------------------------
Nedan: lite blandade bilder utan någon särskild ordning:

processorn

först tänkte jag använda en 640x480 px grafisk display med en massa avancerad grafisk presentation, men jag lade ner det. Fortfarande finns det en "grafikprocessor" på kortet och en stiftlist för displayen (närmast i bild)

Här syns P-kanals dual MOSFET från Fairchild, SI9934DY som används för att styra shuntningen av cellerna. Runt om syns lågpassfilter , lysdiod som indikerar shuntning samt ett antal zenerdioder som håller spänningarna på rätt nivå om man skulle koppla fel.
Nedan: så här ser det ut när jag provuppkopplat ett antal moduler mot "fejkade" celler.
Processorkortet till höger med ansluten PC som terminal på bordet. På bilden håller jag på att testa en tidig variant av strömsensorn - SPI-signalerna syns på oscilloskopet.

På nästa bild har jag kopplat upp riktiga litiumceller. BMS-en sitter monterad på en skiva ovanpå cellerna. Det blev bara 7 celler i serie eftersom jag bara har ett 30V nätaggregat. Så småningom ska jag kunna ladda upp till 100 volt om jag lyckas bygga ett switchaggregat.

Här en version av displayen: kommunicerar med SPI även den. (länken ger detaljerad beskriving med schema mm)

(klantade ju mig rejält och etsade ett bakvänt kretskort, så för att få igång den var jag tvungen att vända displayen upp-och-ner:

Det har blivit en hel del prototyper: här är första "modulkortet" påbörjat:


NTC-motstånden monterades i änden av en flatkabel och täcktes över med en droppe smältlim. Andra änden på flatkablen sitter i en 26-polig IDC-kontakt:

En tidig variant av strömsensor baserad på max4081 och Attiny461:

en oscilloskopsbild av SPI-bussen:

Just nu använder jag 2-watts shuntmotstånd (10 ohm) , men jag provade också att montera några 9W om det skulle behövas: det blir varmt!

pga. moddning av systemet krävdes ett externt kort som inte bara isolerade modulerna galvaniskt, utan även adresserade de olika databussarna. På kortet finns även Attiny461 som läser av hallsensorerna:

Jag håller alltså på att utveckla en BMS för seriekopplade Litium-Jon celler till elbilar.
BMS:en ska ha bland annat följande funktioner:
1) kunna logga ström samt alla cellspänningar kontinuerligt.
2) avge larm vid tre olika nivåer av maxspänning samt tre nivåer av minspänning.
3) kunna reglera ner ("shunta") cellspänning som är för hög eller reglera upp för låg spänning (enskilda celler i förhållande till genomsnittet). Reglera "upp" enskild cell gör man genom att alla andra celler "shuntas".
4) loggning av data till lokalt flashminne och / eller direkt via UART till PC.
5) Display och några knappar med meny för hantering av diverse funktioner så som inmatning av larmspänningar, olika "mode" osv. samt visning av ström, SOC (batteripaketes "state of charge", dvs hur mycket laddning som finns för tillfället)
6) loggning av temperaturer för varje enskild cell
med mera...
Jag kommer inte att lämna all info om projektet nu eftersom då hade jag fått sitta och skriva hela dagen. Men det blir en kort sammanfattning till att börja med.
Det hela består av ett processorkort med en ATMega644 som går på 19.88060 MHz i centrum. Denna kommunicerar via en SPI-buss med "moduler" som ansluts till cellerna. SPI-bussen isoleras galvaniskt genom en ADUM1401.
Modulerna består främst av en specialanpassad AD-omvandlare för stackade Litiumceller, Linears LTC6802-1
LTC6802-1 har 12 AD-kanaler för 12 st litiumceller, samt ytterligare två AD -kanaler för t.ex. temperaturmätning eller spänningsreferens. Med hjälp av multiplexrar kan jag via mjukvara välja att läsa av upp till 13 st externa 100k NTC-motstånd samt en spänningsreferens på 4.096 volt.
För att kunna ansluta flera moduler i serie (med 12 cellers spänningspotential mellan varje kort) finns en funktion i LTC6802-1 som kallas "daisy chain". Det är en strömstyrd dataöverföring som klarar en spänningsskillnad på +60 volt utan behov av galvanisk isolering. Dataöverföringen mellan modulerna fungerar då så att processorn skickar och läser data till /från det första kortet. Detta fungerar sedan som en rad med shiftregister som datan slussas igenom för att sedan gå vidare upp till nästa kort osv.
Inlästa cellspänningar representeras av 18 bytes; varje spänning består av 12 bitar (ett värde mellan 0 och 4096) där 1 = 1.5 mV.
Avläsning av data från t.ex. 48 celler sker då genom att , efter att "läs" kommandot skickats på SPI-bussen, shiftas först 18 bytes från första kortet in till processorn följt av ett CRC-byte. (en slags checksumma). sedan läses 19 bytes in från nästkommande modul osv... till sista modulen. Försöker man läsa mer data skickas bara nollor ut efter att sista modulens data shiftats ut.
Här kommer en översikt på systemet:

I vissa elbilar är cellpaketen uppdelade på två gånger 48 celler (totalt 96 celler). För att BMS:en ska kunna fungera på båda paketen samtidigt måste de ha var sin galvaniskt isolerad databuss. Därför finns här "linje1" och "linje2".
Ett separat kort byggdes för uppdelning av SPI-bussen i två linjer. På samma kort finns även två stycken 200A strömsensorer från Allegro med inbyggd isolering. Dessa avläses kontinuerligt av en Attiny461 som integrerar inlästa data till ett medelvärde som skickas vid förfrågan från processorkortet. Integreringen av strömmen sker dels via ett lågpassfilter, dels genom att 250 AD-omvandlingar utförs per sekund och adderas till en summa som sedan divideras med antalet läsningar som gjorts - resultatet blir ett medelvärde. Noggrannheten efter kalibrering blir i mjukvaran ca 1 mA, men själva hallsensorn har större avvikelse än så, dels pga temperatur, men även pga magnetiska förändringar i omgivningen mm. (t.ex. En 8mm rostfri bult med mutter ca 15 mm från sensorn som genomflödas av strömmen magnetiseras vid höga strömmar och påverkar sedan hallsensorn med över 200mA avvikelse i mätvärdet!)
(tar en paus... postar detta och skriver vidare senare...)
-----------------------------------------------------------------------------
Nedan: lite blandade bilder utan någon särskild ordning:

processorn

först tänkte jag använda en 640x480 px grafisk display med en massa avancerad grafisk presentation, men jag lade ner det. Fortfarande finns det en "grafikprocessor" på kortet och en stiftlist för displayen (närmast i bild)

Här syns P-kanals dual MOSFET från Fairchild, SI9934DY som används för att styra shuntningen av cellerna. Runt om syns lågpassfilter , lysdiod som indikerar shuntning samt ett antal zenerdioder som håller spänningarna på rätt nivå om man skulle koppla fel.
Nedan: så här ser det ut när jag provuppkopplat ett antal moduler mot "fejkade" celler.
Processorkortet till höger med ansluten PC som terminal på bordet. På bilden håller jag på att testa en tidig variant av strömsensorn - SPI-signalerna syns på oscilloskopet.

På nästa bild har jag kopplat upp riktiga litiumceller. BMS-en sitter monterad på en skiva ovanpå cellerna. Det blev bara 7 celler i serie eftersom jag bara har ett 30V nätaggregat. Så småningom ska jag kunna ladda upp till 100 volt om jag lyckas bygga ett switchaggregat.

Här en version av displayen: kommunicerar med SPI även den. (länken ger detaljerad beskriving med schema mm)

(klantade ju mig rejält och etsade ett bakvänt kretskort, så för att få igång den var jag tvungen att vända displayen upp-och-ner:

Det har blivit en hel del prototyper: här är första "modulkortet" påbörjat:


NTC-motstånden monterades i änden av en flatkabel och täcktes över med en droppe smältlim. Andra änden på flatkablen sitter i en 26-polig IDC-kontakt:

En tidig variant av strömsensor baserad på max4081 och Attiny461:

en oscilloskopsbild av SPI-bussen:

Just nu använder jag 2-watts shuntmotstånd (10 ohm) , men jag provade också att montera några 9W om det skulle behövas: det blir varmt!

pga. moddning av systemet krävdes ett externt kort som inte bara isolerade modulerna galvaniskt, utan även adresserade de olika databussarna. På kortet finns även Attiny461 som läser av hallsensorerna:
