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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.