Drehzahlmesser für Modellflugzeuge

mit PIC16F628


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


Allgemeines
Messbereich: 700 UPM ... 87 000 UPM
Auflösung der Anzeige: 100 UPM (10 UPM)
interner Messfehler < 0,7 %
Luftschraubentyp: 2-Blatt-Luftschraube
Messzeit: < 0,2 s

Das Ziel war die Entwicklung eines einfachen Drehzahlmessers für die Luftschraube von Modellflugzeugen. Die Messung selbst erfolgt optisch, die Anzeige erledigt ein 3-stelliges LED-Display.
 

anklicken zum Vergrößern



Aufbau

Betrachtungen zur Messgenauigkeit
Ich verwende hier keine Frequenzmessung, sondern eine Periodenmessung. Das ist aufgrund der geringen Drehzahlen notwendig.

Bei einer Drehzahl von 2000 rpm misst man an der Zweiblattluftschraube eine Frequenz von 66.66 Hz. Der Zählfrequenzmesser würde eine Zählzeit von 1 Sekunde benötigen, um diese Frequenz auf 1 Hz genau zu bestimmen. Zählt man die Luftschraubenimpulse nur über 0,1 Sekunde, so ist das Ergebnis 6 oder 7. Bei einer Messauflösung von 10 Hz (1 / 0,1Sekunde = 10 Hz) Misst man also 60 Hz oder 70 Hz , Zwischenwerte sind nicht möglich. 60 Hz entspräche1800 rpm, 70 Hz entspräche aber schon 2100 rpm. Der Grundmessfehler beträgt also schon 300  rpm. bzw. 15%.  Die Anzeige eines Zählfrequenz-Drehzahlmessers mit 0,1s Zählzeit würde also zwischen diesen beiden Werten schwanken.

Bei der hier eingesetzten Periodenmessung, messe ich die Dauer von 2 aufeinanderfolgenden Schraubendrehungen mit einer Auflösung von 2,66 µs. (Die Dauer einer Drehung wird also mit einer Genauigkeit von 1,33 µs bestimmt.) Bei einer Drehzahl von 2000 rpm dauern 2 Propellerdrehungen 60 ms. Die Periodendauermessung wird 22500 x 2,66µs = 60 ms messen. Weicht der Messwert um 1 Takt ( also um 2,66µs) ab, dann beträgt der daraus entstehende Messfehler 2000rpm / 22500 = 0,08 rpm =0,004%. Dieser Messfehler ist vernachlässigbar. Die Messgenauigkeit wird also nicht durch das Messverfahren, sondern duch den Taktgenerator des PIC  bestimmt. Der hier eingesetzte Keramikresonator hat einen Frequenzfehler von maximal 0,5%, wodurch der Gesamtmessfehler unter 0,6% bleibt.
 
maximale Meß- und Anzeigefehler bis 40000 rpm Mit steigender Drehzahl wird die Periodenmessung ungenauer und die Frequenzmessung genauer. Aber auch bei 88000 rpm beträgt der prinzipielle Messfehler  der Periodenmessung nur 0,2% und der der Frequenzmessung noch 0,34%. Folglich ist die Periodenmessung im gesamten Messbereich des Drehzahlmessers das überlegene Verfahren, der  Gesamtmessfehler (einschließlich der Ungenauigkeit des Keramikresonators) liegt im gesamten Messbereich bei 0,5%..0,7%. 
In nebenstehender Grafik ist der vom Keramikresonator verursachte Fehler schon berücksichtigt.

ohne Messbereichsumschaltung
Mit einer dreistelligen Anzeige lässt sich diese Genauigkeit leider nicht ausnutzen. Bei 2000 rpm liegt der Anzeigefehler (durch die fehlenden Zehner- und Einer-Stellen) bei 5%. Ab 10000rpm liegt der Anzeigefehler aber unter 1%.  Ab 18000 rpm überschreitet die Anzeigegenauigkeit die Messgenauigkeit.

kleinerer Fehler durch Meßbereichsumschaltung mit Messbereichsumschaltung
Das sieht ganz anders aus, wenn man bei niedrigen Drehzahlen auf eine Anzeige mit 10-Hz-Auflösung umschaltet. Im nebenstehenden Beispiel schaltet der Drehzahlmesser bei Drehzahlen unter 5500 rpm von der Anzeige '  5.5' auf  '5.48' um. Damit ist die Anzeigegenauigkeit bei niedrigen Drehzahlen 10-fach genauer und der Gesamtfehler des Drehzahlmessers (Periodenmessfehler + Anzeigefehler + Keramikresonatorfehler) liegt immer unter 2%.

