Translate

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!




video

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:



video

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