4.1.1 - Statische Drehzahl auslesen

 

Um zu zeigen, wie man bei einem 3 Pin Lüfter die Drehzahl auslesen kann, fange ich mit einem einfachen Beispiel an, damit der Code möglichst übersichtlich ist und man ihn besser versteht.
Dazu steure ich den Lüfter mit einem festen PWM Wert an und lese dann mit Hilfe des Pulse Stretching die Drehzahl aus.
 
 
 
 

Teileliste

 
 
 
 

Anschlussplan

 
anschlussplan 4.1     schaltplan 4.1
 
 
 
 

Code

 

// Konstanten
const int fanPin = 9;          // Lüfter an Pin 9 angeschlossen
const int tachoPin = 2;        // Pin des Tachosignals des Lüfters

// Variablen
int fanSpeed = 160;            // Variable für die Lüftergeschwindigkeit
int abfrZeit = 2000;           // Zeitabstand für die Abfragen des Tachosignals
long tachoMillis = abfrZeit;   // Zeitabstand für Pulse Stretching Funktion 
float rps = 0;                 // Variable mit Kommastelle für die Berechnung der Umdrehungen pro Sekunde
int rpm = 0;                   // Variable für die gemittelte Drehzahl
float umdrZeit = 0;            // Variable mit Kommastelle für die Zeit pro Umdrehung des Lüfters
float flankenZeit =0;          // Variable mit Kommastelle für die Zeit pro Puls des Lüfters 
 
 
void setup()
{
  TCCR1B = TCCR1B & 0b11111000 | 0x01;    // Setzt Timer1 (Pin 9 und 10) auf 31000Hz
  Serial.begin(9600);
  pinMode(fanPin, OUTPUT);      //Setzt den Lüfter Pin als Ausgang
  pinMode(tachoPin, INPUT);     //Setzt den Tacho Pin als Eingang
}
 
 
void loop()
{
  analogWrite(fanPin, fanSpeed);     // Gibt die Variable mit PWM aus
  
  // Alle 2000ms pulse_stretch starten um die Drehzal auszulesen
  if((millis() - tachoMillis) >= abfrZeit)
  {      
    pulse_stretch();
  }
}


void pulse_stretch()
{
  analogWrite(fanPin, 255);                 // Den Lüfter konstant mit Strom versorgen damit das Tachosignal funktioniert
  flankenZeit = pulseIn(tachoPin, HIGH);    // Abfrage der Zeit pro Puls in Mikrosekunden
  analogWrite(fanPin, fanSpeed);            // Setzt die Lüftergeschwindigkeit zurück
  umdrZeit = ((flankenZeit * 4)/1000);      // Berechnung der Zeit pro Umdrehung in Millisekunden
  rps = (1000/umdrZeit);                    // Umrechnung auf Umdrehungen pro Sekunde
  rpm = (rps*60);                           // Umrechnung auf Umdrehungen pro Minute
  
  Serial.println(rpm);                      // Ausgabe der Drehzahl im Seriellen Monitor
  
  tachoMillis = millis();      // Die TachoMillis werden aktualisiert um die nächsten 2000ms zählen zu können    
}

 
 
In den Variablen habe ich Beispielhaft als festen PWM Wert fanSpeed = 160 eingestellt. Die restlichen Variablen sind für die Erfassung und Berechnung der RPM und sind selbsterklärend.
Im loop wird der fanSpeed per analogWrite an den Lüfter ausgegeben und so eine feste Lüftergeschwindigkeit vorgegeben, die wir hier nur als Demonstrationswert brauchen.
Als nächstes wird per if Befehl abgefragt, ob 2000ms vergangen sind. Wenn das zutrifft wird die Funktion pulse_stretch ausgeführt.

Jetzt kommt der spannendere Teil. In der puls_stretch Funktion wird als erstes der Lüfter mit einem PWM Wert von 255 (100%) angesteuert, damit er ein sauberes Tachosignal ausgibt.
Dann wird die Zeit zwischen zwei Flanken des Tachosignals per pulsIn Befehl (erklärungerfasst und in der Variable flankenZeit gespeichert. Dieser Vorgang dauert nur wenige Millisekunden und beeinflusst so die Drehzahl nicht viel.
Anschließend senken wir die Geschwindigkeit des Lüfters wieder auf seinen Ausgangswert.
Jetzt kommt die Berechnung der Drehzahl mittels der erfassten flankenZeit. Der berechnete Wert wird dann am Seriellen Monitor dargestellt.
Zum Schluss muss die Variable tachoMillis auf den aktuellen Wert der millis gesetzt werden, damit die nächste Abfrage im loop funktioniert und pulse_stretch wieder ausgeführt werden kann.
 
 
Das war es auch schon  fertig
 
 
 
 
        downloadbutton arduino
 
 
 
 

Seitennavigation
 
                           arrow button up               arrow button next

Einen Kommentar verfassen

Als Gast kommentieren

0
  • Keine Kommentare gefunden