nachdem ich wirklich lange gesucht habe um meinen 4-PIN Lüfter mit dem Arduino einfach zu regeln hier nun ein kurzer Code-Schnipsel wie ich zu einer Lösung gekommen bin.
Das Problem ist bei der direkten Ansteuerung über einen PWM-Ausgang des Arduino die falsche Frequenz die er generiert.
Man kann das mit der TimerOne-Bibliothek umgehen. Die Bibliothek gibt die Möglichkeit in einem frei wählbaren Intervall Aktionen auszuführen, unter anderem auch ein PWM-Signal zu senden. Die Initialisierung des Timers erfolgt mit einer MIKROsekundenangabe. Mein Lüfter braucht eine PWM Frequenz von 25Khz (Intelspezifikation). Das entspricht einer 40 Mikrosekunden-Periode. Das PWM-Signal des Timers kann von 0-1023 angegeben werden.
Möchte man den Lüfter auch ganz ausschalten funktioniert die Schaltung so nicht. Dann müsste man noch einen Transistor (MOSFET o.Ä.) als Schalter einbauen.
Da ich für meine Zwecke den Lüfter eh nie ganz ausgehen lasse reicht diese Vorgehensweise aber für mich.
Ich habe das Ganze auch mit dem PIN 9 probiert, hatte aber nur mit dem PIN 10 Erfolg.
Ich bin für Verbesserungen und Vorschläge offen da ich mich erst seit Kurzem mit der Elektronik beschäftige.
#include <TimerOne.h> // Timer Bibliothek
#define LUEFTER_PIN 10 // BeQuiet 120mm 2,4W (12V)
#define PWM_FREQUENZ 25000 // Frequenz des PWM Signals für den Lüfter = 25000 Hz = 25kHz
// entspricht 0,00004 Sekunden = alle 40 Mikrosekunden
// (Maximum 1Mhz = 1000000Hz)
int iFanValue; //Lüfterstärke 0-100 (%)
/********************************************************************
setup()
Arduino Setup Funktion
********************************************************************/
void setup()
{
Timer1.initialize(1000000/PWM_FREQUENZ); // Initialisierung des PWM Timers
Timer1.pwm(LUEFTER_PIN,0); // PWM des Timers setzen, zunächst 0
pinMode(LUEFTER_PIN,OUTPUT); // Lüfterpin als Ausgang
}
/********************************************************************
loop()
Arduino Hauptschleife
********************************************************************/
void loop()
{
// Hier kann nun die Variable "iFanValue" (0-100) geändert werden
// (per Potie oder über einen Temperartursensor oder Ähnliches)
// Lüfter updaten und Wert setzen
Timer1.setPwmDuty(LUEFTER_PIN, map(iFanValue,0,100,0,1023));
}
ich habe das Ganze recht unproblematisch mit einem Buck-Konverter gelöst, welcher mir eine babypopoglatte Gleichspannung zwischen 0V und 12V (ist recht beliebig, darf auch mehr sein) generiert und über 31,3KHz PWM angesteuert wird.
Damit ist man auch nicht mehr abhängig von 4 oder 3 Pin Lüftern, sondern kann jeden beliebigen Lüfter verwenden. Auch das Auslesen des Tachosignals ist dadurch einfach und ohne Umwege (Krücke bei 3Pin zB PWM kurzzeitig auf 100% setzen, auslesen, wieder PWM'en) möglich.
Man braucht nur 2 Transistoren, 4-5 Wiederstände, ne kleine 10mH Spule und ne schnelle Diode dafür. Sehr einfach zusammenzubraten und universell einsetzbar. Kosten vielleicht so um die 3 Euro.
Wenn Du interessiert bist schicke ich Dir weiterführende Infos.
ja da bin ich absolut interessiert. Das wird nicht der letzte Lüfter sein den ich verbaut habe.
Ich hatte vorher schon einen 2-Pin Lüfter angesteuert, mit einem Transistor. Das hat natürlich immer gefiept. Aber mit einem Kondensator parallel zum Lüfter ging das auch.
Da ich aber eben diesen 4-Pin Lüfter schon hatte und hier ja schon eine Steuerungselektronik verbaut ist dachte ich, ich nutze diese auch
erst einmal das Schaltbild des Konverters (im Anhang) auch zu finden auf der sehr lehrreichen Seite:
Als Diode reicht eine Stino N4001 aber ich habe lieber ne schnelle Schottky-Diode genommen. Als Elko hab ich glaube ich nen 47µ oder 100µ gewählt (was halt grad so rumlag - is aber auch nich so entscheident, halt Spannung beachten)
Dazu nur die entsrechende Spannung und den benötigten Strom sowie die gewählte PWM Frequenz eintragen. Bedenke je höher die Frequenz, desto kleiner die Spule (meine 10mH habe ich von Reichelt - wenn Du sie nicht findest suche ich Dir den Link raus).
Die Frequenz kann man bei den Arduinos dann mit
TCCRnB = TCCRnB & 0b11111000 | HexWertTabelle;
in setup() definieren.
Timer 0 nach Möglichkeit aber nicht benutzen, da dieser auch andere Funktionen wie millis(), delay usw beeinflusst. Müsstest Deinen Code sonst entsprechend anpassen.
für Timer1 und 31,3kHz würde man dann schreiben:
TCCR1B = TCCR1B & 0b11111000 | 0x01;
Lötkolben anheizen und das wars dann eigentlich auch schon (sollte ich was vergesen haben oder Du noch Fragen hast sach Bescheid)
PS:
"Aber mit einem Kondensator parallel zum Lüfter ging das auch."
Achtung nich vergesen: Bei induktiven Lasten MUSS auf jeden Fall ne Leerlauf-Diode mit rangeklöppelt werden, da immer Strom induziert wird wenn das PWM Signal auf LOW geht. Genauso zB bei Relais beim Ausschalten. Zerbröselt Dir sonst über Kurz oder Lang die Schaltung.