PIC-Lernbeispiel: 1 MHz .. 50 MHz-Frequenzzähler
mit 4-stelliger 7-Segment-LED-Anzeige

mit PIC16F84

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


Ein einfaches Frequenzmessgerät von 1 MHz bis 50 MHz
Der folgende Frequenzmesser wurde ursprünglich für die Überprüfung des PCI-Bus-Taktes im PC geschaffen. Er basiert auf der Hardware der LED-Ziffernanzeige und misst Frequenzen bis zu 50 MHz mit einer Auflösung von 10 kHz. Aufgrund der geringen Auflösung, ist er erst ab etwa 1 MHz sinnvoll einsetzbar.
Als Projekte habe ich schon mehrere Frequenzzähler vorgestellt. Dieser Frequenzzähler kommt aber ohne teures LCD-Display aus. Somit eignet er sich als Lernbeispiel, insbesondere wenn man das LED-Display ohnehin schon aufgebaut hat.
 
- Frequenzbereich 1 MHz bis 50 MHz
- Auflösung 10 kHz
- Genauigkeit bis 10 MHz: 1,5%
ab 10 MHz:.0,5% 
- Anzeige 4 Stellen auf LED
Stromlaufplan des Frequenzzählers


Schaltung
Der Frequenzzähler benutzt die Hardware der 4-stellige LED-Zifferanzeige, das auch schon in anderen Lernbeispielen eingesetzt wurde. Anstelle eines 4-MHz-Keramikresonators wird ein 10-MHz-Resonator eingesetzt.
Der Eingang RA4 dieser Anzeigeplatine ist auch der Zähleingang des Timer0. Diese 8-Bit Zählschaltung lässt sich auch zum Aufbau eines Zählfrequenzmessers benutzen. Ursprünglich habe ich diesen Frequenzmesser zur Überprüfung des PCI-Taktes auf einem PC-Mainboard geschaffen. Er besitzt deshalb nur einen festen Messbereich, und zeigt die gemessene Frequenz in Megaherz mit zwei Nachkommastellen an. Die Anzeige 12,34 steht also für 12,34 MHz.

Da eine multiplex angesteuerte LED-Anzeige (die ja auch den Timer0 benutzt) die Frequenzmessung behindert, muss die Anzeige während der Frequenzmessung abgeschaltet werden. Damit das nicht als störendes Flackern sichtbar wird, kann nur eine sehr kurze Messzeit (Zählzeit) gewählt werden. Dadurch ist die Messgenauigkeit nicht sehr hoch. Da ich die vorhandene 4-stellige LED-Anzeige einsetzen wollte, ist ohnehin nur eine Anzeige der Frequenz mit 4 Stellen möglich. Da Frequenzen bis zu 50 MHz-gemessen werden sollen, ist die kleinste anzuzeigende Stelle die 10-kHz-Stelle.

Zum Zählen bietet sich der Timer0 an. Dieser wird über einen internen, einstellbaren Vorteiler mit dem Eingangspin RA4 verbunden. Da der Timer0 nur Frequenzen bis zu 2,5 MHz (bei 10 MHz-PIC-Takt) zählen kann, ist der Vorteiler auf ein Teilerverhältnis von 32:1 einzustellen. Die maximal zu messende Frequenz von 50 MHz wird dadurch auf  1,5625 MHz verringert. Damit läuft der Timer0 problemlos.

Bei einem Vorteiler von 32:1 sind genau 3,2 ms Messzeit nötig, um eine Messauflösung von genau 10 kHz zu erreichen. (32 / 10000 = 0,0032 ). Innerhalb von 3,2 ms treffen durch den 32:1-Vorteiler bei einer Eingangsfrequenz von 50 MHz genau 5000-Pulse im Timer0 ein. Dieses Ergebnis kann ohne weitere Umrechnung (lediglich mit einem in der Mitte eingeschobenen Dezimalpunkt) direkt als 50,00 angezeigt werden.

Die feste Messdauer wird durch eine Programmschleife realisiert. Für eine Messzeit von 3,2 ms benötigt man eine Warteschleife mit 8000 Takten auf einem 10 MHz PIC.



Theorie der Frequenzmessung
Ein Frequenzzähler zählt die während einer festen Zeit eintreffenden Impulse, und zeigt diese an. Treffen z.B. innerhalb einer Sekunde genau 100 Impulse ein, so beträgt die Eingangsfrequenz 100 Hz und der Messfehler max. 1 Hz.
Zählt man nur 3,2 ms lang, so muss man das Zählergebnis noch mit 312,5 multiplizieren. Die Messgenauigkeit (also die Auflösung der Messung) verringert sich auf 312,5 Hz. Durch den 32:1-Vorteiler verringert sich die Messgenauigkeit noch einmal um den Faktor 32 auf nur 10 kHz. Wenn man ohnehin die Anzeige so wählt, das die kleinste Stelle 10kHz entspricht, entfällt die jegliche Umrechnung.

