Translate

25 Juli 2010

Drehzahlmesser als Amperemeter



Den Drehzahlmesser als Amperemeter zweckentfremden.

Im Zusammenhang mit Michaels New Beetle Elektroumbau
hatte ich vor ein paar Tagen ganz spontan die Idee,
dass man den vorhandenen Drehzahlmesser doch wunderbar
als Amperemeter nutzen könnte.
Die Drehzahl ist doch eher unwichtig, viel mehr interessiert doch,
ob man bei einem Elektroantrieb den gewünschten Vortrieb
mit dem optimalen Energieverbrauch erreicht.
Da hat man so ein schönes Instrument mit einer Skala
von 1- ca. 6 und die zumessende Stromstärke beträgt
0 bis ca 500A Idealer gehts doch nicht!!!!!!
Die Drehzahlerfassung ist auch aufwändig und
eigentlich ziemlich sinnlos wen interessierts eigentlich?
Es geht hier auch nicht um eine hochpräzise Anzeige,
sonder hauptsächlich darum, zu sehen ob der gerade
eingelegte Gang auch der richtige ist.

Ein Vierzylinder zündet zwei Mal pro Umdrehung.
50Hz = 1500 U/min 100Hz = 3000U/min 166Hz = 5000 U/min

Also bräuchte man nur einen ordentlichen Stromwandler-
.............so was gibts zu kaufen!

....und ein bisschen Elektronik, das daraus die passende Frequenz macht!

??????was nimmt man dazu am sinnvollsten????????

!!!!!!!!!!!! einen ATtiny bzw Atmega!!!!!!!!!!!!!!
( ok, das wird langsam langweilig!!!, ich verspreche auch, demnächst mal wieder
was ganz anderes zu beschreiben, wie wärs mit einem winzigen hydraulischen Widder??)

Die Idee ist noch sehr frisch, aber das sollte sehr einfach zu lösen sein.

Der Stromwandler liefert eine zum Strom proportionale Spannung
(genaue Daten muss ich noch raussuchen)
Die Spannung kann ein ATtiny messen und in eine Zahl umwandeln.
z.B. 0-5V = 0-1024 weil die AD-Wandler mit 10bit arbeiten

Der Timer im ATtiny kann 256 Stufen rauf oder runterzählen und bei
entsprechender Frequenzanpassung (Teiler - Quarz bzw interner Oszillator)
entsprechend einen Ausgang umschalten.

für 0 bis 600A braucht man 0 (1) (10) - 200Hz da ist also noch Spielraum
das lässt sich hintrimmen- selbst 10bis 200Hz würden locker reichen
(Anzeige 300 -6000 U/min also 30 bis 600 A)

Das Programm habe ich mir jetzt noch nicht überlegt,
aber es wird winzig sein.

Variablen festlegen,
Timer konfigurieren,
Geberspannung messen,
Kehrwert der Geberspannung
mit Konstante multiplizieren,
an den Timer geben
.........das wars!

Hardware:
ATtiny 13 bzw 25 (was halt grad rumliegt)
5V-Regler + Elko
Eingangsspannungsteiler (falls Geberspannung >5V)
ev. widerstand + Elko zum Dämpfen des Eingangs
Transistor + Widerstand (nicht bei Mosfet) zum Umsetzen auf 12V
4 Klemmen + kleine Platine

Das sollte eigentlich reichen!

In ein paar Tagen gibt es hier mehr zu dem Thema!

Ob das jetzt eingebaut wird oder nicht ist egal,
aber ich will jetzt wissen ob bzw wie gut das funktioniert.
Ich bin mir sicher, dass es klappt,
wenn nicht mit einem(1) Timer (ATtiny)
dann zumindest mit zwei Timern (Atmega)... mal sehen,
Aber Spannung messen, umrechnen und per PWM ausgeben kann selbst
der kleine ATtiny13 schon zwei Mal gleichzeitig und bis auf eine
andere Timerkonfiguration ist das fast das gleiche Grundprogramm!

Ich wills jetzt wissen,
und drum ziehe ich das jetzt durch!!!!!!

mfG
Franz


29.07.2010 Es funktioniert prima!

Leider hat es mit dem ATtiny nicht geklappt, der 8-bit Timer
ist ganz einfach eine Nummer zu klein.
Damit lässt sich kein ausreichendes Frequenzband abdecken.
Entweder bei 100A anfangen oder oben raus
in 30A Schritten anzeigen. ...Schade!!
Somit ist leider die gesamte ATtiny-Reihe nicht verwendbar- oder doch?
(Anmerkung 02.09.10: ich muss bei Gelegenheit mal versuchen beim Timer
den Prescaler während des Programmablaufs umzukonfigurieren....
wenn das schnell genug möglich ist, dann ginge das auch mit einem
ATiny 13 oder 25....... ich habs aber so noch nicht versucht!)
Aber ein Atmega48 kann das! Mit seinem 16bit-Timer.

Der vorgesehene Stromwandler LEM HASS 200 liefert
um eine Mittellage von 2,5V 0,31V je 100A,
Polarität je nach Stromrichtung
Dieses Signal scheint auf den ersten Blick seltsam,
aber nach einem 10bit-AD-Wandler an 5V Referenz
sind das genau 64 Stufen je 100A.
Das passt perfekt! So kann man theoretisch +- 800A messen.
(Man kann den Bereich nicht vollständig nutzen,aber +-600A
sollte auf alle Fälle gehen)

Der Drehzahlmesser eines Vierzylindermotors
braucht zwei Impulse je Umdrehung
Die Anzeige soll letztlich 100A statt 1000U/min anzeigen,
folglich müssen beginnend ab 2,5V 33Hz je 0,31V generiert werden.
Da die Ausgangsfrequenz mit dem "Toggle pinX " -Befehl erzeugt
wird muss der Timer die doppelte Frequenz liefern.

Wie kann man diese Aufgabe umsetzen?

Die Lösung war letztendlich sehr einfach

Der Timer zählt mit einem festen Takt,
in diesem Fall aufwärts, es ginge aber auch abwärts,
man muss ihm nur sagen, wo er beginnen soll loszuzählen.
bei jedem Überlauf also nach 65535 erfolgt ein Interrupt
und da wird der gewünschte Ausgangspin umgeschaltet

Die Zahl der nötigen Takte ist eine Funktion des
Kehrwertes der Stromstärke.
Das klingt jetzt kompliziert,ist es aber nicht
Am Ende muss nur eine Konstante durch
den Ausgangswert des AD-Wandlers geteilt werden,
schon hat man die Anzahl der Zählschritte des Zählers
für die gewünschte Frequenz.
Man kann nun entweder den Zähler nach 0 zählen lassen
und die Zahl direkt übernehmen oder der Zähler zählt
aufwärts, dann muss man die Zahl der Schritte von
65535 abziehen.
Dann noch verhindern, dass bei 0A durch 0 geteilt
wird, das wars eigentlich schon



Das Programm ist noch nicht
optimiert, aber so läuft das
schon mal recht brauchbar.


...und weils eh schon ein Atmega
geworden ist, habe ich gleich noch
ein Display mit reingepackt.


Das hilft auch beim Anpassen
der Konstanten weil man alle
Zwischenergebnisse gleich mit
angezeigt bekommt.

