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
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
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.
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.
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
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
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
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.
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.
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
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 :)
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.