Drehzahlmesser für PC-Lüfter

mit PIC16F628


zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage


Allgemeines
Messbereich: 230 UPM ... 9765 UPM
Auflösung der Anzeige: 1 UPM
interner Messfehler < 0,1 % (+0,5% Resonatorfehler)
Lüftertyp: Tacho mit 2 Pulsen pro Drehung
Messzeit: < 0,53 s (230 UPM);   <0,1 s (>1300 UPM)

Auf Wunsch eines Einzelnen, habe ich meinen Luftschrauben-Drehzahlmesser in einen Drehzahlmesser für PC-Lüfter modifiziert. Gefordert war eine 4-stellige Anzeige.

Die Hardware ist eine abgewandelte LED-Ziffernanzeige aus älteren Experimenten. Im Wesentlichen wurden RA4 und RB3 vertauscht, der 16F84 gegen einen 16F628 ausgetauscht, und eine einfache Eingangsbeschaltung ergänzt

anklicken zum Vergrößern



Aufbau

Betrachtungen zur Messgenauigkeit
Die Drehzahl eines Lüfters erfordert nicht unbedingt höchste Präzision. Die Anzeige sollte aber schnell sein (falls man mit einem einfachen Umschalter am Messeingang zwischen mehreren Lüftern umschalten will) und den gesamten Drehzahlbereich eines Lüfters abdecken.
Ich verwende hier keine Frequenzmessung, sondern eine Periodenmessung. Das ist aufgrund der geringen Drehzahlen notwendig. Um Messungenauigkeiten zu minimieren, messe ich die Gesamtdauer von 4 aufeinanderfolgenden Pulsen (also die Dauer von 2 Umdrehungen). Daraus errechne ich dann die Drehzahl in UPM (Umdrehungen pro minute = rpm).

Ich verwende einen PIC-Takt von 4 MHz, damit ich für das Capture-Modul einen vergleichsweise geringen Zähltakt von 125 kHz realisieren kann. Die niedrigste messbare Lüfterdrehzahl ist 229 rpm. Kleine re Drehzahlen führen dazu, dass der 16-Bit Zähler des Capture-Modules überläuft, bevor der Luefer zwei Umdrehungen abgeschlossen hat.

Da PC-Lüfter nicht schneller als mit 10000 rpm drehen, sind vom Tachosignal maximal 20000 Pulse pro Minute zu erwarten. Das entspricht 333 Hz. Eine Tachosignal-Periode ist dann 3 ms lang. Um Messungenauigkeiten zu minimieren, messe ich die Gesamtdauer von 4 aufeinanderfolgenden Pulsen. Das sind dann also 12 ms. Ein mit 125kHz getaktetes Capture-Modul zählt in dieser Zeit bis 1500. Der durch die Auflösung bedingte Messfehler liegt also unter 0.1% (1/1500). Das genügt völlig.



Drehzahl-Messung

Der Tachosignal liefert Pulse einer Frequenz, die der Drehzahl proportional ist. Leider ist die Drehzahl der Lüfter recht gering, so dass eine genaue Drehzahlmessung mit der Zählfrequenzmethode ziemlich lange dauern würde. Besser ist es die Zeit zwischen den Pulsen (Periodendauer) zu messen. Diese ist  indirekt proportional zur Drehzahl.

Zur Messung der Periodendauer verwende ich das Capture-Modul. Es besteht im Wesentlichen aus dem Timer1, der hier mit 125 kHz getaktet wird. Dieser Takt wird aus dem 4-MHz-PIC-Takt gewonnen, indem er erst durch 4 (Zyklustakt) und dann durch 8 (Vorteiler des Timer1) geteilt wird. Beim Eintreffen eines Pulses vom Tachosignal wird der Timer1 per Software auf 0 gesetzt. Dann zählt er mit 125 kHz. Alle 8 Mikrosekunden erhöht sich der Wert des Timers um 1.