An diesem Punkt stellte ich fest, dass das Programm
gerade mal 10% des Speichers vom Atmega48
belegt.Deshalb beschloss ich, da gleich noch
einen Energiezähler mit rein zu packen.
Der Strom wird bereits gemessen,
Die Spannung ist problemlos zu messen.
fehlt noch die Zeit!
Es gibt noch zwei Timer
Die Ausgangspins von Timer 0 sind ohnehin
schon für Eingabetasten vorgesehen und belegt,
also bietet der sich als Timer für die Zeit an.
bei den vorgesehenen 4MHz ergibt sich als
"rechengünstiger Wert" eine Frequenz von 15,5Hz
also 15,5 x pro Sekunde die Leistung aus
Strom und Spannung berechnen und die
Ergebnisse addieren und durch die
Zahl der Messungen je Stunde Teilen
(55800 je Stunde) schon hat man
die Wattstunden.Ich habe nicht auf
KWh umgerechnet, weil die Ausgabe
formatierter Zahlen ein gewaltiger
Speicherfresser ist.
Das hebe ich bis zum Schluss auf!
Dann noch ein kleines Menue zum
Eingeben des Startwertes.
Man gibt die Energie vor, die man dem
Akku entnehmen möchte und die Anzeige
zahlt dann runter bis Null.
Das Ganze wird in Wattstunden und %
angezeigt.
....Der Speicher war noch immer nicht voll,
und es gibt noch einen Timer (Timer 2)
umd der kann doch den %-Wert als
PWM-Signal ausgeben; Ausgang OC2B
ist noch frei-Das klappt also!
Das PWM-Signal kann so hingetrimmt
werden, dass es die vorhandene
Tankuhr ansteuert und so die
Restenergie anzeigt.






.........jetzt sind die 4k Flash aber voll!!!
Ich hoffe, noch eine übers Menue
einstellbare Warnung bei ca 25% Rest
unterzubringen.
Es müsste gehen, wenn ich die Anzeige
meiner Zwischenergebnisse entferne
und das Programm noch ein wenig
optimiere.

ein kleines Video des fast fertigen
Messwandlers:
(leider ist das Display kaum lesbar)






....und noch eine kleine Funktionsdemonstration
des derzeitigen Entwicklungsstandes
Der Energiezähler soll ja in mein BMS integriert
werden- also muss er seine Werte auch über die
serielle Schnittstelle an das Master-Display
weitergeben.Das Display des Energiezählers
habe ich nur für dessen konfigurierung
vorgesehen, da muss man selten ran und das
wird wohl irgendwo in der nähe des Stromwandlers
oder beim Ladegerät installiert werden.
Die Übertragung der Werte läuft inzwischen,
aber durch die vielen Interrupts der Timer
und der vielen Berechnungen der Energie
ist die Reaktionszeit schon ziemlich lang.
Das hat halt alles Vorrang vor dem eigentlichen
Programmablauf (Anzeige + serielle Ausgabe)
Es bringt an dieser Stelle wenig, den Takt zu
erhöhen, weil dadurch auch die Timer schneller
laufen würden.Mal sehen, was mir da noch
einfällt.................es müsste schon viel besser
werden, wenn nicht mehr so viel angezeigt
werden würde!













Kleiner Nachtrag:

So sieht das derzeit auf meinem "alten"
Display aus (ATtiny2313, 2k):





Zelle 16 hat 3,39V
Zelle 5 hat mit 3,56V den höchsten
und Zelle 13 mit 2,64V den niedrigsten
Wert, Die Gesamtspannung ist 128V
und die Akkus haben noch 95%
Energie drin.

Im 4 x 20 Display könnte man noch mehr
Info reinpacken, aber macht das
wirklich Sinn?
etwa so: (älteres Foto mit dem
"neuen Programm", Atmega 48 )
Die Durchschnittliche Spannung
ist mir wichtig! auch noch die
12V Bordbatterie.
Aber das wird schon recht viel
für das kleine DIP204 Display






Mal sehen was da noch an Ideen kommt......

Nachtrag 03.12.2010:
Dieses Projekt bekommt gerade eine sehr
interessante Eigendynamik.......
Heutige Autos haben meist keinen klassischen
Drehzahlmesser mehr, fast alle Signale
und Messwerte werden inzwischen in
irgend einem Steuerrechner generiert,
überwacht, ausgewertet und oft auch
aufgezeichnet. Ein ganz extremes Beispiel
bzw der erste bei dem das so richtig
konsequent eingesetzt wurde ist der SMART.
Da geht alles per CAN-Bus......
jedes einzelne Rad wird überwacht, Lenkradstellung,
Querbeschleunigung, Neigungswinkel,
Einspritzmenge, Temperatur, Tankinhalt,
gerade eingelegter Gang....etc... das alles geistert
als Datenpaket ständig über den CAN-Bus!
Wenn man da einen Drehzahlmesser
nachrüsten will, dann kann man den zwar
anstecken, aber er muss erst mal im
Zentralrechner freigeschaltet werden........

Offenbar ist der ganze Drehzahlmesser
nichts anderes als ein kleiner Schrittmotor
mit Zeiger! Mal sehen, ob ich dieses kleine
widerspenstige Teil dazu bewegen kann,
vernünftige Werte anzuzeigen???
Wenns wirklich nur ein Schrittmotor ist,
dann sollte das ziemlich einfach sein!
mal sehen.........Ich werde hier
darüber berichten sobald ich mehr weiß.

Nachtrag 13.12.2010:
JA!!!! Es geht !
Es ist wirklich nur ein kleiner billiger Schrittmotor,
und man kann ihn direkt mit dem Atmega steuern!




$regfile = "m48def.dat"
$crystal = 8000000
$baud = 1200

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Adcin As Integer
Dim Adcstep As Integer
Dim Schrittzahl As Word
Dim Adcin8 As Integer
Dim Steps As Integer
Dim Phase(4) As Byte
Phase(1) = 8
Phase(2) = 2
Phase(3) = 1
Phase(4) = 4
Config Portc = &B00001111

Initl:
If Adcstep < 500 Then Incr Adcstep
Gosub Subsm
Portc = Phase(steps)
Waitms 4
If Adcstep < 500 Then Goto Initl

Inith: 'nach Rechtsanschlag fahren
If Adcstep > 0 Then Decr Adcstep
Gosub Subsm
Portc = Phase(steps)
Waitms 4
If Adcstep > 0 Then Goto Inith

Do
Adcin = Getadc(5)
Adcin = Adcin / 2

If Adcstep < Adcin Then Incr Adcstep
If Adcstep > Adcin Then Decr Adcstep
Gosub Subsm
Waitms 4

Portc = Phase(steps)
Loop

Subsm:
Adcin8 = Adcstep / 4
Adcin8 = Adcin8 * 4
Steps = Adcstep - Adcin8
Steps = Steps + 1
Return
End

.........das wars schon..........

"Verstärkung" und einige Kleinigkeiten müssen noch
angepasst werden, aber das Grundgerüst läuft.
Ich habe inzwischen noch eine etwas verfeinerte
Methode gefunden, die Schrittfolge zu erzeugen,
aber so gehts auch gut,
und diese Idee ist wenigstens von mir selbst.



....und schon wieder eine neue Idee:
erst kürzlich habe ich mich über eine
ganze Schale voll Akkus geärgert,
von denen keiner mehr sagen kann
welcher da noch brauchbar ist.

Das Energiezählerprogramm ließe
sich problemlos als Basis für einen
Akkukapazitätsmesser verwenden.
Einfach einen vollen Akku mit ca 1-2A
entladen und die Energie zählen
bis der Akku eine bestimmte
Spannung unterschreitet.
Dann abschalten und den Wert
im Display anzeigen.
Schon weiss man Bescheid!