16-Bit-Zähler
Wenn man jeden Überlauf des Timer0 per Software in einem 8-Bit Software-Zähler mitzählt hat man einen 16-Bit Zähler mit dem man von 1 bis 65536 zählen kann.
Damit ließen sich ohne Vorteiler theoretisch mit einer Messzeit von 1 Sekunde Frequenzen bis zu 16 MHz mit einer Genauigkeit von 1 Hz messen, wenn der Timer0 16 MHz vertragen würde. Leider ist sein Eingangstakt auf 1/4 des Prozessortaktes beschränkt. Der Timer0 eines mit 10 MHz getakteter PIC kann also maximal 2,5 MHz zählen. Für höhere Frequenzen kann man aber den Vorteiler einsetzen. Aus diesem Grunde wird der 32:1 Vorteiler aktiviert.
Bei 50 MHz treffen über den 32:1-Vorteiler innerhalb der 3,2 ms Messzeit noch 5000 Pulse am Timer0 ein. Um die zu zählen ist der 16-Bit-Zahler ausreichend. Ich benutze einen 16-Bit Softwarezähler, wodurch ich insgesamt einen 24-Bit-Zähler habe. Das ist mehr als genug.

Ein besonderes Problem ist es, den Überlauf des Timer0 zu zählen, und trotzdem den Wert des Timer0 richtig auszulesen. Es ist nämlich nicht möglich dafür das praktische T0IF-Bit zu benutzen. Zwischen der letzten Abfrage des T0IF-Bits und dem Auslesen des Zählers am Ende der Messzeit könnte der Timer0  schon wieder übergelaufen sein. Deshalb wäre das Zählergebnis in Ausnahmefällen um 256 verfälscht. Man greift besser zyklisch auf den Timer0-Wert zu, und beobachtet das Bit 7, um den Überlauf zu erkennen (springt von 1 auf 0) mit dem gelesenen Wert hat man automatisch am Ende der Messzeit die unteren 8 Bit des 16 (24) -Bit-Zählwerts verfälschungsfrei.

Berechnung der Frequenz aus dem Zählwert
Da der Zählwert der Frequenz geteilt durch 10000 entspricht, und die Anzeige ebenfalls die Frequenz geteilt durch 10000 anzeigen soll, ist keine Berechnung nötig. Der Zählwert kann direkt angezeigt werden.

Umrechnung der Frequenz in eine Dezimalzahl
Leider ist das Rechenergebnis eine Binärzahl, mit der wir im täglichen Leben kaum umgehen können. Deshalb steht nun noch die Umwandlung in eine Dezimalzahl an. Das würde man normalerweise durch wiederholte Division durch 10 erledigen, aber eine vollwertige 32-Bit-Divisionsroutine wäre ein zu großer Aufwand. Ich zerlege die Zahl durch Subtraktion und Division in ihre Zehnerpotenzen.

Ausgabe der Zahl
Das fertige Ergebnis kann man am LED-Display anzeigen.



Beschreibung der gewählten Lösung
Verwendet wird ein PIC16F84-10, ein 10 MHz-Quarz und ein LED-Display. (Stromlaufplan ) Die Verwendung eines Quarzes anstelle eines Keramikresonators wäre vorteilhaft, da die Resonatoren einen Frequenzfehler von ca. 0,5% aufweisen. Bei einem so ungenauen Frequenznormal wäre jede Messung mit mehr als 8-Bit Selbstbetrug. Ein Quarz erreicht ohne besondere Maßnahmen dagegen eine Genauigkeit von 0,001% (ohne Abgleich nur 0,01%) unter termisch stabilen Bedingungen sogar 0,00005%.
Mir reicht in diesem Fall aber eine Messgenauighkeit von 0,5% aus.

Test und Kalibrierung
Funktionstest
Um die Funktionstüchtigkeit des fertig aufgebauten Frequenzzählers zu prüfen, schaltet man die Schaltung bei offenem RA4-Eingang ein. Am Display erscheint kurz '1234' und dann dauerhaft '00.00'. Nun verbindet man den Frequenzeingang RA4 mit dem Taktausgang des PIC  OSC2. Nun muss der Frequenzzähler die Sollfrequenz des Schwingers '10.00' anzeigen. Damit ist die Funktionsfähigkeit des Frequenzzählers erwiesen.

Kalibrierung
Falls ein Keramikresonator als Taktquelle eingesetzt wird, ist eine Kalibrierung nicht möglich. Durch die Frequenzungenauigkeit des Keramikresonators wird die Messgenauigkeit auf 0,5% limitiert. Für viele Zwecke ist das aber ausreichend.
Falls aber ein Quarz eingesetzt wird, ist die Kalibrierung nicht nötig. Ohne Kalibrierung erreicht der Quarz eine Genauigkeit von ca. 0,01%. Das ist genauer als die 4-stellige Anzeige. Ein Abgleich der Quarzfrequenz ist deshalb nicht erforderlich.



Mögliche Änderungen
Die letzte Stelle der LED-Anzeige ist durch die Ungenauigkeit des Keramikresonators fehlerbehaftet (1..2 Digit). Man kann auf sie verzichten, und ein dreistelliges LED-Display einsetzen, das es bei Pollin für weniger als 1€ gibt.

'Richtige' Frequenzzähler hoher Genauigkeit stehen auf der Projekt-Seite.


Programmlisting Beim Brennen des PIC bitte darauf achten, dass der Taktgenerator des PIC auf 'HS' eingestellt wird!


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

Autor: sprut
erstellt: 15.09.2003
letzte Änderung: 18.09.2003