Lüftersteuerung über PWM und Mosfet

Hallo,
ich möchte gern ein 5V Lüfter über ein PWM Signal steuern. Ich habe soweit alles verkabelt, wie ich in Vorlagen bei Google gefunden habe. Jedoch läuft der Lüfter leider nicht an. Ich weiß jetzt nicht, ob am Code etwas falsch ist, oder die Verschaltung nicht korrekt ist.
Schalte ich anstatt dem Mosfet einen Transistor, läuft der Lüfter, piept jedoch am Anfang, bevor er los dreht.
Ich nutze einen ESP32, der Lüfter ist ein 2-Draht 5V Lüfter. Der Mosfet ist ein IRFZ44N, der Transistor ein PN 2222A.

Vielleicht kann mir jemand weiterhelfen?

const int Luefter = 14;
const int freq = 200;
const int ledChannel = 0;
const int resolution = 8;


void setup() {

  Serial.begin(115200);
  ledcSetup(ledChannel, freq, resolution);
  ledcAttachPin(Luefter, ledChannel);
  pinMode(Luefter, OUTPUT);
}

void loop() {

  ledcWrite(ledChannel, 120);
  delay(5000); 
  ledcWrite(ledChannel, 255);
   delay(5000);
  ledcWrite(ledChannel, 0);
  delay(5000);
}

Hallo,

der IRFZ44N ist dafür ungeeignet. Das ist ein 10V Volt Typ Gatespannung. Dein ESP kann aber nur 3,3V anlegen. Der Mosfet beginnt praktisch mit 3,3V erst leitend zu werden und hat damit einen zu hohen RDSon, womit der Motor keine Chance hat. Wenn dich der NPN nicht stört, dann nimm den. Beachte den maximalen I/O Strom vom ESP welcher der Basisstrom vom NPN ist. Und beachte das der NPN ausreichend durchgesteuert wird. Unter Umständen wenn notwendig könntest du beide kombinieren.

jetzt läuft der Lüfter über den PWM Code leider gar nicht, was für eine Frequenz müsste ich den im Code angeben?

Gibt es deinen einen alternativen Mosfet, den ich nutzen könnte?

Habe jetzt den Transistor Basispin am Pin14 des ESP angeschlossen, davor sitzt 1kOhm Widerstand. Der Emitterpin ist mit GND verbunden, der Collektorpin mit der Minusleitung des Lüfters.

Hallo,

manche herkömmliche Lüfter vertragen PWM und manche nicht. Dein NPN kann auch kaputt gegangen sein. Ich weiß es nicht. Mit 100Hz sollte jeder Lüfter anlaufen solange er das verträgt. Man kann auch höhere Frequenzen ausprobieren. Wobei deine 200Hz auch sicher funktionieren sollten. Wenn er arg brummt oder Zicken macht muss man ihn analog betreiben.
Du kannst ihn testen wenn du 100% Duty rausgibst. Also Dauerspannung. Dann miss am NPN die Sättigungsspannung. Welche Daten hat der Lüfter?
Die Diode am Lüfter sollte eine normale Si Diode sein. Keine Z-Diode laut Zeichnung.
Schreib mal dein Sketch um womit du mittels Poti das Duty ändern kannst. Sonst musst du laufend neu flashen um auch einmal dauerhaft eine Einstellung beibehalten zu können.

Deinen Sketch kann ich in der Gesamtheit nicht prüfen mangels ESP32.

Bevor man den ESP kaputt macht kann man das auch ohne ESP aufbauen. Ggf. mit Taster als I/O Pin Ersatz. Oder erstmal eine Led statt Motor.

Habe den Lüfter jetzt einfach mal mit digitalWrite eingeschaltet. Da läuft er problemlos.
Das mit dem Poti , bzw der led ist ein guter tip. Mal gucken ob ich noch einen Poti habe ,ansonsten kann ich ja mal wirklich ne led nehmen und die einfach mal hell und dunkel werden lassen.

Die Diode ist eine eine 1N4007. Kann sein das ich da eine falsche im Schaltbild hatte.

Der Lüfter ist dieser.

2Pcs 80mm Lüfter 80x80x25mm Lüfter DC 5V 8025 Bürstenloser Kühler für Kühlen PC Computer Fall CPU Kühler Radiatoren 2pin https://amzn.eu/d/5ywRgRQ

Würde sonst nochmal den Lüfter mit externen 5V zu versorgen. Vielleicht bringt das ja auch etwas

