Dienstag, 12. Juni 2012

Neues von der Akku-Front

Genug mit der Ecken-Messerei, vorerst zumindest.

Zwei bei Ebay geschossene Laptop-Akkus habe ich an der Werkbank seziert, die Elektronik entsorgt und mit den Zellen hübsche 7.2V Päckchen gemacht.


Und dann war da noch das Scheduler-Problem. Aus meinem Terence-Projekt hab ich den Code wieder aufgewärmt. Die Idee funktioniert folgendermaßen:
  • Einen Timer konfigurieren, der stur nach oben zählt. Über den Prescaler des Timers lässt sich das Verhältnis von CPU-Frequenz zu Zähl-Frequenz einstellen.
  • Jedes mal wenn der Timer überläuft, wird ein Interrupt ausgelöst und die dazugehörige ISR (Interrupt-Service-Routine) aufgerufen.
  • In dieser ISR wird die aktuelle ADC-Messung ausgelesen, in einen Struct geschrieben, danach ein neuer ADC-Kanal eingestellt und eine neue ADC Konversion getriggert.
  • Der Timer wurde so eingestellt, er mit einer Frequenz von 1024 Hz aufgerufen wird, also im Abstand von ca. 1ms. Die Schaltung hat vier Kanäle, damit liegt alle 4ms eine vollständige Messung, d.h. ein vollständig befüllter Struct vor.
  • Vom Main wird der Struct ausgelesen, etwa alle 40ms. Um Race-Conditions zu vermeiden, also eine Veränderung der Werte während des Lesens, habe ich einen Lock-Mechanismus eingebaut.
Nebenbei stellte ich fest, dass die Arduino-Funktion  analogRead() richtig zeitintensiv ist. Hat man also zeitkritische Anwendungen empfiehlt sich die beschriebene Konstruktion mit ISR-getriggerter ADC-Messung zu verwenden.

So, die bereits beschriebene Schaltung an das Arduino-Board geflanscht, Display dazu und Akku angeschlossen. Nebenbei bin ich noch auf einen fundamentalen Fehler in der Schaltung gestoßen - die Masse der meisten Schaltungsteile ist fälschlicherweise auf GND gelegt. GND ist hinter dem Shunt definiert, was bedeuten würde, dass sich das Niveau bei Stromfluss zum Akku-GND verschiebt, und somit die Spannungs-Messungen falsch wären. Da musste nochmal das Löteisen ran. Korrigierten Schaltplan poste ich nach.

Eine Frage war immer noch offen: Wie verhält sich die Akku-Spannung, während eines Lade-Bursts? D.h. wie schnell fällt die Akku-Spannung wieder ab, wenn der Lade-Strom nicht mehr fließt. Das unten stehende Diagramm zeigt das Ergebnis:
Auf Y1 die Spannungen. Ist der Strom negativ, fließt er in den Akku, die gemessenen Spannungen werden der Lade-Spannung (rot) zugeordnet. Positiver, bzw. null Strom entspricht der Akku-Spannung (grün). Y2 - wer kommt von selber drauf? Strom (blau).
An der X-Achse die Werte des Zyklus-Zählers - ein Zyklus entspricht ca. 1ms.

Fast eine Sekunde braucht der Akku, bis die Spannung wieder auf den tatsächlichen Wert abgefallen ist. Will man also während des Ladens die Akku-Spannung messen, muss die Ladung für eine Sekunde ausgesetzt sein. Relevant wir dies unter Umständen, wenn balanciert werden soll.

Ein weiteres Problem, wird noch deutlich: Das Laden / Entladen wird über zwei MosFet-Transistoren gesteuert, über welche abhängig vom Strom Spannung abfällt. Am Akku liegt deshalb eine Spannung an, welche mal höher, mal niedriger ist. Wie soll nun von einem Ladegerät die obere Spannung genau eingestellt werden?

Dazu wären ein paar Messungen fällig. Im Datenblatt ist der Widerstand der verwendeten IRF9Z24N mit 0.175 Ohm angegeben. Damit würde bei einem Ladeschlussstrom von 150mA etwa 0.05V abfallen. Aber ist das wirklich so?

Mal sehen. Hab natürlich ein Back-Up Konzept im Ärmel: Ein Netzteil bauen, Mikrocontroller-gesteuert und über Serial oder SPI mit dem Akku-Controller kommunizieren. Teile dazu hätte ich alle da. Aber ich komme ein wenig vom Thema ab. Wollte ja eigentlich einen Roboter bauen (nachdem ich das Navi ja nicht mehr brauche...).