Um ein stabiles Messergebnis  zu erhalten, wird nicht der Abstand zweier benachbarter Tachopulsen gemessen, sondern die  Gesamtdauer von 4 Perioden. Das erreicht man durch die Verwendung des 4:1-Vorteilers des Capture-Einganges. Nach 4 Eingangsimpulsen wird der Timer1 (via Capture Modul) ausgelesen. Das erfolgt also nach 2 Lüfterumdrehungen.

Um aus diesem Messwert die Drehzahl in UPM (Umdrehungen pro Minute) zu berechnen, muss der Reziprokwert des Zählergebnisses berechnet werden, und dieser Wert mit 15.000.000 (15 Millionen) multipliziert werden (1 Minute / 8 µs * 2 = 15.000.000). 



Berechnungen
Das Rechnen mit PICs ist nicht einfach. Das mathematische Hauptproblem ist die Berechnung des Reziprokwertes. Das zweite Problem ist die Multiplikation mit 15000000.
Man kann die Berechnungen auch austauschen, und erst die Multiplikation durchführen und danach die Reziprokbildung. Schreibt man das einmal auf, dann erhält man

Drehzahl = 15000000 / Messwert

Eigentlich ist es also völlig ausreichend, den Wert 15000000 durch den Messwert zu dividieren. Dass könnte durch wiederholte Subtraktion des Messwertes von 15000000 erfolgen, bis 0 erreicht wird. Dafür benötigt man nur 24-Bit-Subtraktionen. Dieses Verfahren funktioniert zwar, ist aber leider recht langsam. Für eine 4-stellige Drehzahl sind bis zu 10000 Subtraktionen erforderlich. Dafür reicht die im Programm zur Verfügung stehende Zeit (4 ms) nicht aus. Es muss deshalb eine "echte" Divisionsroutine verwendet werden. Ich benutze die Ganzzahldivision aus der Microchip-Bibliothek AN617. Die benötigt für eine Division weniger als 1000 Zyklen, was bei einem 4MHz-Takt knapp 1 ms entspricht. (Ich habe versehentlich die Routine für vorzeichenbehaftete Zahlen genommen, die Routine für nichtvorzeichenbehaftete Zahlen würde es auch tun.)

Beispiel:
Die Drehzahl sei 3000 rpm. Der Pulsabstand beträgt bei Zwei Pulsen pro Umdrehung folglich  1 / (2 x 3000) Minute = 10 ms. Vier Pulse benötigen folglich 40 ms.
Das Capture-Modul zählt mit seinem 8 µs-Takt in diesen 40 ms bis zum Wert 5000. (40000µs / 8µs = 5000)
Wird 15000000 durch 5000 dividiert, erhält man 3000. Dieser Wert wird angezeigt (Anzeige: '3000'), er entspricht der Drehzahl in UPM.  

Die niedrigste messbare Drehzahl ist 229 rpm. Bei kleineren Drehzahlen läuft der 16-bittige Timer1 während der Messsung über. Die vierstellige Anzeige begrenzt die darstellbare Drehzahl nach oben auf 9999 rpm. Per Software begrenze ich die Anzeige auf maximal 9765 UPM, um Rechenproblemen aus dem Weg zu gehen. Das ist ausreichend.


Programmablauf einer Messung
  1. mit Capture-Modul im 8-µs-Takt zählen, bis von Lüfter 4 Impulse kamen (Interrupt),
  2. während dieser Zeit letztes Messergebnis an LED-Display anzeigen
  3. Timer1 auf 0 zurücksetzen
  4. falls Timer1 übergelaufen ist, dann zurück zum Punkt 1 (Drehzahl zu klein)
  5. 16-Bit-Zählwert des Capture-Moduls auslesen
  6. falls Zählwert kleiner als 1535 ist, dann zurück zum Punkt 1 (Drehzahl zu hoch)
  7. 15000000 ganzzahlig durch den Zählwert teilen
  8. Divisionsergebnis in BCD wandeln (4-stellig)
  9. BCD-Wert an Anzeigeroutine übergeben
  10. zurück zum Punkt 1