Erkannt wird dieser Mode am leuchtenden Dezimalpunkt hinter der ersten Anzeigestelle. Der Dezimalpunkt hinter der 2. Stelle zeigt weiterhin mit seinem Flackern an, dass das Gerät misst.


Drehzahl-Messung
Der optische Sensor liefert Pulse einer Frequenz, die der Drehzahl proportional ist. Leider ist die Drehzahl der Motoren recht gering, so dass eine genaue Drehzahlmessung mit der Zählfrequenzmethode ziemlich lange dauern würde. Besser ist es die Zeit zwischen zwei 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 mit 375 kHz getaktet wird. Dieser Takt wird aus dem 12-MHz-PIC-Takt gewonnen, indem er erst durch 4 (Zyklustakt) und dann durch 8 (Vorteiler des Timer1) geteilt wird. Beim Eintreffen eines Pulses von der Luftschraube wird der Timer1 per Software auf 0 gesetzt. Dann zählt er mit 375 kHz. Alle 2,66 Mikrosekunden erhöht sich der Wert des Timers um 1.

Um ein stabiles Messergebnis  zu erhalten, wird nicht der Abstand zweier benachbarter Luftschrauben-Impulse 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 Schraubenumdrehungen (Zweiblattluftschraube).

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 45000000 multipliziert werden (1 Minute / 2,66 µs * 2 = 45000000). Da aber eine Anzeige in 100-UPM-Schritten geplant ist, wird der Reziprokwert nur mit 450000 multipliziert.



Berechnungen
Das Rechnen mit PICs ist nicht einfach. Das mathematische Hauptproblem ist die Berechnung des Reziprokwertes. Das zweite Problem ist die Multiplikation mit 450000.
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 = 450000 / Messwert

Eigentlich ist es also völlig ausreichend, den Wert 450000 durch den Messwert zu dividieren. Dass kann durch wiederholte Subtraktion des Messwertes von 450000 erfolgen, bis 0 erreicht wird. Dafür benötigt man nur eine 24-Bit-Subtraktion. (Dieses Verfahren funktioniert zwar, ist aber leider recht langsam. Für unsere Zwecke mag es genügen.)

Beispiel:
Die Drehzahl sei 30000 rpm. Der Pulsabstand beträgt bei einer Zweiblattluftschraube folglich  1 / (2 x 30000) Minute = 1 ms. Vier Pulse benötigen folglich 4 ms.
Das Capture-Modul zählt mit seinem 2,66 µs-Takt in diesen 4 ms bis zum Wert 1500. (4000µs / 2,66µs = 1500)
Wird 450000 durch 1500 dividiert, erhält man 300. Dieser Wert wird angezeigt (Anzeige: '30.0'), er entspricht der Drehzahl in 100 UPM.
 

Die niedrigste messbare Drehzahl ist 686 rpm. Bei kleineren Drehzahlen läuft der 16-bittige Timer1 während der Messsung über. Die dreistellige Anzeige begrenzt die darstellbare Drehzahl nach oben auf 99900 rpm. Da im Modellbau in der Regel nur Drehzahlen von 2000 rpm bis zu 40000 rpm interessant sind, verzichte ich auf Maßnahmen zur Messbereichserweiterung. Die maximale Drehzahl schränke ich (aus Gründen der Bequemlichkeit) auf 87890 rpm ein.
 
Drehzahl: 600 rpm 686 rpm 700 rpm 1 000 rpm 3 000 rpm 10 000 rpm 30 000 rpm 60 000 rpm 87 890 rpm 100 000 rpm
Messzeit: 200 ms 174,76 ms 171,43 ms 120 ms 40 ms 12 ms 4 ms 2 ms 1,365 ms 1,2 ms
Messwert:  (9464) 65 535 64 286 45 000 15 000 4 500 1 500 750 512 450
Anzeige:  -- 00.6
0.69
00.7
0.70
01.0
1.00
03.0
3.00
10.0 30.0 60.0 87.9 --.-



Programmablauf einer Messung
  1. mit Capture-Modul im 2,66-µs-Takt zählen, bis von Luftschraube 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 512 ist, dann zurück zum Punkt 1 (Drehzahl zu hoch)
  7. 450000 mit halben Zählwert addieren und dann ganzzahlig durch den Zählwert teilen (24-Bit integer-Addition und -Subtraktion)
  8. Divisionsergebnis in BCD wandeln (3-stellig)
  9. BCD-Wert an Anzeigeroutine übergeben
  10. zurück zum Punkt 1
