Drehzahlabfrage Lüfter liefert unplausible Werte

Hallo,

ich bin relativ neu in der Arduino Welt und gerade über meinem ersten richtigen Projekt.
Ich will einen 4 Pin Lüfter über PWM ansteuern (funktioniert) und die Drehzahl ausgeben (funktioniert nicht) um ihn später regeln zu können.

Bei dem Lüfter handelt es sich um einen Noctua NF-14 5V PWM (Datenblatt im Anhang), mein Arduino ist ein Uno.
Beide werden über USB per Strom versorgt und an einem Gerät (Laptop, später Powerbank) eingesteckt (deshalb gehe ich von gemeinsamer Masse aus).
Zwischen dem Tachopin des Lüfters und den +5V der Stromversorgung habe ich einen 10kOhm Pullup Widerstand eingelötet, ansonsten sind keine weiteren Bauteile verbaut.
Um die 25kHz Problematik des Arduino bei der PWM-Frequenz zu umgehen habe ich den dafür passenden Code aus dem Internet übernommen.
Das Auslesen des Tachosignals ist selbst geschrieben.

Das Problem ist, dass ich unplausible Drehzahlwerte erhalte; bei 100% PWM Tastfrequenz erhalte ich Werte von über 2600rpm, die Maximaldrehzahl des Lüfters laut Datenblatt liegt jedoch bei 1500 +/-10%.

Hier mein Code:

#include <TimerOne.h>     // Timer Bibliothek

#define LUEFTER_PIN 10    // Lüfter: Noctua NF-A14 5V PWM
#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)
#define RPM_PIN 9           //Pin des Tachosignals

int iFanValue;      //Lüfterstärke 0-100 (%)
long LOW_ZEIT;      //Dauer einer Periode - LOW bis LOW - entspricht Zeit einer halben Umdrehung
long RPM;           //Drehzahl in rpm

/********************************************************************
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
  pinMode(RPM_PIN, INPUT);
  Serial.begin(9600);
}

/********************************************************************
loop()
Arduino Hauptschleife
********************************************************************/
void loop()
{
  
  iFanValue=100; // PWM Tastverhältnis in %
  // Lüfter updaten und Wert setzen
  Timer1.setPwmDuty(LUEFTER_PIN, map(iFanValue,0,100,0,1023)); 
  LOW_ZEIT=pulseIn(RPM_PIN, LOW);
  RPM=60000000/(2*LOW_ZEIT);    //2 Impulse pro Umdrehung
  Serial.println(RPM);
 
}

Ich erhalte beispielsweise Drehzahlen von: 2760 2610 2748 2651 2772 2616 2749 2652 2755 2607…
Kann es sein, dass pulseIn auf Timer1 zurückgreift und deshalb falsche Werte liefert?

Oder kann ich die Schaltung nicht einfach so “Kabel zu Kabel” verbinden mit nur diesem einen Pullup Widerstand?

Vielen Dank für eure Hilfe,
Max

Noctua NF-A14 5V PWM Product Specifications.pdf (430 KB)

Im Datenblatt sehe ich "2 pulses / rotation". Du mißt die LOW-Zeit, also ein Viertel von zwei Pulsen. Müßte es dann nicht RPM=60000000/(4*LOW_ZEIT); sein?

Was agmue schreibt, ist richtig, wenn das Tastverhältnis des Lüftersignals bei genau 50 % liegt.

Man kann aber wohl davon ausgehen, dass die Summe von LOW- und HIGH-Zeit einer halben Umdrehung entspricht.

Davon abgesehen brauchst Du doch aber die Impulse nur zu zählen - oder habe ich jetzt etwas falcsh verstanden?

Gruß

Gregor

Oh man, danke!

Ich hab mir die Beschreibung der Funktion pulseIn extra zweimal durchgelesen, und war so fest davon überzeugt, dass ich sie richtig verstanden hab.

Vielen dank!

Wenn ich mit pulseIn high und low abfrage und beide addiere -> halbe Umdrehung, komme ich echt gut hin
gemessen bei 100% Tastverhältnis: 1460 Soll: 1500 +/-10%
gemessen bei 60% Tastverhältnis: 960 Soll: 1000

Also passt echt gut!
Vielen Dank

Dann mache ich mich mal ans Rausfinden meiner Sprungantwort für die Reglerparametrierung (ich weiß, 2-Punktregelung wäre auch was, aber ich wills mal versuchen mit einem PI Regler)

Hallo,

ich halte die nur Low oder nur High Time Messung für einen Irrweg.
Ihr kennt weder die Periodendauer noch die Pulsform des Drehzahlausgangs.
Ihr wisst nur das der Lüfter pro Umdrehung 2 Pulse liefert.
Also messt bitte die Pulse pro Zeit und rechnet das in eine Drehzahl um.

Sämtliche Duty Cycle Angaben beziehen sich auf die Drehzahl/PWM Ansteuerung.
Also das was zum Lüfter geschickt wird.

ich halte die nur Low oder nur High Time Messung für einen Irrweg

Selbstverständlich braucht man beide Zeiten, die man dann zusammen addiert.

Hat aber keinen Vorteil gegenüber der Zeitmessung von einer Flanke bis zur nächsten Flanke gleicher Richtung (außer, dass es dafür keine Arduino-Komfort-Funktion wie pulseIn gibt).

Wenn es genügend Pulse sind, ist naürlich Pulsanzahl/Zeit genau genug.

Hallo,

im Grunde wollte ich nur auf den kleinen Fehler hinweisen. :wink: