PWM Lüftersteuerung Mosfet ja/nein

Du brauchst im else-Zweig nicht erneut auf den Vorgänger prüfen.
Da kommst Du ja nicht mehr hin.

void loop()
{
  // Temp.- Messung
  float temp = dht.readTemperature();
  dif = temp - tempgo; // tempgo = float(25.00), temp = float(24.00)
  // dif = float(-1.00) somit FanPin = LOW (also Lüfter aus)
  if (dif >= 5)
  {
    digitalWrite(FanPin, HIGH);
    status = " MAX";
  }
  else if (dif >= 4)
  {
    analogWrite(FanPin, 200);
    status = "04/05";
  }
  else if (dif >= 3 )
  {
    analogWrite(FanPin, 150);
    status = "03/05";
  }
  else if (dif >= 2)
  {
    analogWrite(FanPin, 100);
    status = "02/05";
  }
  else if (dif >= 1)
  {
    analogWrite(FanPin, 60);
    status = "01/05";
  }
  else if (dif > 0 )
  {
    analogWrite(FanPin, 30);
    status = " MIN";
  }
  else
  {
    digitalWrite(FanPin, LOW);
    status = " AUS";
  }
  delay(3000);
}

Im Datenblatt steht 200-1800rpm. Von daher gehe ich davon aus, das dies ohne Mosfet die Ursache sein wird. Ich habe den Mosfet wieder eingebaut.

Doch, ich habe den

#define FanPin 9
pinMode (FanPin, OUTPUT);

gesetzt.

Macht es einen Unterschied, ob ich digitalWrite(FanPin, HIGH) verwende oder analogWrite(FanPin, 255)?

Ich habe kein Datenblatt mit einem Schaltplan von dem Lüfter (ARCTIC P12 PWM), wo ich die ganzen Daten auslesen kann. Nur die techn. Beschreibung.

Ups, das stimmt, Thx für den Hinweis.

Gruß
Falke07

https://gzhls.at/blob/ldb/5/5/4/6/92aea9075758163cd18f6c15bf59617b7453.pdf

The P12 PWM PST CO is able to switch into silent passive mode when PWM signal is below 5 % due to its new motor. This allows working at your PC in complete silence without any unwanted noise.

Unter 5% sollte er stehen bleiben.

[Edit]
Sorry, Falsches Datenblatt erwischt.

[/Edit]

Ein entfernen des Mosfets negiert dein PWM Signal.

Du kannst das PWM-Signal auch ohne Mosfet erzeugen.

PC Lüfter arbeiten in der Regel mit 25kHz

Hallo,

leider läuft der Lüfter aber alle 3 Sek. kurz an.
(Im setup delay(2000) und im Loop delay(1000))

Hier mal das Skript. Vielleich ist da ja irgendwo eine falsche Definierung:

#include "DHT.h"
#include "Wire.h"

#define DHTPIN 2 
#define FanPin 9
#define DHTTYPE DHT11
float temp;
float dif;

int solltempmin = 20;
int solltempmax = 32;
float tempgo = 25.00;

int tasterp = 4;
int tasterm = 7;

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  // Temp
  dht.begin();
  TCCR1B = TCCR1B & B11111000 | B00000001;

  //Fan
  pinMode(FanPin,OUTPUT);

  // Taster
  pinMode(tasterp, INPUT);
  pinMode(tasterm, INPUT);
}

void loop() {
  // Temp.- Messung
  float temp = dht.readTemperature();

  dif = temp - tempgo;

  if (dif >= 5) { digitalWrite(FanPin,HIGH); }
  else if (dif >= 4) { analogWrite(FanPin,200); }
  else if (dif >= 3) { analogWrite(FanPin,150); }
  else if (dif >= 2) { analogWrite(FanPin,100); }
  else if (dif >= 1) { analogWrite(FanPin,60); }
  else if (dif > 0) { analogWrite(FanPin,25); }
  else { digitalWrite(FanPin,LOW); }
    
  // Taster
  if(digitalRead(tasterp) == HIGH) {
    ++tempgo;
  }

  if(digitalRead(tasterm) == HIGH) {
    --tempgo;
  }

  if(tempgo <= solltempmin){
    tempgo = solltempmin;
  }

  if(tempgo >= solltempmax){
    tempgo = solltempmax;
  }
    
  delay(1000);
}

