Translate

11 Juni 2010

Weiter gehts mit dem BMS !!!!!!

ganz frisch:

(mal eben in der Mittagspause getippt.................)



Das topaktuelle Bascom-Listing für meine Balancer/Mess/Heiz

Messwandler mit Atmega 48

Das Programm ist noch nicht fertig!

(Die Balancerfunktion läuft so natürlich noch nicht,

aber Messen von vier in Reihe liegenden Zellen funktioniert

schon mal und die PWM-Geschichte ist auch aktiviert.

die AD-Wandler werden zwischendurch bereits ausgelesen,

soweit ists ok! Es fehlt noch der Grenzwert für die Balancer
und zum Aktivieren derHeizfunktion muss das Programm

im Master geändert werden, damit es die 255 sendet

wenn geheizt werden soll..............)



Im Gegensatz zum ATiny 24 hat der Atmega eine "richtige"

serielle Schnittstelle, und die arbeitet selbständig

Die Software -Lösung im Attiny24 brachte Probleme mit sich,

weil während der Übertragung das Programm blockiert war.




$regfile = "m48def.dat"

$crystal = 4000000

$baud = 1200


Config Adc = Single , Prescaler = Auto , Reference = AvccStart Adc

Dim A As Byte

Dim A1 As Integer

Dim B As Byte

Dim B1 As Integer

Dim D As Byte

Dim E As Byte

Dim F As Byte

Dim Bal1 As Word

Dim Bal2 As Word

Dim Bal3 As Word

Dim Bal4 As Word

Dim Pwm1 As Byte

Dim Pwm2 As Byte

Dim Pwm3 As Byte

Dim Pwm4 As Byte

Dim Pwmx As Byte

'Open "coma.7:1200,8,n,1" For Output As #1'Open "comb.2:1200,8,n,1" For Input As #2
'Config Timer2 = Pwm , Pwm = On , Compare A = Clear , Prescale = 1'Config Timer0 = Pwm , Pwm = On , Compare A = Clear , Prescale = 1

Config Timer0 = Pwm , Pwm = On , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1

Config Timer1 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1

Config Portd.5 = Output 'OC0B

Config Portd.6 = Output 'OC0A

Config Portb.1 = Output 'OC1A

Config Portb.2 = Output 'OC1B

Do

D = 0 'eigentlich überflüssig
If F > 0 Then F = F - 1
A = Inkey() 'einlesen des Auslesebefehls

E = A

If E = 255 Then F = 255 'Wert ablegen für Balancer-heizung
A = A - 12 '-12 bei 13 bis 16
If A = 1 Then ' AD-Wandler 1 misst gegen "Masse"A1 = Getadc(1)If A1 > 255 Then A1 = 255

D = A1

Printbin D

End If
If A > 1 And A < a=" 2">
B = A - 1 'hier wird der nächste Eingang als Bezug genommen

A1 = Getadc(a)

B1 = Getadc(b) ' Einlesen von ADC2, 3, 4

A1 = A1 - B1

If A1 < a1 =" 0">
If A1 > 255 Then A1 = 255

D = A1 'umwandlung in ein Byte

Printbin D ' senden des ByteEnd If

Bal1 = Getadc(1)

If Bal1 > Pwmx And Pwm1 < pwm1 =" Pwm1">
If Bal1 <> 0 Then Pwm1 = Pwm1 - 1

If F > Pwm1 Then Pwm1 = F

Ocr0a = Pwm1
Bal2 = Getadc(2)

If Bal2 > Pwmx And Pwm2 < pwm2 =" Pwm2">
If Bal2 <> 0 Then Pwm2 = Pwm2 - 1

If F > Pwm2 Then Pwm2 = F

Ocr0b = Pwm2
Bal3 = Getadc(3)

If Bal3 > Pwmx And Pwm3 < pwm3 =" Pwm3">
If Bal3 <> 0 Then Pwm3 = Pwm3 - 1

If F > Pwm3 Then Pwm3 = F

Ocr1a = Pwm3
Bal4 = Getadc(4)

If Bal4 > Pwmx And Pwm4 < pwm4 =" Pwm4">
If Bal4 <> 0 Then Pwm4 = Pwm4 - 1

If F > Pwm4 Then Pwm4 = F

Ocr1b = Pwm4

Loop

End



Dass die Formatierung den Text verschiebt

