Elektronik_Header_3

 

Lüftercontroller

Das Battery Management System (BMS) für meinen Rasenmäherakku muss gekühlt werden, damit der Lade- und Balancevorgang nicht durch zu hohe Temperatur am BMS unterbrochen wird.

Da die Hauptstromversorgung des Ladegerätes 24 V beträgt, ist es sinnvoll, den notwendigen Lüfter auf diese Spannung auszulegen, so spart man sich ein weiteres Netzteil nur für den Lüfter. In meiner Krabbelkiste fand sich auch tatsächlich noch ein betagter, aber noch nie gelaufener Radiallüfter Nidec Gamma 28. Offenbar ist diese Sorte Lüfter etwas Besonderes, denn Nidec hat für die Gamma 28 Serie eine eigene Reminiszenz-Seite angelegt, wo einzig ein Datenblatt des Lüfters abgelegt ist :-)

Wie auch immer, der Lüfter wird eingebaut, ein maßgeschneiderter Luftleitkanal wird mit dem 3D-Drucker erstellt und eine kleine Platine für den DigiSpark und den MOSFET-Schalter wird designed.

Luftkanal 3D-Ansicht

Hier die Unterlagen zum Luftkanal als DesignSpark mechanical Datei sowie als STL-Datei für den Ausdruck.


Die Trägerplatine für den DigiSpark habe ich mit EAGLE entworfen und auf meiner CNC-Fräse mit OpenCNCPilot als Steuerungssoftware erstellt.

Das zugehörige Schaltbild ist unspektakulär:

BMS_Lüftersteuerung         (Click auf das Bild für größere Darstellung)

Die Platine übersichtlich:

BMS_Lüftersteuerung

Der eingezeichnete Elko ist unnötig und wird nicht bestückt. Der MOSFET Transistor ist ein SMD Typ und sitzt auf der Unterseite der Platine, alle anderen Bauteile sind bedrahtet und werden auf der Oberseite angeordnet.

Die Schaltunterlagen im EAGLE Format stelle ich zur Verfügung.


Dann geht es ans Programmieren.
Einen OneWire Temperatursensor auslesen ist kein Hexenwerk, dazu finden sich viele Beispiele im Netz, den Lüfter anhand der gemessenen Temperatur per PWM in der Drehzahl einstellen sollte ebenfalls unkompliziert zu bewerkstelligen sein.

Diese Annahmen haben sich prinzipiell als richtig erwiesen, die Steuerung funktioniert sozusagen auf Anhieb.

Leider arbeitet aber die PWM-Erzeugung in der Arduino-Umgebung mit ca. 4 kHz, so dass der Lüfter im Bereich unterhalb der Höchstdrehzahl - im gedachten Einsatzfall also im Prinzip immer - jämmerlich vor sich hin pfeift. Will man es positiv sehen, muss man die schiere Lautstärke bewundern, die das Teil von sich gibt, aber das muss auf jeden Fall geändert werden.

Im Netz habe ich einen Tipp gefunden, wie man die PWM-Frequenz schneller einstellen kann, aber diese Maßnahme ändert den Timer0. Dieser Timer wird auch für die Funktion  millis() verwendet, darauf basierende Libraries (z.B. 1wire) funktionieren danach also nicht mehr. Das gilt auch für zeitabhängige Funktionen mit millis(), z.B. die klassische Vermeidung von delay().

Wer dennoch damit sein Glück versuchen will, ich habe diesen Teil meiner Versuche im Code stehen lassen und per #define auskommentiert.

Der Versuch, den AtTiny mit Spence Kondes "ATTinyCore" mittels

#define TIMER_TO_USE_FOR_MILLIS   1

dazu zu überreden Timer1 für millis() zu verwenden hat nicht wirklich funktioniert. Es wird zwar tatsächlich Timer1 für millis() verwendet, aber das Timing stimmt irgendwie nicht ganz und 1wire läuft ebenfalls nicht. Vielleicht mein Fehler, das habe ich nicht mehr näher untersucht.

Letztlich habe ich die PWM-Erzeugung mittels Timer1 dann zu Fuß erledigt und die sonstigen Einstellungen des Timer0 in Ruhe gelassen. Die PWM arbeitet mit den im Programm gewählten Parametern mit 31,5 kHz und der Lüfter läuft jetzt, die PWM-Frequenz betreffend, unhörbar.

Das Einsetzen der PWM bei steigender Temperatur wird programmtechnisch verzögert bis der Lüfter mit der angebotenen PWM auch tatsächlich anlaufen kann. Beim Abkühlen bleibt die PWM länger eingeschaltet, der Lüfter dreht sich jetzt bereits und läuft auch mit niedrigerer Spannung weiter.

Wichtig: Die PWM des Timer1 arbeitet in der gewählten Einstellung mit Pin P1 des AtTiny. Allerdings wird offenbar auch der negierte Ausgang P0 beeinflusst, dieser Pin P0 kann also nicht für den 1wire-Anschluss benutzt werden, wie ich das in der ersten Version der Schaltung vorgesehen hatte. Daher hat die oben gezeigte Schaltung auch bereits den Ausgabestand V1.1.

Das ausführlich kommentierte Listing des Programms in Arduino Syntax stelle ich Interessenten zur Verfügung.


Der Lüftercontroller sitzt im Gehäuse neben dem Gebläse, die 24 V des Netzteils werden über Schraubanschlüsse zugeführt, der Lüfter und der Temperatursensor sind über Pfostenstecker bzw. Buchsen angeschlossen.

Temperatursteuerung mit DigiSpark

Den Temperatursensor habe ich mit Kupferfolie auf der Oberseite des BMS befestigt.

Temperatursensor DS18B20

Unter dem hier sichtbaren Alublech sitzen die MOSFETs für die Balancing-Funktion und heizen dieses Blech direkt und recht schnell auf, obwohl der Balance-Strom auf 280 mA begrenzt ist. Da die Gesamtspannung des zu balancierenden Akku 120 V beträgt, könnten immerhin ca. 40 W Verlustleistung anfallen, sollten alle Zellen zur gleichen Zeit mit dem Balance-Strom beaufschlagt werden. In der Realität sind aber nur wenige bis maximal ca. 60 Prozent aller Zellen gleichzeitig betroffen. Trotzdem steigt die Kühlflächentemperatur ohne Luftstrom recht schnell auf 60 Grad, dann pausiert das BMS den Balance Vorgang.

 


Besucher seit
25.11.2000

>