Anzeige
Die Anzeige mit 7-Segment LEDs wurde schon an anderer Stelle beschrieben. Ich benutze zwei 2-stellige LED-Displays mit gemeinsamen Anoden. Zur Ansteuerung werden 12 Port-Pins, 4 Transistoren und 12 Widerstände benötigt.
Der Segmentstrom wird durch die Widerstände R1..R8 auf ca. 15 mA begrenzt. Dadurch bleibt die Gesamtstromaufnahme des PortB (15mAx8=120mA) sicher im Rahmen der Spezifikation des PIC (max. 200mA). Wem die Helligkeit nicht genügt, der kann den Segmentstrom auf 25 mA erhöhen. (R1..R8:  180 Ohm)

Die Anzeige erfolgt multiplex mit 5 Takten (4 Anzeigetakte und 1 Rechentakt). Jeder Takt ist ca. 4 ms lang, um eine flimmerfreie Anzeige zu gewärleisten (49 Hz). Das Umschalten von Takt zu Takt wird mit einem Timer realisiert. Dazu wird der Timer0 mit dem PIC-Zyklustakt (4MHz / 4 = 1MHz) über den internen 16:1 Vorteiler gespeist. Immer nach 256 x 16 Zyklen (~4 ms) läuft der Timer0 über, und setzt das T0IF-Flag. Das wird vom Hauptprogramm durch Polling erkannt, und zur nächsten Anzeige-Stelle weitergeschaltet.
Nach 4 Anzeigetakten (für die vier Stellen) wird in einem 5. Takt die Drehzahl neu berechnet, falls inzwischen ein neuer Messwert eingetroffen ist.

Nach dem Einschalten bleibt das Display zunächst dunkel, es wird nur der hinterste Dezimalpunkt eingeschaltet (sozusagen als Lebenszeichen). Nach dem Eintreffen der ersten Impulse vom Sensor schaltet die Anzeige zur normalen Betriebsart um, und der hinterste Dezimalpunkt verlischt.

Hinter der hunderter-rpm-Stelle (also der mittleren LED-Stelle) wird der Dezimalpunkt eingeschaltet, wenn Messwerte vom Sensor eintreffen. Dieser Dezimalpunkt flackert also normalerweise. Bei sehr hohen Drehzahlen (>40000 rpm) leuchtet der Punkt dauerhaft. Falls keine Messung erfolgt, oder die Eingangsfrequenz zu niedrig ist, bleibt der Punkt dunkel.
Überschreitet die gemessene Drehzahl das obere Limit von 9999 rpm, dann zeigt das Display '--.--' an.
Unterhalb von 230 rpm zeigt das Display '  --' an, Der Dezimalpunkt ist dann also aus.

Führende Nullen werden nicht angezeigt. Bei einer Drehzahl von 600 rpm wird also anstelle von '0600' lediglich '  600' angezeigt.



Kalibrierung / Funktionstest
Eine Kalibrierung ist eigentlich nicht nötig, aber einen Funktionstest sollte man schon durchführen.
Der fertig aufgebaute Drehzahlmesser lässt sich mit einer 9V-Wechselspannung überprüfen. Die Wechselspannung wird über einen 10 kOhm-Widerstand an das Pin RB3 gelegt. Die 50 Hz Netzfrequenz entspricht der Pulsfrequenz eines Lüfters bei 1500 UPM. Der Drehzahlmesser sollte einen Wert von etwa '1500' anzeigen. Abweichungen von 100 sind durch die Ungenauigkeit der Netzfrequenz noch normal.



Download
Hier liegt




mögliche Erweiterungen



zurück zu Projekte , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 14.10.2008
letzte Änderung:: 16.10.2008