ist ärgerlich....sorry!
..........und noch ein Update:
ich hab noch ein bisschen dran gearbeitet.
Die PWM-Augänge arbeiten jetzt auch richtig!
Somit eigentlich auch schon der Balancer!
Die Schwelle ist jetzt einfach mal provisorisch auf
128 (ca 2,5V) gesetzt und am Ausgang hängt eine LED.
beim Kurzschliessen eines Eingangs geht die jeweilige
LED langsam (in ca 1s) aus, und nachher auch wieder
langsam an. So soll es sein!
Wie geht es weiter?
Die große Frage ist: soll die Balancerschwelle fest
eingestellt sein, oder auch über den Master
konfiguriert werden können?
....Die Heizung......
Ich stelle mir das so vor:
Wenn auf heizen geschaltet ist wird die Balancerschwelle
per Befehl auf ca. 2,5 - 3V gestellt wodurch natürlich
die balancer voll durchschalten und kräftig heizen.
(ca 20-25W je Zelle also 10A sollten das dann schon sein!!!!
das ist nicht ohne...................mal sehen..........)
Der Befehl kommt natürlich nur ein mal je
Durchlauf und braucht deshalb auch eine Zeitfunktion.
Die Schwelle muss also wieder auf den korrekten Wert
umschalten sobald der Befehl länger nicht mehr kommt.
Wenn man hier mehrere Werte zur Wahl hätte,
dann könnte man nämlich auch mal "unten balanzieren"
ohne gleich alle Rest-Energie verheizen zu müssen.
Ebenso muss natürlich auch die Temperatur des Kühlkörpers
überwacht werden.
Da muss ich wohl noch ein bisschen spielen...................
Die Anzahl der zur Verfügung stehenden Befehle hängt davon ab,
wieviele Zellen letztendlich verwaltet werden sollen.
Solange ich nur je ein Byte sende sinds 254 Befehle insgesamt.
das ist letztendlich gar nicht sooooviel.
jede Zelle belegt schon mal einen das steht fest
Dann kommts drauf an, was man noch alles wissen will
und wie man es auswertet.
Eine globale Statusabfrage je Messeinheit also ein Atmega,
der vier Zellen überwacht sollte reichen.
Die hat ja wieder 254 (ein Byte) Antwortmöglichkeiten!
Da kann man auch in die acht einzelnen Bit so manches
hineincodieren bzw man erstelllt sich eine Tabelle aus
vorbereiteten Antworten.
Da im Normalfall 40Zellen reichen sollten (ca.144V)
aber im Extremfall auch 192Zellen zumindest als
Option vorgesehen sind wenn normale Drehstrommotoren
mit Frequenzumrichter betrieben werden sollten
werde ich mal die Zahlen 1 - 50 für die Zellen reservieren
und die Zahlen 51-192 so lange es vermeidbar ist nicht nutzen.
Als Statusabfrage sollten dann die Werte 201- 210
bzw bei vollausbau bis 248 dienen. (10 bis 48 Messeinheiten)
Bleiben also noch 193-200 und 211-254
(wenn 255 die heizung einschaltet und Werte wie Bordbatterie,
Motortemperatur, Gesamtspannung und Strom etc. vom Master
direkt gemessen werden......da gibts noch viele Möglichkeiten.......
und wenn man einfach mal nur von max. 40 Zellen ausgeht, dann ist
der Bereich von 41 - 200 und 211-254 nutzbar, das reicht! )
Im Master-Rechner geht mir bekanntlich der Platz im Atmega48
zur Neige, aber da gibts ja noch den Atmega 88 oder 168,
dann kann ich wieder "prassen".
Da ich aber eigentlich mit dem 48er auskommen möchte,
werde ich zunächst nochmal das Menue vereinfachen.
Weniger Text, nur Variablen und nur einmal alles speichern
beim Verlassen, das könnte klappen.
Die Restenergieanzeige will ich als eigenständiges Modul
konzipieren......wieder ein Befehl belegt,
wenn der Master das anzeigen soll
In den Messeinheiten ist noch "platz ohne Ende"
da geht noch sehr viel! es wären auch noch je zwei
Analog-Eingänge und ein PWM-Ausgang frei.
Zur Temperaturmessung pro Viererpack reicht das.
Nachtrag 15.06.2010
Erste Versuche mit dem letzten Stand des Mess und Balazier-
Programms im Atmega sind sehr erfreulich verlaufen.
Messen und balanzieren funktioniert grundsätzlich schon
sehr gut soweit meine unfertige Schaltung das zulässt.
Wie schon früher erwähnt ist die Ansteuerung der Mosfet
das größte Problem.
Wenn man eine vierergruppe für sich alleine betrachtet
dann liegt der Atmega zusammen mit einer der Zellen
auf Masse. Die Zellen sind Verbunden und die Spannungen liegen
irgendwo bei 3,6V, 7,2V, 10,8V und 14,4V.
Der Atmega wird über einen 5V-Regler von der höchsten Zelle
aus versorgt(2-3mA) Die PWM-Ausgänge schalten deshalb
zwischen GND und 5V hin und her.Damit kann ich nur den
Mosfet der an GND liegt direkt ansteuern wenn es ein
N-Kanal Mosfet ist.Für die drei anderen ist das nicht möglich.
Hier kommen P-Kanal Typen zum Einsatz und es ist jeweils noch ein
Treiber-Transistor erforderlich der als "open Collector" die Gates
gegen Gnd zieht. Wieder mal eine etwas ungewöhnliche Schaltung,
aber so gehts! So eine Vierergruppe kommt ohne weitere
Galvanische Trennung aus und darauf kam es mir an.
Nur zwei Optokoppler (einer für RXD, einer für TXD je vier Zellen)
und die Versorgung des Atmega erfolgt aus der Vierergruppe
Der Balancer ist auch ohne Steuerrechner funktionsfähig,
jede Zelle wird einzeln balanziert
und der Steuerrechner kann jederzeit jede einzelne Zelle
abfragen und dann wird ihm der Spannungswert gesendet
Die Genauigkeit liegt bei ca +- 0.04V also im +-2% Bereich.
Das sollte genügen.
Den größten Stromverbrauch haben übrigens die
Eingangsspannungsteiler!
Fehlt nur noch eine Meldeschleife zum Beenden des Ladevorgangs
wenn die erste Zelle voll ist..........

