Forum: Projekte & Code AVR-Lüfter-Regelung-PWM-LM35


von Michael D. (mike0815)



Lesenswert?

Ich war seit langem auf der Suche nach einer geeigneten Lüfter-Regelung 
und fand weder hier, noch im WorldWideWeb, das passende Konstrukt.
Die Kriterien waren:
1. Relativ kompakter Aufbau
2. Teile, die vorhanden sind
3. Optische Anzeige der Zustände( per LEDs und/oder LCD-Anzeige)
4. Steuerung per PWM
5. Kaum oder keine Wärmeentwicklung der Komponenten
6. Individueller Aufbau für verschiedenen Anwendungsbereiche

Die Platine mißt: 70x 45mm
Ein ATmega8 steuert 2 Lüfterausgänge mit je einem BD139
Wegen der PWM würden auch 2N2222 ausreichen,
für je einen 80mm Lüfter mit 12V und 200mA Stromaufnahme.
Der LM35 ist der Temperatursensor. Als Referenzspannung für den Sensor 
habe ich die vom jeweiligen Prozessor, für die Umrechnung der Temperatur 
verwendet.
Beispiel:
Der M328 hat eine interne Referenz von 1,1V (100nF am AREF-Pin für den 
Puffer ist obligatorisch)

Im Code sieht  das dann so aus:
M328 internal Ref. 1.1/ 1024=1.0742mV  1°C=10mV/ 1.0742=9.31 (Faktor)

oder
M8   internal Ref. 2.56/ 1024=4.0000mV  1°C=10mV/ 2.5000=4.00(Faktor)
Da auch in den internen Referenzen eine Toleranz aufweisen, kann man die 
nachmessen. In meinem Fall waren es beim M8 dann 2,601V!
Dann wäre der Faktor 3,93

Die Schaltung kann wahlweise mit oder ohne 2x16er Display ausgestattet 
werden. Da wird die Platine mit Ergänzung der Buchsenleiste natürlich 
etwas größer.
Angezeigt wird die aktuelle Temperatur in Celsius und darunter die 
Lüfterdrehzahl in % (siehe Pics)

Des Weiteren werden die Zustände über 3 LEDs angezeigt:
Low  bis 30°C(Grün)
High  ab 31°C(Orange)
Alert ab 50°C(Rot) und darüber (Orange u. Rot leuchtet)
Die Temperatur-Vorgaben können im Code natürlich geändert werden!

Den Code hatte ich als Schnippsel für die Arduino Platform.
Der Vorteil ist, man kann ihn in verschiedene Prozessoren portieren
z.B.: M328/88/48, M8, ATTiny24/44/84 und ATTiny25/45/85
Dann wird die Platine natürlich noch kompakter!
Bei den ATTiny's ist dann aber kein Platz mehr für ein Display, ist ja 
klar!
Ein Prototyp mit Display auf Lochraster und ein Finale(ohne 
Display)etwas aufgehübscht, als Pc im Anhang, sowie der Schaltplan und 
Code.

Verbesserungen und konstruktive Kritik, sind natürlich erwünscht!

Gruß Michael

EDIT:
Ich habe leider den falschen Schaltplan hochgeladen. Was fehlt ist nur 
der 100nF Puffer-Kerko am AREF-Pin des Atmega.

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Hallo Michael,

danke für die Vorstellung deines Projektes.

Als Anregung, zu deiner Frage zum attiny85 und LCD, ich verwende 
manchmal auch LCD mit I2C oder seriellem Interface, hier habe 2 
unterschiedliche Möglichkeiten realisiert.

von Michael D. (mike0815)


Lesenswert?

Hallo Karl,

natürlich kann man das ansteuern eines Display's mit I2C, wenn  die 
"Füße" beim ATTiny85 nicht ausreichen. Tatsächlich, wollte ich das auch 
erwähnen. Da kommt es darauf an, wie das "Motherboard" von den 
Dimensionen her, aussehen soll. Sinn würde es machen, wenn das Display 
als eigene Einheit und nicht auf der Steuerplatine, eingesetzt würde.
Manchmal ist ja für das eine oder andere Nachrüsten, zu wenig Platz 
vorhanden.
Der Atmega8 im DIL28, ist da schon recht groß. Der Speicher aber 
derselbe, wie beim ATTiny85.

Deine 2 realisierten Möglichkeiten interessieren mich natürlich. Wäre 
schön, die hier mal zu posten ;-)

Gruß Michael

von Karl M. (Gast)


Lesenswert?

Ein weiteres 3.tes Projekt von Peter Dannegger (peda) habe ich hier 
gefunden:

Beitrag "Re: LCD über nur einen IO-Pin ansteuern"

Funktioniert auch sehr gut.

von Michael D. (mike0815)


Lesenswert?