ok der Lüfter läuft jetzt soweit. Vermute mal irgendetwas im Code war verkehrt.

Jedoch piept er jetzt beim loslaufen, bzw. wenn er in geringer Drehzahl laufen soll.

Bzw. er läuft am Anfang gar nicht an, sondern ich muss ihn per Hand andrehen, ich vermute mal die Spannung könnte zu gering sein?

Mich wundert es nur, das es viele Beispiele mit Arduinos gibt, wo die ganze Sache mit dem Mosfet läuft

Hallo,

Diode 1N4007. Okay. :wink:

Motorstrom ist 250mA. Könnte mit dem NPN schon Probleme machen, der hat ggf. zu wenig Verstärkung, damit eine zu hohe Sättigungsspannung, damit der Motor zu wenig Spannung. Warum das mit digitalWrite dann wiederum funktioniert kann ich erstmal nicht sagen, weil ledcWrite(pin, 255) sollte gleich digitalWrite(pin, HIGH) sein. Nur kenne ich ledcWrite nicht. Kenne nur analogWrite.

Du kannst, auf eigene Gefahr, den Basiswiderstand auf bis 330 Ohm reduzieren. Das sollte der ESP können. Damit wird der NPN mehr durchgesteuert.

Mach einmal eine vorher/nachher Messung der Sättigungsspannung!

Kannst auch einen Testaufbau machen und den Motor durch einen 2W 20 Ohm Widerstand ersetzen und messen. Lebt der NPN noch?

Leg dir mal paar NPN BC337-40 und PNP BC327-40 hin. Mit denen kann man mehr anfangen.

3,3V Logic Mosfet Steckbrettfreundlich wird schwierig. Im TO220 kann man einen IRLZ34N zweckentfremden. Der ist bis runter 4V spezifiert und kann unter normalen Bedingungen auch locker mit 3,3V umgehen. Alle anderen die dafür richtig spezifiert sind, gibt es nur im SMD Bauform. Ich kenne keinen THT Logic Level der offziell mit unter 4,5V umgehen kann. Falls das die Frage war. Man muss aber nicht immer Mosfet nehmen.

Mich wundert es nur, das es viele Beispiele mit Arduinos gibt, wo die ganze Sache mit dem Mosfet läuft.

Naja, Mosfet ist ja nicht gleich Mosfet. Viele kennen die Unterschiede nicht. Es gibt ja nicht den einen Transistor und nicht den einen Mosfet. Andere betreiben mit deinem Mosfettyp einen 12V Lüfter dem 2V weniger nicht stören. Bei dir dann schon usw.

Wegen Fiepton. Das kommt von der PWM Ansteuerung. Kannst mit der Frequenz spielen oder nicht. Irgendwas wirst du immer hören. Wenn du nicht glücklich wirst musst du dir einen 4 poligen PWM Lüfter kaufen. Bsp. https://noctua.at/de/nf-a8-5v-pwm dafür brauchste ein 25kHz PWM Signal.

Ein ESP ist kein Arduino!

Der FET ist kein LL FET.
Schon gar nicht an einem LL von 3,3V

habe jetzt mal festgestellt, das der Lüfter erst teilweise ab ca einem Viertel der Drehzahl von selbst anläuft, kann man da noch etwas machen? Er startet erst bei einem PWM Wert von 60-70. Wenn ich die Werte wieder runtersetzen lasse, bleibt er so ca bei 20 stehen.

Braucht der noch zuviel Strom um das Drehmoment aufzubringen?

Daher Starten viele Lüfter mit 100% und regeln dann herunter.

Versuche mal mit 19500
Wenn wie bei dir "piept" musst du hoher als die 200 die du jetzt hast.

Bei 200 ist das jetzt eher ein Brummen. Und je höher die Frequenz ist, desto später läuft er irgendwie von selbst an.

Da ich ja später die Drehzahl über eine
Temperatur regeln möchte, wollte ich das eigentlich so machen, dass er Langsam hochdrehen würde.

Dann brauchst du einen Lüfter mit Tacho!
Also einen 3 Pin Lüfter,
Nicht alle funktionieren gut an PWM, manche mögen es lieber Spannungsgesteuert.

Noch besser: Einen 4 Pin Lüfter, also einen mit PWM Eingang und Tacho
Die starten allerdings auch meist mit recht hoher Drehzahl und fallen erst nach weinigen Sekunden in die Regelung.

Immer wieder hilfreich: Datenblatt lesen....
Und ja, auch zu Lüftern gibt es Spezifikationen, welche man einhalten sollte/muss.