Vielleicht bringe ich es noch
unter, Spannug und Entladestrom
einstellbar zu machen..............

es sollten ja auch größere
Akkus getestet werden können.
(vom Handy bis zum Schrauber....)

mal sehen, das mit der Spannung
könnte sogar automatisch gehen!?
Beim Start messen, merken und
irgendwo bei 70 - 80% abschalten....
Da muss ich mal Tabellen studieren
und schauen, wie das definiert ist,
was auf so einem Akku draufsteht!

bis demnächst

Franz

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

16 April 2010

Batterie- Monitor / Management für LIPOs neuer Prozessor,neues Display

So, jetzt wird mit neuer Hardware neu durchgestartet! Der ATtiny 2313 war definitiv viel zu kein. Dafür war das Display zu groß. Um auf brauchbare Einbaumaße und ausreichend Speicher zu kommen habe ich die Teile durch geeignetere ersetzt. Was gibts neues beim Programm bzw. bei der Bedienung? Das Konfigurationsmenue läuft! Ich kann jetzt die Anlage parametrieren ohne den Microprozessor neu programmieren zu müssen. Allerdings ist das Ganze derzeit noch sehr Speicherintensiv. Da muss ich noch dran feilen damit noch weitere Funktionen reinpassen. Hardware: 1. neues Display Statt des alten NO NAME Teils ist jetzt ein EA DIP204 eigesetzt. Die Dinger sind momentan das, was überall verkauft wird. Nur 68 * 26 mm groß und auch preiswert. AAAAAAAber............ der Controller....... Das Teil ist anders als die anderen.... In Bascom muss das Ding etwas anders konfiguriert werden sonst werden die Zeilen und Buchstaben durcheinandergewirbelt. Es war also nicht kaputt, wie ich anfangs dachte. Nur eine Kleinigkeit, aber das sagt einem keiner! Ganze Internetforen behandeln das Thema. Die Lösungen sind viel zu kompliziert! Da brauchen keine Librarys editiert werden! es genügt, das Display mit Config Lcd = 20 * 4a , Chipset = Ks077 (kein Schreibfehler) anstelle von Config Lcd = 20 * 4 zu deklarieren dann läufts! Wäre nur schön gewesen, wenn einem das irgendwer gesagt hätte ! Beruhigend, dass so viele andere auch über dieses Problem gestolpert sind. Na ja, wenns läuft ein super Display! Der Prozessor ist jetzt ein Atmega 48 eine Weiterentwicklung des Atmega 8 allerdings mit 4k Speicher den gibt es aber auch mit 8 oder 16k als 88 bzw 168. Ich will versuchen, mit 4k auszukommen. ( hmmmmm...................) Das ist das, was die "freie" Bascom Version am Programmcode zulässt. Neu am Programm: Es gibt jetzt ein Konfigurationsmenue und die Eistellungen werden im EEprom gespeichert, so dass nach dem Einschalten alles wieder da ist.


Zellenzahl, Oberer und unterer Grenzwert können so eingestellt werden.

Die Funktion ist in Ordnung, aber der Speicherbedarf ist zu groß.

Immerhin läuft es schon mal.Aber allzuviele Zusatzfunktionen kann ich so nicht mehr reinpacken. Ich hab da schon eine Idee, aber die muss erst noch umgesetzt werden.......Abwarten..........

Wichtig ist, dass das Ablegen und Auslesen der Werte in und aus dem EEprom klappt. Das tut es!






Die Tasten müssen mit Interrupts verknüpft werden. immer die selbe Funktion auslösen und dann müssen je nach Menue die jeweiligen Werte ersetzt werden.

Jetzt fehlt hauptsächlich noch die Einbeziehung des Durchschnittswertes, also Gesamtspannung / Zellenzahl Da der Gesamtwert eigens gemessen werden muss um aktuell zu sein (Addieren dauert zu lange) braucht man dafür einen Eigenen Messkanal,

der in gewissen Grenzen an die Zellenzahl angepasst sein muss. Ich muss also den Mutiplikator des Messeingangs für die Gesamtspannung auch noch einstellbar machen. Der Spannungsteiler sollte immer geradzahlige Verhältnisse haben, die maximale Spannung am AD-Wandler beträgt 5V

Für die Messung möchte ich den Atmega des Displays nehmen, der kann das in den 25ms machen, in denen er sowieso auf die Antwort der Messeinheiten warten muss. Der Wert ist dann nie älter als ca. 10 ms.

Natürlich wäre auch noch eine Erfassung der verbrauchten bzw nachgeladenen Energie sinnvoll.

Ob allerdings mein derzeitiger Wissensstand schon

reicht um das zuverlässig hinzubekommen ????? Im Prinzip nur ganz oft messen, multiplizieren und aufaddieren bzw subtrahieren. Das wäre ja kein Problem bei Gleichstrom. Das Ganze muss aber auch die Verluste beim Laden sowie die unterschiedliche Kapazität bei verschiedenen Temperaturen sowie die Alterung der Akkus berücksichtigen und dann wirds wieder mal eindeutig kompliziert. Die Energieanzeige steht momentan noch ganz weit hinten an.
Im Augenblick will ich erst mal den Rest brauchbar

hinbekommen.

Erst mal ordentliches Monitoring inklusive der Berücksichtigung der durchschnittlichen Spannung.


Bei LIPOs ist leider der Ladezustand sehr schwer festzustellen, da die Spannung nichts darüber aussagt. Die Änderungen infolge Temperatur und Stromstärke machen da viel mehr aus.Insofern machen noch nicht
einmal feste Spannungswerte als Grundlage für Fehlermeldungen wirklich Sinn. Ein Wert von ca. 2,5V als Untergrenze wird beim Beschleunigen durchaus mal unterschritten, ohne dass ein voller Akku damit ein Problem hätte. 2,5V Leerlaufspannung sind dagegen höchst bedenklich.Die Zelle ist dann ganz sicher leer

und in höchster Gefahr.


Aber wenn dauern was blinkt oder piept nervt das irgendwann auch......... Da ist noch genug zu tun! Dann ein konfigurierbarer Balancer mit Steuerung eines Ladegeräts.

Die Nutzung der Balancerwiderstände als Fahrzeugheizung will ich nicht aus den Augen verlieren, aber das geht immer noch irgendwann.

Zu guter Letzt noch eine Energieanzeige. Wenn ich das noch hinbekommen sollte, wärs wohl doch was für eine Kleinserie.

Aber ich kann und will da jetzt noch überhaupt keine leeren Versprechungen machen. Ich hab schliesslich auch noch anderes zu tun.

soviel für heute , mehr dazu in den älteren Posts. Nachtrag 21.April 2010:
Ich hab wieder einen kleinem Fortschritt:


Die Eingaben bzw. Tastendrücke und die Anzeige im Menue laufen jetzt anders. Die Tasten laufen jetzt über Interrupt, und die Anzeige immer über das selbe Unterprogramm. Ich brauche somit nicht mehr jede Anzeige und Zeitschleife einzeln programmieren, sondern nur noch für jede Menueebene die zu ändernden Werte und ihre Grenzen definieren. das hat gewaltige Auswirkungen auf die Programmgröße. Die Funktionen bleiben in etwa die selben.