Wie hast du die Taster angeschlossen? PullUp/PullDown?
Lass dir doch mal tempgo auf dem SerialMonitor ausgeben.

Hallo,

habe ich alles schon versucht.

  • tempgo wird korrekt gerechnet
  • Taster reagiert korrekt und erhöhe/verringere den Wert entsprechend.
  • dif steuert auch entsprechend den Lüfter

Ich habe mir die Soll, Ist Temperatur anzeigen lassen sowie dif (wie läuft der Lüfter).
Wie gesagt, es funktioniert auch alles wie es soll, nur dass der Lüfter alle 3 sek bei Lüfter = aus kurz anläuft (schwach, ich vermute mal mit 5%)

Das stinkt gewaltig nach Neustart.
Ersetze das setup():

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start...."));
  // Temp
  dht.begin();
  TCCR1B = TCCR1B & B11111000 | B00000001;

  //Fan
  pinMode(FanPin,OUTPUT);

  // Taster
  pinMode(tasterp, INPUT);
  pinMode(tasterm, INPUT);
}

Dann öffne den seriellen Monitor.
Stelle unten rechts 115200 ein..
Wenn jetzt alle 3Sekunden der Lüfter angeht und gleichzeitig immer "Start..." imSerMon auftaucht, startet der tatsächlich neu.
Den Grund musst Du dann suchen.

Was ist "Lüfter = aus"?
Wie kommst du auf die lustige Idee, dass dein Lüfter darunter das gleiche versteht, wie du?

4 Required Features
4.1.1 Polarity Protection
Fan motor shall have polarity protection.
4.1.2 Rotor Lock Protection
Fan rotor shall have lock protection and auto-restart

Ich kenn mich damit nicht aus. Aber sind das nicht 16MHz. Es wird kein Prescaler genutzt.

