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


von Tobias (Gast)


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!

von Jochen M. (taschenbuch)


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

von Andreas W. (Gast)


Lesenswert?

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

Das ist sogar mathematisch sehr interesant.

von Timer (Gast)


Lesenswert?

da hab ich mal eine frequenzmessnug realisiert:
Beitrag "Frequenzmessung und Optimierung -Os"

von Weingut P. (weinbauer)


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

von Tobias (Gast)


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?

von Ich (Gast)


Lesenswert?

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

von Michael H. (mah)


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

von anderer Gast (Gast)


Lesenswert?

Goertzel-Algorithmus ist nur für einen Ton, einen bestimmten.

von Jochen M. (taschenbuch)


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

von Tobias (Gast)


Lesenswert?

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

von Tobias (Gast)


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

von Chris D. (m8nix)


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

von Tobias (Gast)


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

von Roland P. (pram)


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

von Tobias (Gast)


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?

von Andreas A. (Firma: Embedded Microtec) (andi) Flattr this


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

von Tobias (Gast)


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

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