Hallo ,

das 2 Pin Lüfter erst ab ca. 30,% PWM Spannung vernünftig anlaufen , ist schon ein guter Wert. Bei Lüftern hat die Luftmenge einen quadratischen Verlauf in Abhängigkeit der Drehzahl. Damit hast du bei 30% Spannung ehr weniger als 30% Drehzahl und die Luftmenge ist nochmals wesentlich kleiner.
Vermutlich kannst du so etwa 10-100 % der Luftmenge einstellen,

Nachtrag
Ich habe das gerade noch mal nachgesehen , hatte Zweifel und muss mich korregieren
Der Volumenstrom ist proportional zur Drehzahl.
Der Druck ist quadratisch zur Drehzahl.

Das kann durchaus normal sein. Jeder Lüfter benötigt eine Mindestspannung zum anlaufen. Da dein Lüfter eigentlich nicht für PWM geeignet ist, wird er nochmals eine leicht höhere Anlaufspannung benötigen. Der normale Vorgang jeder guten Lüftersteuerung ist mit 100% zu starten, schauen ob er angelaufen ist und dann runterregeln. Den Mindest-Duty hast nun schon mit "20" festgestellt. Wenn du damit klar kommst ist okay. Ansonsten wie schon gesagt einen passenden PWM Lüfter kaufen oder deinen mit mehr Aufwand analog ansteuern.
DAC > OPV inkl. kleiner Verstärkung > NPN als Impedanzwandler > Lüfter.
Der ESP32 sollte einen DAC Ausgang haben. Damit wäre das Problem der Frequenz und Fiepton nicht gegeben. Bsp. wie man das machen könnte. Das hatte ich einmal vermessen. Ob das den Aufwand lohnt musst du wissen, falls das Experimentierfieber ausspricht.

Klinkt auch interessant. Müsste ich dann dort 12v anlegen, oder kann ich das weiter mit 5v betreiben?
Die Widerstandswerte sind vorgegeben, oder kann man die irgendwo berechnen, hatte mit den Opv noch nicht gearbeitet.

Hatte sonst auch gelesen bei nem 4 Pin Lüfter würde ich keinen Transistor, bzw. Mosfet benötigen?

Hallo,

wenn du Experimentierfreude haben solltest, musst du alle Werte anpassen. Vorn kämen bei dir ja nur 3,3V rein und der Lüfter bekommt 5V. Die Verstärkung mit 2,5 wäre dafür zu hoch.

Ein echter PWM Lüfter wäre immer noch am Einfachsten.
Intel Spec
Noctua Spec
Du kannst das "PWM Control Signal" direkt an den Lüfter klemmen. Zwischen 3,3V - 5V ist alles okay. Kannst noch 470 Ohm oder so als Längswiderstand nehmen für gröbsten Kurzschlußschutz beim Testaufbau.
Der Drehzahlausgang vom Lüfter ist dagegen "open collector". Dafür wird ein Pullup benötigt zur Anpassung an deine Spannungsverhältnisse. Siehe Dokumente.

Ok, wenn ich das richtig verstehe klemme ich die Spannungsversorgung direkt an. Der PWM Pin vom Lüfter wird mit dem PWM vom Mikrocontroller verbunden und so angesteuert wie ich das hatte. der Tacho Anschluss wird mit einem Pin verbunden und über einen Widerstand mit 5V verbunden.

Hatte jetzt Beispiele gelesen, wo die Drehzahl über interrupt oder pulsen ausgelesen wird. Oder gibt es da noch andere Möglichkeiten ?

Sonst muss ich in Ruhe mal die Datenblätter anschauen. Den Noctua Lüfter habe ich jetzt da

Ja, du kannst einen Timer/Counter verwenden.

Hallo,

es gibt wie immer verschiedene Möglichkeiten. Man könnte per micros() die Zeit zwischen den Interrupts messen. Das kannste noch sampeln und Mittelwertbildung vollführen.

struct Fan {
  volatile unsigned long lastTime;
  volatile unsigned long period;
};
Fan fan;
...
...
attachInterrupt(pinFan, interruptFanPuls, FALLING);
...
...
void interruptFanPuls()
{
  const unsigned long time { micros() };
  fan.period = time - fan.lastTime;
  fan.lastTime = time;
}

'fan.period' musste dann Interrupt sicher weiterverarbeiten, umrechnen usw.. Stichwort Atomic Block.