Die Genauigkeit des angezeigten Wertes wird dadurch erhöht, dass vor der Ganzzahldivision zum Wert 450000 der halbe Zählwert hinzuaddiert wird. Dadurch ist das Ergebnis ein richtig gerundeter Wert. Die Drehzahl 19990 rpm wird also nicht als 19.9 sondern als 20.0 ausgegeben, was genauer ist.


Anzeige
Die Anzeige mit 7-Segment LEDs wurde schon an anderer Stelle beschrieben. Ich benutze ein 3-stelliges LED-Display mit gemeinsamen Anoden. Zur Ansteuerung werden 11 Port-Pins, 3 Transistoren und 11 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 4 Takten (3 Anzeigetakte und 1 Rechentakt). Jeder Takt ist ca. 2,72 ms lang, um eine flimmerfreie Anzeige zu gewärleisten (91 Hz). Das Umschalten von Takt zu Takt wird mit einem Timer realisiert. Dazu wird der Timer0 mit dem PIC-Zyklustakt (12MHz / 4 = 3MHz) über den internen 32:1 Vorteiler gespeist. Immer nach 256 x 32 Zyklen (2,72 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 3 Anzeigetakten (für die drei Stellen) wird in einem 4. 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 tausender-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 87890 rpm, dann zeigt das Display '--.-' an.
Unterhalb von 700 rpm zeigt das Display '  --' an, Der Dezimalpunkt ist dann also aus.

Eine Null an der Zehntausender-Stelle wird nicht angezeigt. Bei einer Drehzahl von 6000 rpm wird also anstelle von '06.0' lediglich '  6.0' 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 netzbetriebenen Leuchtstofflampe (notfalls auch mit einer netzbetriebenen Glühbirne) überprüfen. Der Sensor wird mit dem Licht der Leuchtstofflampe beleuchtet. Aufgrund der 50 Hz Netzfrequenz, flackert das Licht mit 100 Hz. Das entspricht der Pulsfrequenz einer Zweiblatt-Luftschraube bei 3000 UPM. Der Drehzahlmesser sollte  den Wert '  3.0' (ohne Messbereichsumschaltung) bzw. etwa '3.00' (mit Messbereichsumschaltung) anzeigen.



Fehlersuche

Download
Hier liegt




mögliche Erweiterungen
Die Software ist für Zweiblattluftschrauben ausgelegt. Eine Erweiterung auf andere Luftschrauben wäre möglich. Dabei wird einfach durch eine andere Zahl als 450000 dividiert. Ein Umschalter z.B. zwischen 2-Blatt und 3-Blatt ließe sich dann an RA4 anschließen.

Wem 100 UPM zu ungenau ist, der kann eine zusätzlich 10er-Stelle anschließen, deren Anode mit RA5 angesteuert wird. Dann wird nicht 450000 durch den Zählwert dividiert, sondern 4500000, um ein 4-stelliges BCD-Ergebnis zu bekommen. Auf eine Messbereichsumschaltung kann dann verzichtet werden.

Drehzahlen unterhalb von 700 rpm führen zu einem Überlaufen des Timer1 während des Capturens. Wer niedrigere Drehzahlen (bis 350 rpm) messen will, kann mit einem langsameren PIC-Takt von nur 4 MHz arbeiten, und in der Drehzahlberechnung nicht 450000 sondern 150000 durch den Messwert dividieren. Bei hohen Drehzahlen (>60 000 rpm) fängt dann die Anzeige aber zu flackern an, da die Rechenzeit zur Drehzahlberechnung stark zunimmt. Eine schnellere Divisionsroutine kann hier Abhilfe schaffen.

Wer einen Drehzahlmesser für langsamere Drehzahlen (also nicht für Propeller) sucht, kann den PIC-Takt auf 1 MHz verringern, und den Vorteiler des Capture-Modules auf 1:1 einstellen. Dann sind Messzeiten bis zu 2 Sekunden realisierbar. Wenn der Drehzahlsensor nur 1 Impuls pro Drehung abgibt, können Drehzahlen bis hinab zu 30 rpm gemessen werden. Dafür sind natürlich einige Softwareanpassungen nötig.

Als Eingangsschaltung könnte auch ein Transimpedanzverstärker verwendet werden.


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