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