www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tonfrequenz mit mega8 in 75ms ermitteln


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal,

ich stehe grade vor einem Riesen Problem und komm nicht weiter. Ich 
möchte mit einem ATmega8 tonfrequenzen ermitteln. Das ganze soll in 75ms 
passieren, sodass ich dann den wert habe und damit arbeiten kann. es 
geht um Frequenzen von bis zu 5 kHz.
Momentan bin ich soweit, dass ich den Timer1 verwenden muss. Ich habe 
auch rausfinden können, dass ich wohl auch noch die Pin's AIN0 und AIN1 
verwenden muss.
Ich habe aber keine Ahnung, was ich da genau machen soll. Ich muss doch 
Timer1 auf genau 75ms laufzeit regeln und mit einem Zähler die Positiven 
Flanken meines Signals zählen. Jedesmal wenn Timer1 dann nach 75ms 
fertig ist den wert auslesen und damit kann ich dann arbeiten.
Kann mir das einer Erklären, damit ich auch verstehe, was ich da mache 
und später auch drauf aufbauen kann? Bringt mir ja nix, fremden Code zu 
verwenden und keine Ahnung zu haben, was der eigentlich bewirkt!

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>möchte mit einem ATmega8 tonfrequenzen ermitteln.
Das ALLEINE sagt nicht viel...
Auch die Kurvenform, nur die Frequenz, welche Genauigkeit,...

Falls es nur um die Frequenz geht und Dein Signal elektrisch kompatibel 
zu den IO-Pegeln des AVR ist...

1) Polling
Du machst einen schnellen Timer-Int auf. In der ISR tastest Du das 
Signal ab und merkst Dir die Anzahl der Abtastungen zwischen 2 
Nulldurchgängen.
Da die Zeit zwischen den Timer-Ints ja bekannt ist, kann so die Frequenz 
errechnet werden.

2) Interrupt
Dein Signal löst einen PinChange Interupt (flankengesteuert) aus.
In der ISR rufst Du den Wert des 16Bit Zählers ab, speicherst ihn.
Beim nächsten INT vergleichst Du dann den aktuellen mit dem vorherigen 
Zählerwert. Aus der Differenz errechnest Du die Frequenz.

Das ganze (in beiden Varianten) natürlich immer wiederkehrend und ggfs. 
aus einer Anzahl von Messungen den Mittelwert bilden.


Jochen Müller

Autor: Andreas W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hälst du davon?
http://elm-chan.org/works/akilcd/report_e.html

Das ist sogar mathematisch sehr interesant.

Autor: Timer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da hab ich mal eine frequenzmessnug realisiert:
Beitrag "Frequenzmessung und Optimierung -Os"

Autor: Weingut Pfalz (weinbauer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm ... hab mal sowas gemacht mit fft
war dann ne Lichtorgel mit 32 Kanälen, war ganz interessant.
Rechenzeit war irgendwas um 25ms bei 16MHz

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Genauigkeit sollte im Bereich von +/- 10 Hz liegen. Größere 
abweichungen kann ich aber noch in der Software berücksichtigen. Die 
Töne haben einen mindestfrequenzabstand von 100Hz.
Es handelt sich immer um einen Einzigen Ton, also ist eine FFT nicht 
notwendig. Das Signal ist ein Audiosignal und wurde an AIN0 und AIN1 
angeschlossen.
Wenn ich das Signal nun in ein TTL-Rechtecksignal umwandle kann ich das 
doch auch an INT0 anschließen und dann Zählen, wieviel Zeit ich von 
0-Flanke zu 0-Flanke habe, oder?
Wie mache ich das am Besten? Welche Bausteine sind dazu dann geeignet?

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm odch die FFT. Ist vermutlich genauer als der Timer. Ausseredem 
lernst du noch was dabei.

Autor: Michael Haberler (mah)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest auch den Görtzel-Algroithmus probieren. Ist zwar für 
Multi-Tone Erkennung (DTMF), aber vielleicht lasst er sich auf single 
tone hinbiegen.

http://www.tahina.priv.at/~cm/hacks/

-mah

Autor: anderer Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Goertzel-Algorithmus ist nur für einen Ton, einen bestimmten.

Autor: Jochen Müller (taschenbuch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Wenn ich das Signal nun in ein TTL-Rechtecksignal umwandle kann ich das
>>doch auch an INT0 anschließen und dann Zählen, wieviel Zeit ich von
>>0-Flanke zu 0-Flanke habe, oder?

Ja. Wie bereits oben erläutert.
Liest Du eigentlich die Antworten auf Deine Frage nicht?

Jochen Müller

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch tue ich, ich wollts nur nochmal bestätigt haben, nicht das ich was 
falsch verstanden habe!

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich nochmal.

Ich habe es jetzt geschafft, dass der AVR mir eine Frequenz, die ich 
anschließe auch anzeigt. Funktioniert ganz gut.
Wenn ich nun Audiosignale habe, wie messe ich die? Das sind ja keine 
TTL-Pegel. Haben weder den 5V-Pegel noch sind es rechtecksignale. Wie 
ändere ich das? Gibt es da eine einfache und dennoch zuverlässige 
lösung?

Tobias

Autor: Chris D. (m8nix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wohl kaum Tobias,

Audiosignale bestehen immer aus Frequenzspektren... Das heisst, ein 
Sammelsurium an einzelnen Frequenzen wird zusammengemischt damit es ein 
"Ganzes" ergibt. Es gibt eine Methode herauszufinden aus welchen 
Spektren Signale zusammengesetzt sind. Aber die ist a) sehr 
zeitaufwendig zu berechnen und b) nicht leicht zu erlernen bzw. 
umzusetzten. Das ganze nennt sich Fast Fourier Transformaion. Ich wäre 
froh wenn mir diese Tranformation mal jemand schlüssig erklären könnte 
;-) (Könnt ich selber gut gebrauchen)