"Tasten über Interrupt" das bedeutet, dass jeder Tastendruck sofort das Programm unterbricht und irgendwas auslöst.

In diesem Fall wird einfach ein Wert um eis erhöht oder erniedrigt. Welcher das ist, wird im jeweiligen Menue definiert.

Zum Einen läuft jetzt die Eingabe viel flüssiger, zum Andern hat eine zusätzliche Menueebene einen viel geringeren Speicherbedarf.

Ich bin jetzt bei gleicher Funktionalität bei ca 85% statt 98% des genutzten Flash-Speichers- das ist ein sehr entscheidender Unterschied, wenn noch einiges rein muss................ mal schauen, obs reicht!

wenigstens die Durchschnittsspannungsüberwachung.......... (viel Aufwand)
für die Akku-Temperatur, noch ein Grenzwert, (klein, wenn festgelegt)

und die Befehle für "Heizen bzw. Balanzieren" ! (wenig Aufwand)


Die Restenergieanzeige wird sicher ein eigenständiges Modul. Langsam gehen mir die Nummern für die Befehle aus......... zumindest auslesen und auf Null stellen müsste gehen, Ich glaube, das wird ein Gerät mit eigenem Display etc. irgendwo im Kofferraum und ich lese nur den aktuellen Wert aus und zeige ihn an bzw nicht mal das, das könnte mit der Tankuhr gekoppelt werden..... ..........darum ist das gaaaaaaaaaanz weit hinten angestellt



Nachtrag 22.April 2010

Nachdem ich nun auch noch die Durchschnittsspannungsüberwachung samt zugehörigem Menue reinprogrammiert habe ist wieder mal der Speicher voll!

Ohne Begrüßungsbildschirm und Statusmeldung nach dem Einschalten gehts zwar, aber das ist ja nicht Sinn der Sache.

Wie gehts da weiter? Einen festen Grenzwert nehmen? ..ist das Einfachste!
Durchschnittsüberwachung weg lassen? will ich nicht!

Programm überarbeiten... bringt nicht mehr viel

Größeren Controller.... na klar, ist auch gewissermaßen schon vorgesehen, aber....Da brauch ich dann die Vollversion von Bascom! ca 100€..... ist wohl die beste Lösung! Der Atmega 88 kostet 1,85€ statt den 1,30€ des Atmega48 und hat dann 8k statt 4k Speicher. Der 88 ist pinkompatibel zum 48er.


Dann hab ich wieder "Platz ohne Ende" weil dann auch der 168er mit 16k (2,85€) problemlos verwendet werden könnte. (Bill Gates dachte auch irgendwann mal dass niemand 640k RAM vollschreiben würde...................)

Das Display passt jetzt mal fürs Erste!

Für meine weiteren Tests werde ich die Durchschnitts Überwachung vorerst mal weglassen. Die Entsprechenden Programmteile funktionieren soweit ganz brauchbar, und das Speicherplatzproblem ist lösbar, wenn mir auch die Investition in Bascom nicht gefällt, aber da komm ich wohl nicht drum rum.

Meine Assembler-Kenntnisse reichen derzeit noch nicht, um das alles damit zu programmieren, damit würde der Platz locker reichen.



Das wird schon noch irgendwann.......





















Hier sieht man , was derzeit möglich ist.

von oben:

12Zellen, Durchschnitt 3,60V Gesamtspannung 43.2V

Höchste: Zelle 9 mit 3,72V Niedrigste: Zelle 7 mit 3,58V

Zelle 8 wurde gerade gemessen mit 3,62V Die Bordbatterie hat 13,65 V

In der untersten Zeile kommen die Status bzw Störmeldungen.

Der Speicher ist bis zum letzten Byte ausgenutzt.

Für ein OK! in der letzten Zeile hats nicht mehr gereicht ;-)


Das lass ich jetzt mal einfach so, wie es ist.

Die anderen Funktionen, Menues und Meldungen passen
auch ganz gut, aber eben nicht gleichzeitig wegen Speichermangel.
Da muss jetzt die Vollversion von Bascom und ein Atmega88 her.
(Bascom hat noch gar nicht gemeckert, aber der Atmega48)

Nachtrag 10.05.2010: Ich habe jetzt doch noch eine Möglichkeit
gefunden, ein Wenig Programmcode zu sparen.
Mit "debounce" kann ich die Eingaben deutlich kleiner programmieren,
als das derzeit der Fall ist. Ausserdem ist die Tipperei so wesentlich
angenehmer. Ein paar "locate" und "LCD" lassen sich auch noch
wegrationalisieren.und die ganzen "wait" brauche ich auch nicht mehr.
vielleicht reichen die 4k des Atmega48 ja doch!
Mit der Zahlenformatierung bin ich auch noch nicht ganz zufrieden.
Das muss doch auch weniger speicherfressend gehen,
als erst in Sting umzuwandeln und dann da die
Kommata und führenden Nullen reinzuformatieren.
(fusing........ mal schaun....)

Jetzt ist erst mal die galvanische Trennung dran!

Nachtrag 30.04.2010: Die galvanische Trennung ist gebaut, zumindest in Senderichtung und scheint zu funktionieren. konnte es aber nicht testen. Ich habe mich fürs Erste entschlossen,die galvanische Trennung der Messmodule per Optokoppler zu realisieren. Sicher gäbe es da feinere Lösungen ich denke da an die "ADUM...." Reihe, das sind Signalübertrager auf Induktiver Basis, da ist sogar ein DC-DC-Wandler mit drin, mit dem man die Messeinheiten
problemlos versorgen könnte.Der Preis liegt irgendwo bei 3€ pro Stück. Das ist mir im Augenblick zuviel!
Ich werde meine Messmodule direkt aus den jeweiligen Zellen speisen. Solange der Eingangsspannungsteiler mehr verbraucht als der Microcontroller, der die Spannung misst ist alles andere eh sinnlos. ....Und ein Controller je Zelle würde zwar weniger Strom brauchen, weil man den direkt anschliessen könnte, aber dann bräuchte auch jeder controller eine eigene getrennte Versorgung.
Um nochmal alles klar zu stellen, es geht hier um Stromaufnahmen im Bereich von 2mA, das ist praktisch nichts für Zellen von 50 bis 200 Ah es macht also wenig Sinn, da was zu verbessern.

Ich habe die "Sende-Seite" etwas unkonventionell gebaut, aber es funktioniert hervorragend. Beim "Maximalausbau" mit 192 Zellen müsste ich 48 Optokoppler zugleich ansteuern. (eher unwahrscheinlich, aber es ist einfach mal vorgesehen) Normalerweise sollten 12 Optokoppler (48Zellen) reichen.
Das Serielle Signal kommt mit 5V TTL-Pegel aus den Bausteinen. Eine Umsetzung auf RS232 Pegel mit einem MAX232 bringt hier überhaupt nichts, an den Messmodulen brauche ich
sowieso wieder ein 5V TTL-Signal.
um so viele Optokoppler anzusteuern brauche ich aber zumindest einen 12V-Ausgang. Da könnte man dann 24 x 4 Optokoppler in Reihenschaltung betreiben. Ich habe deshalb ein IC genommen, das eigentlich als Mosfet-Treiber gedacht ist. Ein TC4451 Das Teil kann an 12V bis über 2A Dauerstrom treiben. Das reicht für 24 x 5-10 mA Impulse (kurz) ganz locker!

