4.2.2 - Drehzahl mit Potisteuerung
Dieses Tutorial ist eine Zusammenführung von "3.3 - Lüftergeschwindigkeit per Drehpote einstellen" und "4.2.1 - Statische Drehzahl auslesen".
Ich füge dabei den benötigten Code um die Drehzahl des 4 Pin Lüfters auszulesen, aus dem Teil 4.2.1 in 3.3 ein und lasse die Drehzahl am Seriellen Monitor ausgeben.
Teileliste
-
Arduino IDE (Tutorial wurde mit 1.6 erstellt)
-
Arduino Uno (oder ein anderes Modell)
-
12V Netzteil (das ist nur ein Beispiel! Bitte wählt ein ausreichend starkes Netzteil je nach benötigter Leistung)
-
alternativ 12V Computer Netzteil
- 10kΩ Potentiometer
- 12V PC Lüfter (4 Pin PWM)
Anschlussplan
Code
//Konstanten const int tachoPin = 2; // Pin des Tachosignals des Lüfters const int fanPin = 9; // PWM Anschluss des Lüfter const int potiPin = A0 ; // Potenzometer am analogen Eingang A0 angeschlossen // Variablen int fanSpeed = 0; // Variable für die Lüftergeschwindigkeit int potiVar = 0 ; // Variable zum speichern des Potentiometereingangs int abfrZeit = 1000; // Zeitabstand für die Abfragen des Tachosignals long tachoMillis = abfrZeit; // Zeitabstand für Pulse Stretching Funktion float rps = 0; // Variable mit Kommastelle zur 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 31300Hz Serial.begin(9600); // Baudrate für die Ausgabe am Seriellen Monitor pinMode(fanPin, OUTPUT) ; // Setzt den Lüfter Pin als Ausgang pinMode(tachoPin, INPUT); // Setzt den Tacho Pin als Eingang pinMode(potiPin, INPUT) ; // Setzt den Poti Pin als Eingang } void loop() { potiVar = analogRead(potiPin) ; // Liest das Potentiometer aus fanSpeed = map(potiVar, 0, 1023, 50, 255); // Verteilt den PWM Wert über den Messbereich des Potis analogWrite(fanPin, fanSpeed); // Gibt die Variable mit PWM aus // Alle 1000ms die Drehzal auslesen if((millis() - tachoMillis) >= abfrZeit) { flankenZeit = pulseIn(tachoPin, LOW); // Abfrage der Zeit pro Puls in Mikrosekunden umdrZeit = ((flankenZeit * 4)/1000); // Berechnung der Zeit pro Umdrehung in Millisekunden rps = (1000/umdrZeit); // Umrechnung auf Umdrehungen pro Sekunde rpm = (rps*6); // Schritt 1 zur Rundung auf 10er Schritte der Drehzahl rpm = (rpm*10); // Schritt 2 zur Rundung auf 10er Schritte der Drehzahl Serial.print(rpm); // Ausgabe der Drehzahl im Seriellen Monitor Serial.println(" RPM"); // Ausgabe der Drehzahl im Seriellen Monitor tachoMillis = millis(); // Die TachoMillis werden aktualisiert um die nächsten 1000ms zählen zu können } }
Nachdem die Konstanten und Variablen gesetzt sind, starten wir im setup. Hier wird zu allererst die Frequenz des PWM Ausgangs 9 und 10 auf 31300kHz gesetzt, damit der Lüfter nicht pfeift und dann die Ein- und Ausgänge deklariert.
Am Anfang des loops, lesen wir das Potentiometer am potiPin aus und speicher den Wert, der sich zwischen 0 - 1023 bewegt in der Variable potiVar ab.
Jetzt verteilen wir per map Befehl (Erklärung) über den Bereich des Potentiometer von 0 - 1023 den PWM Wert von 50 - 255 und speichern den Wert dann in der Variable fanSpeed. Dann geben wir den Wert per analogWrite an den Lüfter aus.
Jetzt verteilen wir per map Befehl (Erklärung) über den Bereich des Potentiometer von 0 - 1023 den PWM Wert von 50 - 255 und speichern den Wert dann in der Variable fanSpeed. Dann geben wir den Wert per analogWrite an den Lüfter aus.
Als nächstes wird per if Befehl abgefragt, ob 1000ms vergangen sind. Wenn das zutrifft wird die Zeit zwischen zwei Flanken des Tachosignals per pulsIn Befehl (Erklärung) erfasst und in der Variable flankenZeit gespeichert. Nun muss diese Zeit in Umdrehungen pro Minute umgerechnet werden, siehe 4.2 - Drehzahl 4 Pin Lüfter. 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 der 1000ms im loop funktioniert.
Das war es auch schon 

Seitennavigation
Einen Kommentar verfassen
Einloggen um Kommentare zu verfassen
Als Gast kommentieren