Was hast du denn nun genau vor? Beschreib mal die Aufgabenstellung... 
Beats per Minute ermitteln???? ...

Gruss Chris

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine von einer Externen Signalquelle ein Audiosignal mit 
einzellnen Tönen. Es handelt sich also nicht um Mischungen verschiedener 
Frequenzen, die können zwar auch vorkommen interessieren mich aber nicht 
weiter. Diese einzelnen Töne möchte ich erkennen. Es sind feste 
frequenzen mit mindestens 100Hz unterschied zu einander, von 800Hz bis 
etwas über 5kHz möchte ich auswerten.
Das auswerten funktioniert auch soweit wenn ich meinen Testtongenerator 
anschließe und es mit dem TTL-Signalausgang probiere, aber der 
Audio-Signalausgang ist einfach zu schwach. Ausserdem muss ich das ganze 
ja noch auf die Rechteckform bringen, damit es wirklich TTl-Signale 
sind, die ich auswerten kann.
Im späteren Betrieb kann das Signal auch mal von einer Soundkarte 
kommen, deshalb brauche ich diese umwandlung von Audio zu TTL

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst das Audiosignal nur genug verstärken, bis der Verstärker zu 
clippen beginnt, dann hast dei Rechteck.

Ein Einlesen mit dem A/D-Wandler wäre ebenfalls möglich und daraus dann 
den Rechteck ableiten.

Für deinen Anwendungsfall würd ich mir aber auch noch folgendes 
anschauen:
Beitrag "Goertzel-Algorithmus"
Beitrag "FFT auf dem AVR"

Gruß
Roland

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich muss einen 5-Ton auswerter nach ZVEI bauen. Soll für einen 
Hausalarm sein. Die Folgen bestehen aus 5 Nacheinanader vollgenden 
einfachen Tönen. Jeder Ton ist 75ms lang und besteht nur aus einem Ton. 
Ich habe vertige Schaltungen gesehen, die dafür den Analogkomperator 
benutzt haben.
Ich benutze momentan den ICP und Timer1.
Währe der Analogkomperator für meine Zwecke hier besser geeignet und wie 
arbeite ich damit?

Autor: Andreas Auer (Firma: Embedded Microtec) (andi) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Analogkomperator ist im Falle des Audio Signals sicher sinnvoll. Nachdem 
deine Software aber schon gut ohne dem Komperator läuft würd ich an 
deiner Stelle extern einen Komperator aufbauen. Schaltungen solltest du 
im Internet einige finden.
Im Grunde besteht sowas aus einem OPV mit einer positiven Rückkopplung, 
wodurch dein OPV immer in die Begrenzung geht und du damit ein 
Rechtecksignal bekommst. Rückgekoppelt wird dabei normalerweise so, dass 
sie die Schaltschwelle ein bisschen ändert (Hysterese) um Schwingungen 
zu vermeiden (falls dein Signal direkt bei der Schaltschwelle 
herumtorkelt).

Aufpassen musst du noch, da dein Audiosignal wahrscheinlich ohne 
Gleichanteil daherkommt. D.h. du gehst mit dem Audiosignal über einen 
Kondensator auf einen Spannungsteiler, der dir das Signal genau auf 
VDD/2 bringt (Aufpassen auf die Grenzfrequenz des Hochpasses - C + 
Spannungsteiler). Dann gehst du auf deinen OPV, der als Komperator 
geschaltet ist, und jetzt hast du am Ausgang ein Rechtecksignal das du 
auf deinen Mega8 geben kannst.

So sollte das ganze eigentlich funktionieren!

mfg
Andreas

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könntst du einen Link zu einer Kmparatorschaltung Posten? Ich bin auf 
dem gebiet nicht grad gut bewandert und im Internet gibts es so viele 
Beispiele.
Ich bräuchte halt einen, der so wie er ist auf meine Schaltung anwendbar 
ist
Danke

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.