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!
>>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
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?
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
>>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
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
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
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
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
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?
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
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