Hallo! Ich möchte über einen atmega328 und einen Piezo-Piepser Töne mit verschiedenen Frequenzen und Lautstärken erzeugen. Das ganze soll möglichst wenig Rechenzeit in Anspruch nehmen. Meine Idee ist folgende: Timer0 erzeugt über PWM ein hochfrequentes (unhörbares) Signal an einem Pin. Timer1 erzeugt mit der doppelten gewünschten (hörbaren) Frequenz einen Interrupt, in der ISR wird dann Timer0 gestartet oder angehalten. Gibt es einen einfacheren Weg?
Daniel schrieb: > Gibt es einen einfacheren Weg? Du setzt voraus, daß das funktioniert. Hätte gern zuerst das Resultat deines Versuches erfahren.
Daniel schrieb: > Ich möchte über einen atmega328 und einen Piezo-Piepser Töne mit > verschiedenen Frequenzen und Lautstärken erzeugen. Das ganze soll > möglichst wenig Rechenzeit in Anspruch nehmen. Meine Idee ist folgende: > > Timer0 erzeugt über PWM ein hochfrequentes (unhörbares) Signal an einem > Pin. > Timer1 erzeugt mit der doppelten gewünschten (hörbaren) Frequenz einen > Interrupt, in der ISR wird dann Timer0 gestartet oder angehalten. > > Gibt es einen einfacheren Weg? Zumindest gibt es einen besseren Weg. Der kommt erstens mit nur einem Timer aus und braucht zweitens überhaupt keine Rechenzeit. Man benutzt dafür den Timer-Mode 7 (fast PWM mit konfigurierbarer Zykluszeit). OCRxA bestimmt dann die Frequenz des erzeugten Tones, OCRxB die Lautstärke. Das Ergebnis fällt über den OCRxB-Pin aus dem AVR. Zu beachten ist, daß der "Lautstärke"-Steller nicht stetig und frequenzabhängig ist. Es gibt zwei Minima, nämlich bei OCRxB==0 und bei OCRxB>=OCRxA-1. Das Maximum hat man bei OCRxB==OCRxA>>1. Bei Manipulationen an der Lautstärke muß man also immer die aktuelle Frequenz berücksichtigen, was ziemlich simpel ist. Komplizerter ist es, bei Frequenzänderungen die Lautstärke konstant zu halten, damit das auch über viele Frequnzänderungen hinweg reproduzierbar gelingt, muß man etwas mehr Gehirnschmalz fließen lassen.
Die Idee hatte ich auch schon, das Ergebnis klingt aber furchtbar. Die PWM-Frequenz muss auf jeden Fall im unhörbaren Bereich liegen, sonst klingt der Ton extrem verzerrt, aber nicht wesentlich leiser.
Daniel schrieb: > Die Idee hatte ich auch schon, das Ergebnis klingt aber furchtbar. PWM-Anfänger-Standardfehler. Bei PWM gleich welcher Art braucht man praktisch immer auch einen vernünftig dimensionierten Filter vor dem Wandler, damit was brauchbares rauskommt. Den hast du offensichtlich "vergessen"... Grob durch die Glaskugel gesehen würde hier vermutlich ein einfacher Tiefpaß 1. Ordnung schon genügen, um da was für deine Zwecke hinreichend brauchbares zu machen. Da der Ausgang des AVR bereits eine nennenswerte Impedanz besitzt, brauchst du also in erster Näherung bloß noch einen Kondensator parallel zu deinem Piezowandler, um einen geeigneten Tiefpaßfilter zu komplettieren. Probier einfach 100p, 1n, 10n 100n usw. bei geringer Lautstärke und der geringsten zu nutzenden Frequenz aus. Wenn sich der Ton dann richtig gut anhört, wird er sich auch bei hoher Lautstärke gut anhören. Nun gehst du auf die höchste zu nutzende Frequenz und die höchste Lautstärke. Möglicherweise wird dir das dann zu leise sein. Dann mußt du den Kondensator wieder kleiner machen. Sein Wert ist also im Prinzip ein Kompromiß zwischen nutzbaren Frequenzbereich und Wirkungsgrad bei hohen Frequenzen. Wenn du bei gegebenem Frequenzbereich keinen an beiden Enden akzeptablen Kompromiß finden kannst, brauchst du einen besseren Filter als einen einfachen Tiefpaß und einen Verstärker. BTW: Man kann sowas auch ausrechnen/simulieren. Z.B. mit LTSpice.
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.