Hallo zusammen, zunächst mal eine kurze Beschreibung was ich vorhabe: Ich möchte die Frequenz eines Sinus Signals ermitteln, wenn sich diese Frequenz in einem bestimmten Bereich (20kHz-80kHz) befindet, einen Ausgang auf High setzen. Mit diesem Ausgang soll dann ein Aufnahmesystem getriggert werden. Verwendete Hardware: ATMEGA 644 20PU 1020 @ 20Mhz (externe Taktquelle) STK 500 Programmierboard (über COM angeschlossen) Verwendete Software: AVRStudio 4 Geplante Vorgehensweise: 1. Durch den Analog Comparator die Flankenwechsel registrieren 2. Bei jedem positiven Flankenwechsel den Counter1 um 1 erhöhen 3. Den Counter1 nach einer bestimmten Zeit zurücksetzen 4. überschreiten die gezählten Flanken in Counter1 einen bestimmten Wert, soll ein Interrupt ausgelöst werden. Da der Counter ja zyklisch zurückgesetzt wird, kann man davon ausgehen, dass die Frequenz des aufgenommenen Signals > als die eingestellte Frequenz ist und die Triggerbedinung wäre damit erfüllt. Bisheriges Vorgehen: Ich wollte mich an die Lösung Schritt für Schritt herantasten und habe daher zunächst ein einfaches Programm geschrieben. Welches den Analog Comparator mit dem Timer/Counter1 verbindet. Das Ganze teste ich mit einem Funktionsgenerator. Die Masse des Funktionsgenerators ist mit dem Referenzpin des AnalogComparators AIN1 (PB3) und das Signal des Funktionsgenerators ist mit AIN0 (PB2) verdrahtet. Erwartetes Verhalten: Ich würde nun erwarten, dass die LEDs mit der Frequenz des angeschlossenen Funktionsgenerators (binär) hochgezählt werden. Tatsächliches Verhalten: Bei tiefen Frequenzen 1Hz-20Hz: Die Leds zeigen Zählwerte an, allerdings scheinen dabei etliche Schritte übersprungen zu werden. z.B. bei 1Hz fängt er mit 0b00000001 an und bei der nächsten Flanke kommt dann 0b00001110. bei f>40Hz friert die LED Anzeige ein. Es scheint nichts mehr gezählt zu werden. Fragen: 1.Ich bin nun die Abschnitte zu Timer und Comparator im Datenblatt des ATMEGA 644 etliche male durchgegangen und bin mit dieser Information zu den Einstellungen im angehängten Quelltext gekommen. Sind diese Einstellungen prinzipiell richtig für das was ich vorhabe? 2. Ist es denn prinzipiell möglich den Comparator auf diese Weise zu nutzen oder ist er zu träge um Signale mit höherer Frequenz abzutasten? Wenn das der Fall ist, könnte ich ja noch einen externen Komparator zusammenbauen und diesen dann direkt auf den Zähler verdrahten. Liebe Grüße und vielen Dank im Voraus für die Unterstützung!
Philipp D. schrieb: > bei 1Hz fängt er mit 0b00000001 an und bei der nächsten Flanke > kommt dann 0b00001110 Ein Signal hat nicht nur einen Nulldurchgang, sondern stelle dir ein 1Hz Sinus vor mit einem überlagerten 50Hz Sinus dann kommt es in der Nähe des Nulldurchgangs zu mehreren Flankenwechseln. http://www.hno-vahle.de/wp-content/uploads/2-Sinus.jpg Zu verhindern durch eine Hysterese. Der Hysteresewert sollte allerdings zur Signalamplitude passen. Natürlich gibt es nicht nur weitere Sinustöne, sondern allgemein Störungen wie Rauschen und Brummen. Besse sind Methoden, die eine Fourniertransformation vom Signale und sich dort den Maximalwert suchen. Oder wenn man Frequenzen filtern will eine IIR.
Hallo Michael Bertrandt, vielen Dank für die Antwort! Bei der Sache mit der Hysterese liegen Sie natürlich völlig richtig. In diesem Teststadium habe ich auch schon daran gedacht, und an dem Funktionsgenerator einen Offset eingestellt, der Sinus schwingt dann nicht mehr um 0 sondern um 1V mit einer Amplitude von 2V. Insofern habe ich mir die Hysterese so hingetrickst. Das habe ich natürlich vergessen im 1.Post zu beschreiben. Eine Fouriertransformation bzw. eine Filterung mit IIR des Signals, werde ich wohl mit dieser Hardware (zumindest nicht so schnell wie benötigt) realisieren können...
>Ich möchte die Frequenz eines Sinus Signals ermitteln, wenn sich diese >Frequenz in einem bestimmten Bereich (20kHz-80kHz) befindet, einen >Ausgang auf High setzen. Mit diesem Ausgang soll dann ein Aufnahmesystem >getriggert werden. Warum muss der Bereich so gross sein? Wenn du z.B. einfach sagst 40kHz könnte man das komplett ohne uC zuverlässig mit einem NE567 lösen.
Hallo Holger, der Trigger soll dazu verwendet werden Fledermausrufe zu detektieren. Diese rufen (abhängig von Art usw. ) in verschiedenen Frequenzbereichen im Ultraschallbereich zwischen 20kHz und 80kHz. Aus diesem Grund wäre es schön, wenn das Ganze auf einem flexiblen programmatischen Wege (µc) lösbar wäre. Die Variante mit dem Timer ist aber eine gute Idee, vllt. ist ja eine "Hybrid-Lösung" für mich das richtige, bei der ich Komparator und Timer extern in einer Schaltung aufbaue und dann die Einstellungen des Timerbausteins über den ATMEGA festlege, oder irgendwie so... Ich würde nur gerne wissen woran es liegt, dass mein Code nicht das tut was ich erwarte. Irgendwo habe ich dabei einen Denkfehler. Weil im Datenblatt ja steht, dass ich den Interrupt des Analog Comparators durch setzen eines Bits, intern auf den Eingang des Counters legen kann. Nur leider zählt der Counter nicht so wie ich mir das eben vorstelle. ich werde morgen noch einpar Versuche hierzu machen und die Ergebnisse posten. Wenn jemand Anregung hat was ich probieren kann dann immer her damit! Bis dorthin wünsche ich noch einen erholsamen Abend!
Beitrag "BatDroid: Ultraschall Fledermausrufe Aufnahmesystem und Stereo Bat-Detector mit Android UI"
Hallo miteinander, ich habe mich jetzt entschieden, dass ganze mit einem Komparator und Counter extern aufzubauen und dann damit auf einen Eingang des ATMEGA zu gehen. Deshalb auch kein neues Code Beispiel, da ich gerade am Löten bin. Wenn mein Lösungsansatz fertig ist kann und werde ich natürlich darüber berichten. Liebe Grüße
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.