Habe es 1 x mit Mosfet und einmal ohne Mosfet versucht.
Bei keinem Versuch kam die Meldung.
Jedoch ohne Mosfet startet der Lüfter kurz alle 10 sek. wie beschrieben
(es sind nicht alle 3 sek sonder 10 sek: schlechtes Zeitgefühl ;-( )

Ganz einfach: Ich gehe davon aus, dass wenn ich mitten in einer Diskussion hier bei meiner Aussage "bei Lüfter = aus" voraussetze, dass jeder darunter aufgrund des geposteten Codes versteht, dass das LOW- Signal an den PIN gesendet wurde und somit der Lüfter aus ist.

WoW: Da bin ich raus. Ich habe mir den Wert kopiert und dachte, der wird korrekt angezeigt.
Was ist ein "Prescala"?

Aber: Es geht ja (momentan) nicht um die Temp, sondern darum, dass der Lüfter ohnen Mosfet alle 10 sek. anläuft. oder denkst Du, dass könnte damit zusammen hängen, da der Lüfter ja gem. Datenblatt ein PWM Frequenz von "25kHz nominal, 21-28kHz is acceptable" hat?

Wenn der Lüfter ein 25kHz Signal erwartet und ein anderes bekommt, kann es schon daran liegen, das er nicht läuft.

Wie auch schon von Doc_Arduino erwähnt, solltest du die Timerregister nicht beeinflussen, solange sie aktiv sind.

Prescaler -> Vorteiler
Beeinflusst das Zählen im Takt

Schau mal ob das dir hilft

Und ich habe dir die Spezifikation für PWM Lüfter vorgeführt, aus der ganz klar hervorgeht, dass diese Lüfter einen automatischen Wiederanlauf implementiert haben müssen.
Es dürfte also angebracht sein, dass du deine Annahmen mit der Realität abgleichst.
Bedenke dabei: Die Realität ist immer mächtiger, als du.

Ok,
Da steht:

16 Bit-Timer1: wird z. B. für die Bibliothek Servo, VirtualWire, TimerOne und für PWM an Pin D9 und D10 genutzt

Es geht um einen PWN auf PIN D9 und der sollte 16 Bit haben, was Du ja auch vermutest, das es 16 Bit sind.

Der 16 Bit Timer1 braucht die folgenden Register:
- Timer Counter Control Register B: TCCR1B

Ich habe TCCR1B, nur mit &B11111000 | B00000001 kann ich leider nichts anfangen ;-(

Ergo: dann sollte es doch passen oder nicht?
Da bin ich raus. Soweit reichen meine Kenntnisse dann nicht.

Doc_Arduino hat seinen Kommentar gelöscht. (Ausser die Frage nach der PIN- Anzahl, welche sich auf 4 beläuft)

Weil das von der Spezifikation so eingefordert wird!

2.1.3 Tachometer Output Signal
Fan shall provide tachometer output signal with the following characteristics:
• Two pulses per revolution
• Open-collector or open-drain type output
• Motherboard will have a pull up to 12V, maximum 12.6V

Einfacher ist leider nicht unbedingt richtiger.

GND vom Arduino ist mit dem GND vom Lüfter verbunden?

Yep, GND ist auf dem Steckboard und für alle die gleiche Schiene
(Arduino, Lüfter, Mosfet, DHT11)

Um einen PWM gesteuerten Lüfter vernünftig betreiben zu können bedarf es eines PWM Signals von 25kHz (wurde hier ja schon mehrfach erwähnt). Ob der Lüfter sich dreht oder nicht, liegt nicht nur an der Frequenz oder ob ein Pin LOW oder HIGh ist, sondern am Tastverhältnis des PWM Signals.

Ein Tastverhältnis von 0 (dauerhaft Low) schaltet den Lüfter in der Tat aus. Ein Tastverhältnis von 100% (dauerhaft High) lässt den Lüfter mit maximaler Drehzahl drehen. Bei 50% (50% Low und 50%High) arbeitet der Lüfter mit halber Drehzahl. Bei analogWrite entspricht das wohl den Werten 0, 255 und 128.

In deinem Code verwendest du analogWrite() welches bei Arduino Uno/Nano nur 490 Hz bzw. 980 Hz bereitstellt. Also eigentlich kann das auch mit einem MOS-Fet schon nicht vernünftig funktioniert haben.

Demnach wirst Du dir einen Timer so programmieren müssen, wie es in dem verlinkten Artikel in #33 ansatzweise beschrieben ist, halt für 25kHz. Solange Du nur einen Lüfter steuerst und keine speziellen Bibliotheken benötigst, sollte das mit Timer1 zu machen sein. Allerdigngs braucht man noch den OCR1B (meine ich, kann es nicht auf die Schnelle nachschauen ) um das Tastverhältnis steuern zu können.

Die Spezifikation habe ich verlinkt!

Ein Tastverhältnis von 0% entspricht einem Ausfall der Ansteuerung.
Der Lüfter hat dann laut Spezifikation mit voller Drehzahl zu laufen.
Denn der Serverschrank darf nicht ausglühen, nur weil eine dürre blaue Strippe eine Unterbrechung hat.

If no control signal is present the fan shall operate at maximum RPM

Beachte dazu auch die Unterscheidung in 3 Typen A,B und C

Ok.. ich habe die Spec jetzt aktuell nicht gelesen. Ich habe vor zwei Jahren mal was ähnliches gemacht, weiß es nur nicht mehr im Detail auswendig.

Geht man halt nicht tiefer als 20-30%. Aber das Prinzip ändert sich deshalb ja nicht.

Das Problem hier, scheint mir zu sein, dass der TO und der Lüfter unterschiedliche Vorstellungen von "Lüfter = aus" haben.
Ich gehe vorsichtiger weise davon aus, dass ihm noch nicht mal bewusst ist, welche Lüftertype er da gerade vor sich hat.