@Karl
entschuldige die späte Resonanz, war die Woche sehr eingespannt...
Das ist natürlich eine sehr kompakte Alternative. Was mich jetzt stört 
ist, das der ATTiny13 durch das Update der automatischen 
Baudratenerkennung, nicht mehr verwendet werden kann. Der Winzling 
kostet gerade mal ein paar Cent.
Leider hab ich es nicht geschafft, den Code vom Peter Dannegger zu 
kompilieren, während der Code vom Uwe S. kein Problem darstellte.
Schade, hätte es auf dem ATTiny13 gerne mal getestet...

von Michael D. (mike0815)



Lesenswert?

Ich habe mal den Code überarbeitet und natürlich wieder auf den ATMega8 
portiert, da der ATMega168/328 mir etwas oversized erscheint!
Das Display, kann optional verwendet werden.
Wenn ohne Display (wegen der Kompaktheit), kann dann auch wieder einer 
der
8 beinigen  ATTiny's verwendet werden.
Die Lüfterstufen werden in 5% Schritten hochgeschaltet
bei z.B. min.30° max.50°C
Das Floating wird jetzt auf dem Display, korrekt angezeigt
(2 Stellen nach Komma)
An den Nachkommastellen macht sich leider noch ein "Gezappel" breit, mal 
sehen, wie man das noch in den Griff bekommt.
Angefangen, hab ich schon mal mit dem " byte measureCycles = 10;", ist 
aber noch nicht so ganz wirksam, vielleicht kann sich da ja mal Jemand, 
dessen annehmen ;-)

Anbei mal ein Temperaturvergleich zwischen dem Dallas DS18B20 und dem 
LM35.
Da der LM35 ja analog misst, wird auch hier weiterhin die interne 
Referenz benutzt. Man sollte die genaue Spannung vorher am AREF. Pin 
messen und dann im Code angeben, dann werden die Messungen etwas 
genauer.

anbei ein paar Pics Code und Hex mit
Einschalt-Temperatur ab 30°-50°C (100%)

Gruß Michael

von Karl M. (Gast)


Lesenswert?

Hallo Michael,

welchen Sinn hat es 2 Nachkommastellen auf dem LCD anzuzeigen ?

Wie genau, absolut ist denn der analoge Sensor und die analoge Messung 
der Spannung ?

Mache eine daraus 0.5°C oder wirklich nur in 1°C Auflösung.
Da wird sich das "zappelen" selbst ausbremsen.

von Michael D. (mike0815)



Lesenswert?

Hallo Karl,
die 2 Nachkommastellen sind natürlich überflüssig, da geb ich dir Recht!
Es ist leider so, das wenn "Float" verwendet wird, da automatisch 2 
Stellen nach dem Komma angezeigt werden.
Hab mich gestern mal hingesetzt und das gefixt. Es wird nur noch eine 
Nachkommastelle angezeigt. Bis ich mal herausgefunden hatte, wie ich die 
letzte Stelle weg bekomme, darf ich niemanden erzählen...dabei war das 
ganz einfach!
Das Gezappel allerdings, war immer noch da. Es gibt da einige 
Prozeduren, das zu disziplinieren, ist aber ein ganz schöner Aufriss!
Bei dem Aktuellen Code, konnte ich das mit diversen Spielereien an den 
Delays in den Griff bekommen.
Der 2.Code ist da etwas voller gepackt. Da werden 5 Messzyklen gelistet 
und von denen, der Mittelwert errechnet.
Das nächste Problem ist natürlich der fliegende aufbau mit langen 
Strippen! Da ist der LM35 etwas empfindlich. Man sollte so ab 10cm eine 
abgeschirmte Leitung verwenden wegen den Parasiten, die da einstreuen.
Des Weiteren habe ich noch eine kleine Entschärfung (laut Datenblatt) 
vorgenommen. Vom Sensorpin nach GND, wird ein 1µF Elko in Serie mit 
einem 82R Widerstand ergänzt.
Als nächstes möchte ich noch einen 2.Sensor bestücken, der dann 
unabhängig den 2.Lüfter-Kanal ansteuert.
Der soll dann in meiner Audio Endstufe, auf den 2.Kühlkörper seinen 
Dienst tun.
Eigentlich wäre da Ein Dallas besser geeignet, mal sehen...

Im Anhang der Arduino Code "LM35_M8_Display_Fancontrol_float2" Ohne 
Gezappel und eine Nachkomma Stelle.
                       und "LM35_M8_Display_Fancontrol_float3"
mit dem erwähnten Mittelwert Mittelwertgedöns.
Beide Code's sind wieder auf dem ATMega8 mit internem Takt von 8MHz 
portiert.
Die Fuse Bits sind "Low: 0xE4 High: 0xD9 Lock: 0xFF



Gruß Michael

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.