Forum: Mikrocontroller und Digitale Elektronik AVR Lautstärkeregung


von Daniel (Gast)


Lesenswert?

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?

von Guido (Gast)


Lesenswert?

Daniel schrieb:
> Gibt es einen einfacheren Weg?

Du setzt voraus, daß das funktioniert. Hätte gern zuerst das Resultat 
deines Versuches erfahren.

von Daniel (Gast)


Lesenswert?

Der Versuch findet erst statt, wenn ich ein paar Meinungen gehört habe 
:)

von c-hater (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

von Daniel (Gast)


Lesenswert?

Alles klar, werde ich ausprobieren. Danke für den Tip!

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.