www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzmessung nach Periodendauer-Messung


Autor: derjeniger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: derjeniger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: derjeniger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo hat keiner Antwort auf meine Frage???

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder Deine Einheit (Millisekunden?)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
f_input = f_cpu / counts


Oder genauer bei höheren Frequenzen über mehrere Perioden:

f_input = f_cpu * perioden / counts


Peter

Autor: derjeniger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: derjeniger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl heinz Buchegger

das war mehr als klar, herzlichen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.