Das ankommende Signal ist wesentlich einfacher zu handhaben. Da immer nur ein einziger Messumformer sendet ist auch immer nur ein einziger Optokoppler aktiv. Einen einzelnen Optokoppler kann der Atmega direkt treiben und dem Ausgang des Optokopplers kann man ohne Probleme auch 12V zumuten. Ich werde die Signale wohl mit 12V übertragen (??????) und am Steuerrechner wieder runterteilen/ begrenzen/ entstören um etwas mehr Störsicherheit zu haben.

Nochmal Nachtrag (7.5.2010) :
Ich habe noch ein Signal hinzugefügt. Vor jeder Datenübertragung wird an den Master eine Null gesendet und eingelesen damit der Empfangspuffer der seriellen Schnittstelle auf Null gesetzt wird. Ich würde sonst Störungen nicht bemerken, weil ja noch der alte Wert im Puffer stünde..... Die gefundene Lösung ist aber noch nicht optimal. Da muss es doch eine andere Möglichkeit geben um den Empfangspuffer auf 0 zu setzen.Ich habe den Befehl allerdings noch nicht gefunden. Als "Workaround" habe ich dem Master eine Software-Schnittstelle verpasst, mit der er sich die 0 ganz einfach selber schickt. Das geht aber sicher noch viel eleganter! Aber es funktioniert.
Ich habe für diese Tests den alten Aufbau mit dem ATtiny 2313 nochmal reaktiviert. Für diese Versuche reicht das alte Programm, und die Messwandler in der derzeitigen Version sind ohnehin da mit drauf.
Ein kleines Video hierzu:





Weil ich es gerade in der Hand hatte.....
Das Display im Größenvergleich:
Ich werde wohl das EA DIP204-4 einsetzen. Dieses Display gibt es auch in Blau mit weisser Schrift oder in weiss mit schwarzer Schrift. Das Bandkabel darf wohl durchaus bis ca 30cm lang sein.(noch nicht getestet)
Das Display misst aussen 68 x 27 mm und ist mit Kabel etc 15mm hoch.
Die Höhe könnte notfalls auf ca 11mm reduzirt werden indem man die
Anschlusspins entfernt und das Bandkabel direkt an der Platine anlötet.




(das müsste also sicher irgendwo unterzubringen sein)



Im Normalen Betrieb soll mein BMS keine Schalter
oder Taster benötigen, (drei Tasten zur Konfigurierung)
diese können also "an unauffälliger Stelle" versteckt werden
oder man steckt sie nur bei Bedarf an.............



Um Gehäuse etc. habe ich mir noch keine Gedanken gemacht!
Das Display sollte eigentlich wenns irgendwie geht im inneren
der bestehenden Armatureneinheit einen Platz finden.
























Am Display selbst ist nicht viel zusätzliche Elektronik
nötig.Hinten ist noch ein Poti für die Kontrasteinstellung,
ein Stützkondensator und der Vorwiderstand für
die Beleuchtung drauf. Das Poti sollte später auf die
Hauptplatine bzw wenn noch ein PWM-Ausgang übrig bleibt
durch eine Einstellmöglichkeit übers Menue ersetzt werden.
Kondensator und Vorwiderstand für die Beleuchtung
müssen später auch nicht unbedingt am Display sitzen.
So ist es aber kompatibel mit dem STK500-Board
Momentan sind erst 8 Drähte benutzt. Zwei sind frei,
Das reicht noch für Kontrast und Beleuchtung
(Die sollte besser mit 12V über Zündung versorgt werden).
Von da her also kein Problem

Das geht zur Not auch ohne Platine!

Noch ein paar Tests mit langen Leitungen, dann werde ich mich mal um die Messeinheiten kümmern damit die endlich je vier in Reihe geschaltete Spannungen messen können.
Die Balancer-Funktion will ich ohne Optokoppler zum Laufen kriegen.
Ich werde wohl P-Kanal Mosfets nehmen, Pull-up- Widerstände halten sie ausgeschaltet und open Collector- Treiber (ICs oder Transistoren oder notfalls doch Optokoppler?) schalten die Balancer gegen Masse ein. (Masse ist in diesem Fall der unterste Punkt jeder
Vierergruppe.Je vier, ev. sogar nur drei Zellen versorgen den Atmega
Mal sehen obs so geht wie ich mir das vorstelle.

Nachtrag 18.05.2010
Seit gerade eben läuft der erste Messwandler mit Auslesung von vier
in Reihe geschalteten Zellen.

Um nicht alles neu programmieren und bauen zu müssen hab ich es mit
einem ATtiny 24 aufgebaut und das bisherige Programm angepasst

Das Ganze hat auf Anhieb so funktioniert, wie ich mir das vorgestellt habe.
Im Programm musste ich den ersten Wert anders behandeln, da der
gegen "Masse" des jeweiligen Viererpacks gemessen wird.
bei den anderen drei Zellen muss ich den Wert der nächstniedrigeren
Zelle vom Wert subtrahieren.

zur Genauigkeit:
Spannungsteiler ist 4:1
Spg 1 (Zelle13) 0,683V am AD-Wandler => 2,73V, im Display:2,77V)
Spg2 (Zelle14)1,400V -0,683V=0,717V =>2,86V, im Display:2,91V)
Spg3 (Zelle15)2,170V - 1,400V=0,77V =>3,08V, im Display: 3,14V)
Spg4 (zelle16)3,034V - 2,170V = 0,86V => 3,46V, im Display: 3,50V)

Woher kommt der Fehler?
Das ist eigentlich gar keiner, das sind etwa 2% und die kommen
von der Korrektur der anderen Werte im Display.
Ausserdem ist da noch die Auflösung von 0,02V
die sich in diesm Fall auch mal verdoppeln kann.
Die Spannungsteiler sind auch noch da........
Ich muss die einzelnen Messwandler einfach noch ein Wenig
abgleichen, und zwar den Wandler und nicht das Display,
wie ich es der Einfachheit halber jetzt mache, dann passt das wieder perfekt.
Da ich weiß, wo der Fehler herkommt, bin ich
für heute mit dem Ergebnis sehr zufrieden!!!!

19.05.2010
Die Korrektur ist wieder korrigiert.........
Da die bisherigen Wandler mit 5,05V statt 5V als Referenz abeiteten
und somit etwas (ca.1%) zu niedrige Werte lieferte,
hatte ich das in der Berechnung korrigiert.
Der neue Wandler hat aber 4,99V als Referenz, somit
stimmt dessen Ausgabewert etwas genauer.
Aktuelle Messungen damit:
Spg 1 (Zelle13) = 2,74V, angezeigt im Display: 2,74V)
Spg2 (Zelle14) = 2,86V, angezeigt im Display: 2,88V)
Spg3 (Zelle15) = 3,10V, angezeigt im Display: 3,11V)
Spg4 (zelle16) = 3,46V, angezeigt im Display: 3,46V)
Das übertrifft sämtliche Erwartungen,
besser kann das Ergebnis gar nicht mehr werden!
Bei Gelegenheit werde ich das nochmal mit einem
sehr genauen Meßgerät überprüfen.

