Software
Ich möchte hier nicht das gesamte Programm beschreiben, aber trotzdem ein paar Features und Details auflisten, die sicher interessant sind, wenn man über den Nachbau des Laders nachdenkt.Quelltext und Binary (Intel HEX) zum Download, Quelltext übersetzbar mit GCC. ACHTUNG: Das Programm ist noch in Arbeit! Momentan Beta-Stadium.
aktuell: V0.97 vom 12.05.08
History
- ab 10.01.2005: alpha-Versionen
- 29.05.2005: erste offizielle beta V0.9
- Programm unterstützt jetzt verschiedene Modi (Laden, Entladen+Laden etc.)
- 24.07.2005: beta V0.95
- Gradientenschwellwerte und die Menge der Werte aus denen die Gradiente berechnet wird sind jetzt abhängig von der Ladedauer. Damit wird das Ladeverhalten sicherer (es gab Probleme bei langen Ladezeiten durch hohe Innenwiderstände) und die Gradientenberechnung genauer (bei langer Ladezeit, wenn man sich die Trägheit der berechneten Werte leisten kann).
- Wenn ein Akku als defekt markiert wird, wird jetzt der Grund dafür festgehalten (z.B. "zu hohe Spannung" oder "zu hohe Selbstentladung"). Er kann im Info-Screen zu dem Akku angezeigt werden.
- ETA-Zeiten werden jetzt bei mehr Vorgängen angezeigt.
- Geringere Werte für die maximale Wärmeabgabe der Akkus in der EPROM-Datei.
- 12.05.2008: V0.97
- Anzeige der Betriebszeit korrigiert (wg. Überlauf bei großer Anzahl von Tagen bisher nicht korrekt)
- Selbstentladung nach 14 Tagen wird bei Refresh aufgezeichnet und kann angezeigt werden
- Das (bewußt langsame) Scannen der Slots, welches alle paar Stunden durchgeführt wird, kann per Tastendruck abgebrochen werden. Es wird dann das normale Scannen der Slots gemacht und der Benutzer kann sofort die durchzuführenden Aktionen auswählen.
Implementierungs-Details
Hier eine Auflistung einiger Details zum Verhalten des Laders und der Implementierung:
- Die Akkudaten werden im EEPROM abgelegt und alle paar Stunden gespeichert. Nach einem Stromausfall werden die Daten wieder geladen und somit sind die eingelegten Akkus noch bekannt.
- Die Textausgaben (lcd und uart) werden aus dem Flashspeicher gelesen. Dazu muss man beim Atmel Mikrocontroller etwas tricksen, weil er im Gegensatz zu den üblichen Rechnerarchitekturen zwei getrennte Speicherbereiche (für Flash und RAM) hat. Ohne diese entsprechenden Befehle würde der GCC standardmäßig alle Strings beim Start in den RAM kopieren und somit wären die zur Verfügung stehenden 2 kB RAM knapp.
- Die Steigung der Spannungskurve wird durch eine Regressionsgrade approximiert. Die entsprechende Berechnungsfunktion ist in der util-Datei zu finden. Wer eine bessere Möglichkeit der Berechnung der Steigung am Ende einer Kurve hat, möge mir dies bitte mitteilen!
- Es werden nicht direkt nacheinander zwei Akkus in nebenliegenden Schächten geladen (wegen der Wärmeentwicklung, die den zweiten Ladevorgang beeinflussen könnte).
- Es gibt einen Grenzwert für die maximale Wärmeabgabe beim Laden, damit die Akkus nicht zu heiß werden. Der Ladestrom wird dann entsprechend begrenzt und ist vom Innenwiederstand des Akkus abhängig.
- Für die Analyse der Steigung wird eine History mit 20 Werten über einen Zeitraum von 2 Minuten benutzt, zusätzlich gibt es noch eine "Langzeit-History" mit 15 Werten über 15 Minuten, mit der erkannt wird, ob die Spannung zu lange nicht mehr angestiegen (flat) ist. Die Anzahl der benutzten Werte (damit der Zeitraum) ist abhängig von der Ladedauer. Bei höherer Ladedauer werden mehr Werte benutzt und damit ein Durchschnitt über einen größeren Zeitraum gebildet.
- Wenn ein Akku schon komplett geladen wurde und damit die Kapazität bekannt ist, wird beim Entladen die Restzeit sofort angezeigt.
- Wenn ein Akku schon komplett entladen wurde und damit die Kapazität bekannt ist, wird beim Laden die Restzeit sofort angezeigt.
- Während des Ladevorgangs werden unterschiedlich volle Batterien als Symbol angezeigt, abhängig davon, in welchem Teil des Vorgangs man sich befindet.
- In der Slot-Übersicht werden volle Akkus (als Symbol) für schon geladene Akkus und halbvolle für Akkus, die noch abzuarbeiten sind, angezeigt.
- Wenn nach dem Laden die Spannung des Akkus zu schnell sinkt, wird er als Defekt markiert. Der Defekt-Grund ist im Info-Screen abzulesen.
- Ansteuerung des LCD-Displays: Durch Einbinden der Headerdatei lcd.h des GCC hat man bereits LCD-Routinen für HD44780 kompatible Displays. Leider haben diese Routinen aus nicht nachvollziehbarem Grund nicht mit meinem KS0073 (Samsung) und KS0066 funktioniert. Nachdem auch eine andere Lösung in C, die ich gefunden hatte, nicht funktionierte, aber ein kleines Assemblerprogramm, das ich ebenfalls fand, habe ich diese Ansteuerung nach C übertragen und somit meine eigenen LCD-Befehle. Wer also bei eigenen Projekten auch mit den Samsung Displays Probleme hat, kann meine Ansteuerung ja mal ausprobieren.
Konfiguration
Die compilierte Datei ist für 32 Akkuschächte ausgelegt. Man sollte beim Nachbau einige Stellen anpassen:
- eeprom.bin: Die Datei enthält die Konfiguration für die Akkuschächte. Die Datei muss geändert werden mit einem Hexeditor und dann ebenfalls auf den Mikrocontroller geflasht werden. Das Format ist folgendes:
Offset |
Bytes |
Bedeutung |
0 |
64 |
8 verwendete Display-Zeichen für das LCD-Display (muss man so lassen) |
64 |
64 |
Minimalkapazität eines Akkus, für jeweils einen Slot (jew. uint16) |
128 |
64 |
Maximalkapazität eines Akkus, für jeweils einen Slot (jew. uint16) |
192 |
64 |
Maximal gewünschte Wärmeabgabe pro Schacht (jew. uint16), die eingetragenen Werte sind die sinnvollen für Micro, Mignon, Baby, weitere Infos in der Datei akkuboostIO.h |
256 |
672 |
battery_data array, hier werden die Daten der Akkus vom Lader gespeichert und gelasen (Stromausfall-Sicherung) |
- akkuboost2.h: static short slot_map[] = {0, 1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8, 23, 22, 21, 20, 19, 18, 17, 16, 31, 30, 29, 28, 27, 26, 25, 24}; wird zum "ummappen" der Slots verwendet. Die Werte geben an, wo ein Akkuschacht durch falsches Anschließen jetzt zu finden ist. Da ich es bei mir nicht vermeiden konnte, die Schächte in Gruppen vertauscht anzuschließen, habe ich dieses Array eingeführt. Im Beispiel ist z.B. für Slot 0 jetzt auch Slot 0 anzusteuern, statt 8 jetzt 15 und statt 9 jetzt 14.
- akkuboost.h: #define BATTERY_SLOTS 32 gibt an, wieviele Slots vorhanden sind. Disen Wert muß man auf die tatsächliche Anzahl einstellen.
- akkuboost.h allgemein: In dieser Headerdatei sind die für (Ent-/Erhaltungs-)ladevorgang relevanten Konfigurationswerte eingetragen. Ich empfehle, es zunächst bei den Standardwerten zu belassen, da diese sich durch langes Testen als sinnvoll erwiesen haben. Wenn jedoch jemandem das Verhalten des Laders an irgendeiner Stelle merkwürdig vorkommt, kann er gerne mit diesen Werten herumspielen und mir bessere Werte mitteilen!