mfG

Franz

Nachtrag 25.07.2010:

Das Sommerloch ist überall........
In den letzten Wochen gabs genug andere Sachen zu erledigen,
so dass mir ganz gewiss nie langweilig war!
Am BMS ist nicht mehr sehr viel passiert abgesehen von einigen Tests,
die durchweg sehr positiv verlaufen sind
Die Balancer arbeiten gut, das sanfte Einschalten per PWM klappt prima,

Noch zu lösen:
Zuverlässiges umschalten der Balancer-Spannungsgrenzen vom Master aus
(bzw soll das überhaupt von da aus gesteuert werden???????)
Meldungsausgabe unabhängig vom Master.

Was soll das?
Ich will, dass mein "Master" also das Display etc. mir die Werte anzeigt.
(Max. Min. Durchschnitt Temperatur Fehler etc)

Ich halte es aber für gefährlich, das ganze Balancersystem vom Master und
der seriellen Verbindung abhängig sein zu lassen.
Das muss eigenständig funktionieren!!!
mit irgendwelchen Schleifen, die bei Unterbrechung Fehler signalisieren.
zumindest der Ladevorgang muss so gesteuert werden.

Ich hatte dieser Tage eine völlig andere Idee, die ich unbedingt
in die Praxis umsetzen möchte.
deshalb gibt es an dieser Stelle eine kleine Unterbrechung,
und mal wieder was ganz anderes zwischendurch!
Bis bald!
Franz







10 Juni 2010

Zur Abwechslung: Lambda-Regelung

Zwischendurch mal ganz was anderes............

weils beim Batteriemanagement vorübergehend
ein wenig hakte (4 x PWM in einem Baustein....)
und weil ich das schon seit langem
machen wollte, habe ich nun endlich meine
Lambda-regelung gebaut.

Als angenehmen Nebeneffekt konnte ich
sogar mein PWM-Problem lösen!
Es geht also auch mit dem Batteriemanagement
demnächst wieder voran.
(Messen klappt schon prima, jetzt kommt noch
die Balanzierfunktion mit in die Messeinheiten
sowie eventuell die Heizung über die
Balancerwiderstände........ das hat anscheinend
noch keiner gemacht bzw. gewagt.............)
Das Ganze ist eher eine Programmierübung,
obs in der Praxis funktioniert wird sich noch
zeigen.

Falls jemand irgendwelche Quelltexte möchte,
Bitte Melden!
leider kann ich das hier schlecht veröffentlichen,
weils die Formatierung nicht verträgt...........
Video / Fotos gibts ein andermal!

mfG
Franz

Herz des Ganzen ist ein Atmega48.
Programmiert mit Bascom.(macht immer mehr Spass!)
Als Display das mittlerweile bewährte EA DIP204-4.
Die Spannung der Lambdasonde wird mit
5V Referenz gemessen.Ich hätte auch die internen
1,1V nehmen können, aber so gehts auch.
Genau genug ist das allemal!
Falls ich noch ein Poti an der Drosselklappe
brauche ists so besser

Die Sonde liefert unter 450mV bei zu magerem
Gemisch und über 550mV bei zu fettem.
Der Bereich dazwischen wird gewissermaßen
übersprungen.
(meine Sonde ist schon sehr alt.......
mehr als 800mV kommen da nicht mehr raus)

Man kann das Signal nicht einfach verstärken
sondern muss einen weiteren Wert langsam
in die jeweilige Richtung nachführen.

Über ein Menue kann man den oberen und unteren
Schaltpunkt einstellen.
ebenso die Verzögerung/Dämpfung beim
Öffnen und Schliessen des Zusatzluftventils.
Ein Kontakt bei Standgas schliesst das Ventil sofort.
(der Leerlauf würde sonst "sägen")
bei aktivem Menue ist ebenso "zu"

Im Display wird angezeigt:
Sondenspannung in mV,
der AD-Wandler-Wert (5V=1023)
ein Pfeil zeigt an, ob zu mager, ok, oder zu fett
Der Zustand des PWM-Ausganges
in % , als Wert 0-255, und als Balkenanzeige

Die Setup-Werte werden natürlich im ERAM
abgelegt und im Menue gibt es noch einen
Time-out wenn man zu lange nichts eingibt.

Wie schon gesagt, eine Programmierübung.
man könnte die Werte noch seriell rausschicken
und eventuell brauche ich noch eine Überwachung
bzw. Berücksichtigung der Drosselklappenstellung
eine Motortemperaturanzeige vielleicht?


bis bald!
Franz