08.06.2010
..........lange nichts neues mehr..........
Ich hatte einfach auch mal was anderes zu tun......
Es gab zwischendurch einen echten Rückschlag, aber das hat mich nicht
wirklich überrascht.
Ich habe versucht, auch noch die Balancer-Funktion mit rein
zu packen. Der ATiny 24 ist halt einfach kleiner.
Notfalls 3er-Pakete steuernDas wird aber nichts mit dem ATtiny 24.
Abgesehen davon, dass ohnehin die Pins nicht für vier Zellen reichen,
gibt das in Verbindung mit dem Software-UART einfach
zu viele Timing-Probleme.Offenbar sind da Interrupts mit im Spiel
und da kommt dann die Schnittstelle durcheinander wenn gleichzeitig
auch noch Analogwerte gelesen werden sollen


Beim Atmega 48 brachte ich dann die PWM-Funktion zunächst nur mit
Timer 1 zum Laufen. Ich brauche aber vier unabhängig ansteuerbare
PWM-Ausgänge.(je zwei bei Timer 0 und 1; einer bei Timer 2
Seit heute geht das aber auch mit Timer 0!

Config Timer0 = Pwm , Pwm = On , Compare A = Clear , Prescale = 1
'Config Timer1 = Pwm , Compare A Pwm = Clear Up , Prescale = 1
'Config Timer2 = Pwm , Pwm = On , Compare A = Clear , Prescale = 1

Aus irgendwelchen Gründen müssen Timer 0 und 2 einfach anders
konfiguriert werden. woran es aber nun wirklich scheiterte habe ich
bis jetzt noch nicht gefunden.(aber auch noch nicht wirklich gesucht)
Nur weils 8Bit statt 10Bit Timer sind ??
Timer 1 lief auch im 8Bit Modus. Wir werden sehen........

Jezt hätte ich sogar 5 PWM-Ausgänge
und 6 AD-Wandler-Eingänge zur Verfügung.

Notfalls wären also auch fünfergruppen möglich, aber das scheint
mir dann doch zu viel zu sein.
Ich habe aber das Programm noch nicht auf den Atmega 48
angepasst und übertragen. Erst brauche ich noch einen
Aufbau um etliche Atmega48 eigenständig laufen lassen zu können.
dann gehen die Versuche weiter.
Es sieht aber gut aus, soweit ich das jetzt schon sagen kann.

Die serielle Verbindung läuft prima das ist schon länger getestet.
AD-Wandler-Werte einlesen war auch kein Problem
und die PWM-Ausgänge anzusteuern läuft jetzt auch ohne Probleme.

Das muss nur noch alles in ein (1) Programm und mit der Hardware
muss ich mir noch ein bisschen was überlegen wie ich die
Balancer-Mosfet am besten ansteuere.

Womöglich sogar P-Kanal und N-Kanal gemischt ?????
2,5 - 3 Volt sind schon sehr wenig als Gate-Spannung
Die Heizungs-Idee ist noch nicht aufgegeben!
Zum Balanzieren bei ca 4V reicht die Spannung.

mfG

Franz

10 März 2010

Serielle Anzeige selbst programmiert (fast)

Tja............
die fertigen Programme haben nicht ganz so
funktioniert, wie ich das haben wollte..........
Ich musste mich also selber hinsetzen!
Das ist sowieso die befriedigendere Lösung.

Was wollte ich haben?
1. ATtiny als Basis wg. Bascom-Programmierung
2. Quarz, damit die serielle Schnittstelle läuft.
3. Baustein mit echter serieller Schnittstelle
4. ein selbstgeschriebenes Programm

Was soll das Ding letztendlich können?
....wieder mal Änderungen im Konzept....

1.Ich will ein LCD-Display für diverse Anzeigen
2.Am Display soll es mehrere Tasten geben
3.Die Funktionen sind auf mehrere ATinys verteilt
4.Die ATtinys kommunizieren seriell (vorerst(?),weil einfach!)

Was müssen die Programme können?
1. Das Display muss seriell empfangene Daten darstellen
2.Der Rechner im Display soll Befehle schicken können
3.Die Messeinheiten sollen einzelne Befehle erkennen

Was soll ablaufen?
in der "Grundstellung" werden Gesamtspannung und
"Bordnetzspannung" gemessen und angezeigt.
Ganz nebenbei werden die einzelnen Zellen der
Reihe nach abgefragt und bei Fehlern soll Alarm
ausgelöst werden.
Als Bemessungsgrundlage soll die durchschnittliche
Zellenspannung dienen! Ein Alarm bei einer bestimmten
Spannungsuntergrenze ist natürlich ebenso vorgesehen.
Ein gezieltes Abfragen einer Zelle ist auch vorgesehen.

....ganz so weit bin ich aber noch nicht......
Die Messfunktionen und Umrechnungen in "Klartext"
habe ich schon mit dem ATtiny13 getestet, das sollte
nicht mehr allzu problematisch sein, und die Funktionen
sind auf andere ATtinys bzw. Atmegas übertragbar.

Deshalb habe ich mich jetzt erst mal den Steuerfunktionen
gewidmet.
Dafür habe ich ein Testprogramm geschrieben,
das möglichst viele Steuerfunktionen abarbeitet.
Im Display / Bedieneinheit will ich einen ATtiny2313
einsetzen. (Anm. es wird wohl eher ein Atmega48,
aber für andere Zwecke würde der 2313 durchaus reichen)
Dem habe ich jetzt folgendes beigebracht:
Reaktion auf ganz bestimmte (Hex) Befehle/Bytes
1 (49h), 2 (50h), 3 (51h) und r (114h) werden erkannt
und als Reaktion darauf wird sowohl im Display
angezeigt als auch seriell als Text gesendet,dass diese
Befehle erkannt wurden (und auch welcher es war)
Undefinierte Befehle werden ebenso gemeldet und
weitergeleitet.(Hex-Wert wird angezeigt
Hex-Wert und Buchstabe im Klartextwerden sowie
eine Textmeldung werden ans Terminalprogramm
geschickt)
Die Ausgabe der Hex-Zahl als Buchstabe in der
LCD-Anzeige klappt momentan noch nicht,
aber das ist auch gar nicht nötig
und das wäre sicher noch lösbar.
Als "Klartext" geschickte Meldungen werden
derzeit einfach ignoriert, das ist gut so.
Da muss ich noch ein bisschen grübeln,
wo ich überhaupt die Meldungen generiere.
(Werte nur als Zahl (Byte, ev.Integer)übertragen und
in der Anzeige umrechnen, oder schon in den Messtellen
als Klartext generieren und im Display nur
noch anzeigen (String,16Zeichen)...mal sehen...
das wird noch interessant........)

Am ATtiny2313 sind noch vier Portpins frei,
da kommen Taster dran.Damit die Ausgabe je eines
Befehls auszulösen ist kein Problem.
Die Auswertung der Befehle funktioniert jetzt,
und wie die Messung geht ,das hat schon der ATiny13
eindrucksvoll gezeigt.Da erwarte ich keine großen
Probleme mehr, aber da brauche ich andere Bausteine.
(ATtiny24 bzw. ATtiny26 scheinen geeignet,
Leider haben die keinen UART...... der 2313 hat
UART aber keine AD-Wandler.... warum gibts keinen
ATtiny mit UART und ca. 4 AD-Wandlern?????????).
All die Funktionen, die mir Kopfzerbrechen
bereiteten laufen jetzt im Testprogramm
gleichzeitig in einem ATtiny2313 der zur Zeit
ca 55% an möglichem Code drauf hat.
Da geht noch einiges................
z.B. eine kleine Menueführung für die
Funktionen













Nachtrag 12.März 2010:


Ein Menue für die Bedienung läuft

mittlerweile auch schon mal in den
Grundzügen.


Ich kann zwischen mehreren Ebenen

(in denen dann völlig unterschiedliche
Programme ablaufen können)
hin und herspringen.


1.Ebene, gleich nach dem Einschalten.

Systemtests etc. ev. anschliessend
umschalten in die zweite Ebene
2.Ebene für ??????????
Ich denke an Überwachen von
durchschnittlicher, höchster und
niedrigster Spannung aller Zellen
sowie Anzeige der Bordbatterie (12V)
und überwachung fester Grenzen.
3.Ebene, Automatisches Messen
aller Zellen der Reihe nach
mit Einzelspannungsanzeige.
4.Ebene, manuelle Anwahl der Zellen


Das alles ist noch nicht endgültig, die
Programme sollen auch als Basis für
vollkommen andere Anwendungen
brauchbar sein.

(wer weiß, was noch kommt).

Recht unerwartete Probleme gibts beim
Einlesen von Text (ASCII)
und größerer Zahlen (mehrere Byte)
über die serielle Schnittstelle, aber das
ist ganz sicher zu schaffen. Im Prizip
geht das schon, aber da ich empfangenen
Text nicht so ohne Weiteres im Display
darstellen kann und auch der Empfang
nicht ganz einfach ist, insbesondere,
wenn mal irgend welche Fehler
auftreten sollten und deshalb die
Übertragung irgendwo stockt.
Das wird noch interessant!!!


Eigentlich wollte ich die"Rechenaufgaben"
in die Messstellen
auslagern, und das Display nur als
Anzeige, Bedieneinheit

und Zellennummerngenerator
nutzen (derzeit 65% Speicher voll)
Prinzip: Zellennummer gesendet,
die entsprechende Messstelle antwortet
in "Klartext" (Zelle 23: 3,27V)
Wenn ich jetzt die Umsetzung in
"Klartext" auch noch da reinpacken
soll, wirds hier wieder mal eng.....
..und die Messstellen langweilen sich!
Da das aber ohnehin Voraussetzung ist,
um alle Spannungen zentral zu
"bewerten" und nach Pegel und der
zugehörigen Zellennummer zu
sortieren ist das wohl nicht allzu
Problematisch.

Übrigens: 1 Byte entspricht bei
5V Messbereich ca 0,02V Auflösung.
(5V / 256 = 0,01953125)

Eine Genauigkeit von ca +- 0,1V sollte
demnach zu schaffen sein.Das müsste
eigentlich locker reichen.

Nachtrag 16.03.2010:

Das Display macht jetzt schon ganz tolle
Sachen:





















Die aktuell gemessene Zelle wird angezeigt.
(z.B.: Z060)
(Die " Messwerte", je ein Byte kommen bereits über
die serielle Schnittstelle an, aber noch aus einem
Simulierten Messumformer, einem ATtiny2313,
der auf Anfrage vorgegebene Werte von 0-255 sendet)
die "mV" sind nur "Text für die Optik")
Das Anfragen der Messwerte und die Sendung
der passenden Antwort funktioniert problemlos
und absolut zuverlässig.
Die Auswertung und Anzeige der Zellen mit
der höchsten und niedrigsten Spannung
funktioniert auch schon.

