Hallo, Mir ist die Methode der Frequenzmessung durch die Methode von Messung der Periodendauer noch nicht klar. Ich habe Atmega128, Quartz hat 3,6864 Mhz, ich habe einen Genrator, der ein Wechselspannung erzeugt. Erstmal nur eine Phase. Ziel ist den Frequenz zu messen. Vorgehensweise: 1- Die Frequenz wird den Eingang an Interrupt INT7 gemessen. 2- Takt für Timer0 erzeugen: 3,6864 Mhz / 32(prescaler) = 115,2 khz 3- Einen 1 millisekunden Interrupt für Timer0 auslösen: - OCR0 = 114 Schritte, weil 115,2 khz ==> 256 (Timer0 ist 1 Byte) 1 khz (1ms) ==> x => x = 114 (0 - 115) 4- Im Timer0 - interrupt Routine jede 1 ms wird ein Zähler um 115 erhöht, weil 115,2 khz / 1khz = 115,2 => 115 pro ms. 5- Bei der steigende Flanke am INT7 (Spannung vom Gerator) wird die Periodendauer ermittelt. WIE GEHT ES JETZT WEITER ??? Frequenz = x * y ??? DANKE
f = 1 / t
Siehe Grundkurs Physik
f ... Frequenz
t ... Periodendauer
Eine Frequenz von 1 Hz macht 1 Schwingung in der Sekunde.
d.h. eine Schwingung ist 1 Sekunde lang
Eine Frequenz von 2 Hz macht 2 Schwingungen in der Sekunde
d.h. eine Schwingung ist 0.5 Sekunden lang
....
> WIE GEHT ES JETZT WEITER ???
Dein Zählerstand ist ein Mass für die Zeit.
Welche Zeit hast du daher gemessen, wenn dein Zählerstand y ist?
Dann 1 durch diese Zeit und du hast die Frequenz.
Aber vorher ein bischen mit den Formeln jonglieren. Ziel ist es die
Division zu vermeiden oder zumindest trivial zu machen. Eine Division
durch 256 ist zb trivial. Allgemeiner: Divisionen durch 2-er Potenzen
sind trivial.
danke erstmal für die schnelle Antwort. Ich weiß ja daß f = 1 / T,. ABER T habe ich im zweiten Interrupt ermmittelt. Es befindet sich in der Var iable, die im Timer0-Interrupt-Routine jede Millisekunde um 115 erhöht wird PLUS den Rewst im TCNT0 Also T = Var_Periodendauer + TCNT0. Aber ich kann nicht folgndes sagen: f = 1 / T = 1 / (Var_Periodendauer + TCNT0). Irgendwas fehlt noch.
derjeniger schrieb: > Aber ich kann nicht folgndes sagen: > f = 1 / T = 1 / (Var_Periodendauer + TCNT0). Warum nicht? > Irgendwas fehlt noch. Genau. Zb dein bisheriger Code
Oder auch einfach nur die Bereitschaft sich mit Papier und Bleistift hinzusetzen und ein wenig mit Zahlen und Formeln rumzumachen. Nimm einfach mal eine Frequenz von x Hz an. Die legst du an deinen INT7. Jetzt rechnest du dir ganz schnell aus, welchen Messwert du haben müsstest (am besten nimmst du x so an, dass du die Frequenz auch real erzeugen kannst. Ist beim Debuggen hilfreich, wenn man auf einen oder mehrere bekannte Sätze von Werten zurückgreifen kann). So. Jetzt drehst du das Papier um und versuchst auf dem Papier aus diesem Messwert wieder auf die Frequenz zurückzurechnen. Wobei du gleich mal die Regeln deiner Programmiersprache ein wenig beachtest. Also die Sache mit Integer Divisionen und Überläufen und so. Das wird vielleicht nicht auf Anhieb klappen. Du wirst zb feststellen, dass dir zwischendurch ein paar wirklich wichtige Kommastellen durch die Integer Divisionen flöten gehen. Also siehst du dir an, wie du die Berechnung umstellen kannst, so dass genau das nicht passiert. Nach ein paar Versuchen wird aber deine Berechnungsmethode immer konkreter werden und irgendwann hast du die korrekte Reihenfolge ausgetüfftelt, so dass deine Ergebnisse richtig sind. Zur Kontrolle probierst du auch noch einen 2ten oder 3ten Satz von Frequenzen/berechneten_Messwerten und kontrollierst, ob auch dort das Richtige raus kommt. Ist alles in Ordnung, gehts wieder zurück an den PC und die Berechnungsmethode wird in C umgesetzt.
f_input = f_cpu / counts Oder genauer bei höheren Frequenzen über mehrere Perioden: f_input = f_cpu * perioden / counts Peter
VIELEN VIELEN DANK für die Antworten. @Karl heinz Buchegger: danke. @ Peter Dannegger: Der Formel : f_input = f_cpu / counts . das ist, was mir fehlte f_cpu. Weil ich counts so errechnet habe : Var_Periodendauer + TCNT0. Die Einheit wird nicht stimmen, wenn ich so rechne: f = 1 / T = 1 / (Var_Perioidendauer + TCNT0) = 1 / counts. Ich bekomme kein Hz als EInheit. ABER mit f_cpu / counts stimmt es. Also vom Ergebnis her stimmt es jetzt. ABER kannst du sagen woher dieser Formel "f_cpu / counts " kommt?
derjeniger schrieb: > ABER kannst du sagen woher dieser Formel "f_cpu / counts " kommt? Ausgangspunkt ist diese Fragestellung: Wenn deine CPU in 1 Sekunde 6 Millionen Taktzyklen zur Verfügung hat (weil sie mit 6Mhz getaktet wird), wie lange (in Sekunden) dauert es dann (in Sekunden) eine bestimmte Anzahl x abzuarbeiten. f_cpu ist an dieser Stelle einfach nur ein anderer Wert für 1 Sekunde, weil dein count auch in Taktzyklen gerechnet wird. Anstelle von 1 Sekunde kann man auch mit f_cpu rechnen. Was den Vorteil hat, das Sekundenbruchteile nicht durch heftige Kommazahlen darsgestellt werden, sondern durch kleine Taktzyklenzahlen. Aussdem kriegst du aus deiner Messung direkt die Anzahl an Taktzyklen raus. f = 1 / t t hast du aber nicht direkt. Du hast einen count. wenn f_cpu Zyklen 1 Sekunde entspricht, dann entsprechen count Zyklen wievielen Sekunden f_cpu 1 count x _------------------- 1 * count x = ------------- f_cpu x ist aber nichts anderes als das t in f = 1 / t Also kann man das einfach mal einsetzen f = 1 / t = 1 / ( 1*count) / f_cpu Doppelbruch auflösen f = f_cpu / count Sagte ich nicht, das ein bischen Papierarbeit noch nie geschadet hat? Auf dasselbe Ergebnis wärst du auch gekommen, wenn du in deinerm Rechengang (der auf Sekunden basiert) versucht hättest die Sekunden zu elimnieren (weil die abartig kleine Kommazahlen ergeben hätten) Das ganze hat ein bischen was von In eine Apfelkiste passen 36 Äpfel. Für eine Kiste Äpfel bekommt man 12 Euro. Ist eine Kiste nicht voll, bekommt man einen anteilsmässigen Betrag (also für eine halbe Kiste 6 Euro etc). Wieviele Euro bekomme ich wenn ich 123 Äpfel habe. Du kannst das natürlich lösen, indem du dir zuerst die Anzahl an Kisten ausrechnest. 123 / 36 = 3.41666 Kisten 3.41666 Kisten * 12 Euro = 41 Euro Du kannst das aber auch lösen, indem du beide Formeln zusammenziehst, so dass du die Anzahl der Kisten gar nicht mehr explizit berechnen musst Äpfel / Äpfel_pro_Kiste * Preis_pro_Kiste Was den Vorteil hat, dass du die Formel umstellen kannt Äpfel * Preis_pro_Kiste / Äpfel_pre_Kiste 123 * 12 / 36 = 1476 / 36 = 41 Der Unterschied: Im ersten Fall hast du zwischendrinn Kommazahlen benötigt. Im zweiten Fall ist alles mit Ganzzahlarithmetik abgegangen, weil die eigentliche Anzahl an Kisten gar nicht expplizit berechnet werden muss. Was hier die Kette Äpfel -> Kisten -> Euro darstellt, ist bei dir die Kette Timertakte -> Zeit -> Frequenz mit ein bischen Formelumstellen kann man jeweils die mittlere Einheit loswerden.
@ Karl heinz Buchegger das war mehr als klar, herzlichen Dank
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.