Forum: Mikrocontroller und Digitale Elektronik Rechteckfrequenz messen


von Tobias Vaupel (Gast)


Lesenswert?

Hallo zusammen,

ich sitz gerade in der Arbeit und langweile mich zu tode(Azubi sein in 
der Entwicklung is schön;))

Ich würde gerne einen Frequenzmesser bauen, der eine Rechteckfrequenz 
misst.

Ich dachte mir das so.

INT0 Flankengesteuert zählt eine Variable hoch.

Nach einer Sekunde nehme ich den Wert aus der Variable und nehm den 
Kehrwert. Schwups hab ich die Frequenz.


Aber als ich gerade mit dem INT0 gespielt habe is mir was aufgefallen.
Hab daran nen Frequenzgenerator angeschlosen um mal zu gucken was so 
passiert.

Die Variable hab ich mir auf dem LCD anzeigen lassen.
Bei 10Hz zählt die auch ganz brav. Aber bei 100Hz z.B. zählt das dingen 
total ungenau, als ob es ein paar Perioden übersehen würde.
Liegt das an den Porteigenschaften?
Bei welcher Frequenz is die Grenze? Gibt es dazu was im Datanblatt?

Wäre dankbar für jede Hilfe wie ich so einen Frequenzmesser realisieren 
kann :)

Tobias

von Oliver (Gast)


Lesenswert?

Hallo Tobias,
Dein Problem kann daran liegen, dass der Unterschied in der 
Periodenlänge zwischen zb. 100Hz und 101Hz bei ca. 100us liegt, bei 10Hz 
und 11Hz aber lediglich 10ms. Je höher die Frequenz wird, desto geringer 
werden die Unterschiede zwischen den einzelnen Periodendauern (f(1/T)). 
Ein erster Vorschlag könnte sein, die Frequenz über einen längeren 
Zeitraum zu messen oder mach es genau andersherum. Zähle hundert Impulse 
und messe die Zeit dafür.
Vielleicht hilft das ja.
Gruß Oliver

von Tobias Vaupel (Gast)


Lesenswert?

Hmm, aber genau da ist ja das Problem. Er misst die Pulse nicht wirklich 
genau ab 100Hz. Es würde also nix bringen die 100Pulse zu zählen und 
dann nachschaun wie lange man dafür gebraucht hat.

Ich denke es liegt daran, wie du schon gesagt hast, dass die 
UNterschiede einfach zu fein werden mit steigender Frequenz.

von Oliver (Gast)


Lesenswert?

Wenn Du 1s lang misst, dann beendest Du Deine Messung, wenn ein Impuls 
noch nicht ganz zuende ist, es sei denn, Deine Periodenlänge ist genau 
ein Vielfaches von der Messdauer (Du machst also von vornherein schon 
einen Messfehler). Misst Du aber eine feste Anzahl von Impulsen mit 
einem Timer, so ist auf jeden Fall sicher, dass Du immer nur ganze 
Periodenlängen zählst. Der Timmer sollte dann von seiner Geschwindigkeit 
natürlich der Frequenz angepasst sein.

von Martin (Gast)


Lesenswert?

Hi,

> Aber bei 100Hz z.B. zählt das dingen total ungenau, als ob es ein paar Perioden 
übersehen würde.

Wie ungenau ist den die Messung bei 100Hz? (+/-1Hz,5Hz ....)
Wenn keine Flanke verloren geht müsste die Messung bei 100Hz eigentlich 
genauer werden. Problem mit dem Überlauf der Variable kanns ja auch noch 
nicht geben, falls nur ein 8Bit Register benutzt hättest.

> Nach einer Sekunde nehme ich den Wert aus der Variable und nehm den Kehrwert. 
Schwups hab ich die Frequenz.

Was der Kehrwert soll versteh ich aber nicht so richtig. Wenn du 1s lang 
zählst steht in der Variable doch  direkt schon die Frequenz.

Der Atmel Controller an sich sollte bei 100Hz absolut kein Problem haben 
eine Frequenz zu messen. Bei sauberem TTL Messeingang dürfte das Limit 
warscheinlich vom Clock des Controllers und deiner 
Softwareimplementation liegen.

Gruss
Martin

von Tobias Vaupel (Gast)


Lesenswert?

WIe ungenau die Messung genau ist weis ich nicht. Muss ich demnächst mal 
gucken.
Die Variable läuft auch nicht über da sie mit unsigend int deklariert 
ist.