Allerdings zeichnet sich schon jetzt ab,
dass der ATtiny 2313 doch überfordert ist.
(eigentlich wollte ich die Messstellen rechnen
lassen und das Display sollte nur den Text darstellen)
Die 2k Speicher sind fast voll,weil die
Formatierung der Zahlen z.B. führende
Nullen bei Bascom den Speicher geradezu "frisst"
(Das Problem hatte ich schon beim 13er)
Daran solls aber gewiss nicht scheitern!
Die 4k der Freien Bascom-Version reichen
allemal, ich muss nur noch die Messwerte
in Klartext umrechnen etc. das ist nicht
allzu tragisch.
Einen passenden Prozessor finde ich sicher!
(Atmega 48 à 1,30 € )

Das Programm gefällt mir schon ganz gut.
Ich führe die Berechnungen nun doch
im Steuerrechner des Displays durch,
weil ich so viel problemloser die
Min- und Max-Werte
ausrechnen und anzeigen kann.
Das wurde doch wieder mal ganz anders
als ursprünglich geplant!
So macht das einfach mehr Sinn!

Prinzip der Maximalwertanzeige:
Kommt ein höherer oder niedrigerer Wert
als die angezeigten Grenzwerte, werden die Werte
(Zellennummer und Spannug) ins Display
geschrieben, und auch als Referenz abgelegt.
Kommt die entsprechende Zelle erneut an die
Reihe, so wird der neue Messwert übernommen.
So bleibt die Anzeige immer aktuell und eventuelle
Fehlmessungen werden wieder entfernt.
Das lief auf Anhieb perfekt.



Nachtrag 17.03.2010:

Ich habs nun doch noch geschafft, alle
wichtigen Teilfunktionen in den 2313
rein zu programmieren!!!!
Vor Allem die Formatierung der Zahlen.

Anzeige von Zellennummer Spannung;
Anzeige von MAX. und MIN.

sowie eine Störmeldung bei Unterspannung
einer einzelnen Zelle. (fester Wert)

Die Meldung bei Unterschreitung des
Durchschnittswertes aller Zellen ist
kein Problem mehr, aber das macht
erst Sinn, wenn ich entsprechende
Messwerte aufnehmen kann.

Ich habe den "Dummy-Geber", der einfach
fest vorgegebene Werte lieferte
(je nach Anfrage, zum Test der Decodierung)
durch einen ATtiny 13 ersetzt,
der auf jede Anfrage reagiert, aber dafür
tatsächlich misst.
Das Ergebnis ist beeindruckend!

Da die Berechnungen im Display-Rechner
stattfinden, werden sich die Messstellen
eher langweilen.........

Was hab ich da vor?

Ich will je fünf (4 ????) Zellen zugleich
messen. das geht mit einem Baustein
über die Zwischenwerte der Reihenschaltung
von 4 x 5V ; 0-5V-10V-15V-20V.
Die Auflösung beträgt da immer noch
ca. 0,025V bei fünf Zellen bzw.
0,02V bei vier Zellen.
Die AD-Wandler arbeiten mit 10Bit (1024)
Der Wert müsste also ohnehin durch 4 geteilt
werden damit es ein Byte pro Wert wird.
Das ist nicht die Messgenauigkeit!
aber die sollte dann immer noch bei ca +- 0,1V
oder besser liegen

Es drängt sich geradezu auf, die Balancer-
Funktion auch in die Messstellen zu packen!

.....mal durchkalkulieren, obs Sinn macht.

Ich spare ATtinys à 1€ je Zelle ein, brauche dafür
aber je einen Optokoppler .....und der Abgleich
wird schwieriger....und der Balancer bräuchte
eine eigene Spannungsversorgung...............

Hmmmmmmmm...............

Nachtrag 06.April 2010

.......und wieder einen Riesenschritt weiter!!!!!

Das Display läuft schon mal gut genug für erste Tests.
Da ist noch einiges zu tun, aber das eilt jetzt nicht.
Die Befehle gehen richtig raus und die Rückmeldungen
werden korrekt angezeigt. Das reicht vorerst.
Der Prozessor wird sicher noch ein anderer.
Vermutlich ein Atmega 48!
Der hat als einzigen "echten" Nachteil sehr viele Pins (28).
Mit 1,30€ eine Super-Sache.
Wenn der nur nicht so riesig wäre.........
Beim Display ist das kein Problem, aber bei den
Mess-Modulen muss ich Platz sparen.Da sind die
14Pins des ATtiny24 schon angenehmer.

