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
|
|
Aufbau
- Als Sensor dient das Tachosignal des Lüfters, der pro
Umdrehung 2 Pulse abgibt. Der Tachoausgang des Lüfters ist ein
open-collector-Ausgang, den ich mit einem 10kOhm-Widerstand auf
High-Pegel ziehen muss. Der 1nF-Kondensator soll Spikes am Eingang
unterdrücken, wie sie besonders gern bei niedrigen Drehzahlen von
einigen Lüftern erzeugt werden.
- Der PIC nimmt die Impulse am Pin RB3 entgegen. Das ist der
Eingang des
Capture-Moduls.
- Der Wert der Widerstände R9..R12 ist unkritisch und darf im
Bereich
von 1k bis 4,7k liegen.
- R1..R8 bestimmen die Helligkeit der Anzeige. Sie sind so zu
wählen,
das der Strom durch einen dieser Widerstände 25 mA nicht
übersteigt. Mir genügt die Helligkeit mit 220 Ohm, aber ein
Absenken auf 180 Ohm ist mit einer roten LED-Anzeige möglich. Bei
grünen Anzeigen (mit höherer Flussspannung) sind auch
kleinere Widerstanswerte denkbar.
- Als LED-Anzeige kann jede 7-Segment-LED-Anzeige mit gemeinsamer
Anode verwendet
werden. Die Zuordnung der Segmente zu den Buchstaben A..H (und damit
zu den PIC-Pins) ist für Unkundige im Assemblerquelltext
beschrieben.
- Als Treibertransistoren kommen alle pnp-Typen in Frage, die 200
mA treiben
können, z.B. der preiswerte BC328.
- Als Taktquelle für den PIC empfehle ich einen 4-MHz-Keramikresonator.Die
Verwendung anderer Taktfrequenzen als 4 MHz führt zu
Messfehlern!
- An die Stabilität der Betriebsspannungen werden keine
großen
Ansprüche gestellt (+5V, +/- 20%).
Eine Siebung der Betriebsspannung mit einem Elko (ca. 100µF)
und einem Keramikkondensator (100nF) ist selbstverständlich, und
deshalb
im Stromlaufplan nicht extra enthalten.
Die Stromaufnahme der Schaltung wird durch den Stromverbrauch der
LED-Anzeige
bestimmt, und schwankt zwischen 20 mA und 150 mA
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
- mit Capture-Modul im 8-µs-Takt zählen, bis von
Lüfter 4 Impulse kamen (Interrupt),
während dieser Zeit letztes Messergebnis an LED-Display
anzeigen
- Timer1 auf 0 zurücksetzen
- falls Timer1 übergelaufen ist, dann zurück zum Punkt 1
(Drehzahl
zu klein)
- 16-Bit-Zählwert des Capture-Moduls auslesen
- falls Zählwert kleiner als 1535 ist, dann zurück zum
Punkt 1
(Drehzahl
zu hoch)
- 15000000 ganzzahlig durch den
Zählwert teilen
- Divisionsergebnis in BCD wandeln (4-stellig)
- BCD-Wert an Anzeigeroutine übergeben
- 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