Aber ein hinweis, ich benutz den 89C51RD2.
Hab ich vergessen zu sagen. Is da vielleicht das Problem? Dass der zu 
lahm dafür ist? Hab nen 12MHz Quarz dran.

Mit dem Kehrwert hast du recht. Hab ich irgendwie nicht realisiert :)

Ich probier am Montag, wenn ich Zeit haben sollte, nochmal in der Firma 
was mit dem Frequenzmesser rum.
Tobias

von Peter D. (peda)


Lesenswert?

Der 89C51RD2 ist auf keinen Fall zu langsam.
Bei 12MHz kannst Du mit 500ns auflösen.

Du kannst statt des Interrupts auch die Capture-Funktion benutzen.


Peter

von Martin (Gast)


Lesenswert?

Noch was zu deiner Frequenzmessung.
Es muss ja nicht sein das deine Impulszählung irgend ein Problem hat, 
sondern es kann genauso gut auch an der Genauigkeit der einen Sekunde 
liegen. Fehler kann man dabei genug machen.
Wenn z.B. dazu nur Register und Schleifen und nicht den eingebauten 
Counter/Timer benutzt wird (falls der 89C51 sowas hat) gibts bei jedem 
Interrupt des Messeingangs eine Unterbrechung der 1sek Pause (was aber 
bei SysTakt 12Mhz und deiner 100Hz Messung noch nichts ausmacht)

Gruss Martin.

von Tobias vaupel (Gast)


Lesenswert?

Hm, ich glaube nicht dass ein Fehler im Timer ist. Bis jetzt habe ich ja 
noch keinen Benutzt :)

Hab halt einfach nur immer ne Variable hochzählen lassen wenn ein 
Interrupt auftritt. Die variable habe ich mir dann auf dem LCD ausgeben 
lassen. Da ist mir dann halt schon aufgefallen dass das zählen nicht 
glatt geht, sonder stockt.

Ich werde es aber mal mit dem Count Eingang versucht wie es Peter gesagt 
hat. Vielleicht erziele ich da ja bessere ergebnisse.

von Martin (Gast)


Lesenswert?

Ich hab selbst noch nichts mit einem LCD Display gemacht. Wenn du aber 
bei 100Hz jedesmal das Display komplett neuschreibst kann vieleicht das 
das Problem sein. Unentlich schnell ist ein LCD nicht.
Bei den LCD-Ansteuerungs bibliotheken sind viele Wartezyklen enthalten 
die zu einem Problem werden können. Wenns für den 89C51RD2 (Philips?) 
einen Simulator wie das AVR Studio von Atmel gibt(Atmel hat einen 89S51 
falls die gleich sind)kannst mal nach schauen wie lange das Ausführen 
des LCD Codes dauert.

Ansonsten macht es schon Sinn einen Count-Eingang zu benutzen.
Wenn du dann den Wert des Counters nach 1sec ausliest und ihn 
zurücksetzt, läuft er wieder von vorne weiter, und du kannst den Wert in 
Ruhe auf dem Display ausgeben. Brauchst halt noch einen zweiten 
Timer/Counter für die 1sec.

Gruss Martin

von Tobias Vaupel (Gast)


Lesenswert?

CDas das Display nicht unendlich schnell ist ist mir auch klar :)
Aber wenn das Display zu lahm wäre, würde es nach ja am Ende trotzdem 
den richten Wert anzeigen der gezählt wurde.

Z.B. wenn ich da 1. Sekunde 100Hz anlege. Dann sollte nach einer Sekunde 
eine 100 in der Variable stehen.
Aber es steht dann nur eine 46 oder so drin.
Deshalb denke ich eher dass da was an dem Interrupt hängt.
Ich werds aus neugier mal mit dem Counteingang versuchen.
Ist nur ärgerlich dass ich nen extra Timer brauche.

Tobias

P.s. Der 89C51RD2 is von Themic, bzw. jetzt von Atmel. Und ganz früher 
von Intel :)

von Martin (Gast)


Lesenswert?

Wenn du innerhalb der Interrupt Routine die Displayausgabe machst und 
deine LCD Bib macht wegen der langsamen Ansteuerung des LCD Wartepausen, 
dann kann es sein das du noch in der Interrupt Routine bist währen der 
nächste Impulse schon wieder ein Interrupt auslöst. Simulier es mal auf 
dem Computer dann wirst sehen wie lange die Ansteuerung des LCD dauert.

Gruss Martin.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.