Ich habe in der Zwischenzeit ein wenig an den
Messstellen weitergearbeitet.

Mittlerweile messen vier ATtiny24 jeweils vier
Spannungen.Leider haben die 24er wie auch die
26er keine wirklich echte serielle Schnittstelle.
Deshalb laufen die mit "Software-UART"
Zumindest aber mit Quarz und so funktioniert
das schon ganz zufriedenstellend.
Womöglich werde ich hier auch auf den
Atmega 48 umstellen - mal sehen.......
Der wäre völlig "unterfordert", aber die
Datenübertragung wäre dank UART besser.

Die Kommunikation läuft noch nicht galvanisch
getrennt, aber immerhin klappt die Kopplung.
Alle Messstellen kriegen das selbe serielle Signal.
(bei wesentlich mehr Messstellen ist hier natürlich
noch eine Treiberstufe für viele Optokoppler nötig)


Die Rückmeldung wird per Dioden und Pull-Up auf
eine Leitung zusammengeführt.
Da alles nach dem Master-Slave-Prinzip arbeitet
gibt es hierbei bisher keine Probleme.
(jede Messstelle sendet nur, wenn sie vorher
aufgefordert wurde, so gibt es kein Durcheinander)

Wie gehts weiter?
Nächstes "Etappenziel" ist die galvanische Trennung
der seriellen Kommunikation.Insbesondere die
Treiberstufe für bis zu 50 Optokoppler.Ich will
Versuche mit Treiberbausteinen für Mosfet machen.
Die Dinger setzen die 5V-Signale auf 12V oder 24V
um und sind sehr schnell und preiswert.Bei 12V
könnten schon mal je vier Optokoppler in Reihe
betrieben werden.Wieviele dieser Gruppen an einem
Ausgang betrieben werden können muss noch
getestet werden.Schon der kleine TC4431/32
kann 1,5A Peak und mindestens 100mA
Dauerstrom bei 24V schalten, was an 12V
für mindestens 24 Optokoppler reichen sollte.

2 * 24 * 4 = 192 Da sollten mit zwei TC4432
192 Spannungen keine Utopie sein!
(Das gilt es aber noch zu bestätigen)
Ansonsten gibt es ja auch richtige Treiber-ICs.
Um einen Frequenzumrichter für
380V-Motoren an Gleichspannung zu betreiben
sind ca 160-170 Zellen nötig.

Da ich ohne großes Protokoll nur ein Byte sende
und pro Meßstelle vier Zellen messe möchte ich die
Werte 201 - 250 für Statusabfragen freihalten.

mit 251 (?) bis 254 könnten dann z.B.die
Bordbatterie und die Gesamtspannung erfasst
werden.

Bei den Rückmeldungen mache ich mir weniger
Sorgen.Ein ATtiny oder Atmega kann locker
einen Optokoppler ansteuern.
Dass ich wohl nicht die Ausgänge von fast 50
Optokopplern einfach parallelschalten sollte
ist auch klar, aber das muss ich ja ohnehin
grüppchenweise machen. Die Anlage soll ja
aus Standardbaugruppen bestehen,
Display = Master und Slaves je nach
Anzahl der überwachten Zellen
Eventuell wird die Kommunikation auch
mit etwas mehr als 5V erfolgen.
Da fällt mir schon noch was ein!

I²C oder ein ähnliches Bussystem stünde auch noch
im Raum, aber das ist auch nicht so viel besser,
vor Allem wenns galvanisch getrennt sein soll
wird der Aufwand schnell größer.
Ich werde deshalb wohl bei meiner primitiven
seriellen Kommunikation bleiben, wenngleich
da wohl an mancher Stelle mit 12V gearbeitet
werden wird.
Mir reichen übrigens sogar 300Baud wenns denn
sein müsste, derzeit läufts mit 1200Bd.
(9600Bd machten aber auch keine Probleme)

Noch ein ganz wichtiger Punkt auf der
"To Do -Liste": die Variablen wie
Zellenanzahl, oberer und unterer Grenzwert
etc....... sollen unbedingt im Menue einstellbar
werden; momentan sind sie noch fest
im Programm abgelegt; aber wozu haben
die ATtinys und Atmegas schliesslich
ihr EEprom........ Die paar Variablen
lassen sich sicher noch wo unterbringen!
Im 2313 fehlt allerdings der nötige Platz.



Update 9.April 2010:

noch ein paar Verbesserungen:




grundsätzlich ist das System schon fast verwendbar!

es fehlen noch folgende Funktionen:
Galvanische Trennung der Meßstellen
Messen mehrerer Zellen in Reihe
Einstellen der Parameter im Menue

ferner:
gezieltes Anzeigen bestimmter Zellen
(aus Platzgründen derzeit entfernt)

Steuerung eines Ladegerätes bzw.
Integration eines Ladegerätes ins System.
(Das wird wohl etwas schwieriger!)
Voraussetzung hierfür ist eine Rückmeldung der
Balancer-Funktion bzw eine Steuerung der Balancer
vom Display aus.Sobald eine Zelle mehr als
z.B. 50% der Balancerleistung braucht,
muss die Ladestromstärke reduziert werden.

Ob jetzt "oben" oder "unten" balanziert wird
(Jack Rickard...) ist doch letztendlich egal!
Die schwächste Zelle macht immer den vollen
Spannungshub. "Oben" balanzieren ist
wesentlich einfacher, da für jede Zelle die selben
Werte gelten.
Dafür ist eine Spannungsüberwachung
jeder einzelnen Zelle Voraussetzung.
Wird "unten" balanziert, dann sieht man an
der Gesamtspannung wann Schluss ist.
Ein Balanziervorgang kann aber nur bei
fast völlig leeren Akkus stattfinden.
Aufgrund ihrer flachen Kennlinie sagt die
Spannung bei LIPOs fast nichts über den
Ladezustand aus.
Ich wills mal so sagen:
Werden LIPOs ohne Batteriemanagement
betrieben, dann ist "unten" die bessere
Lösung bzw sogar die einzige Möglichkeit.
Hat man aber ein Monitoring oder
Management, so sollte eher "oben" balanziert
werden.Die Steuerung des Ladevorganges ist so viel
einfacher zu beherrschen.
Man sollte sich aber im Klaren sein, dass die
praktikabelste Lösung wohl eine Art
Mittelweg sein wird. Es ist nicht nötig alle
Zellen randvoll zu laden und eine Menge
Energie in den Balancern zu verheizen.
Sobald die schwächste Zelle zuerst voll ist
und auch zuerst leer wird ist die Balanzierung
in Ordnung, ganz egal, auf welche Spannung sich die
Zellen letztendlich einpegeln.
Die Shunt -Widerstände brauchen daher gar nicht so
stark ausgelegt sein wie üblich.
Es reicht also, wenn sie nur korrigiernd eingreifen.
(Das setzt aber eine Rückmeldung voraus)
Eigentlich kann mit dem Laden aufgehört werden
sobald die erste Zelle ihre volle
Spannung erreicht hat.
genauso muss aber erkannt werden wann die erste
Zelle leer ist. (es sollte dann aber die selbe sein,
die als Erste voll war!!!!)
Ein "fertigbalanzieren bis 4,2V" bringt jedenfalls
überhaupt nichts.

mfG
Franz