Forum: Mikrocontroller und Digitale Elektronik Sinussignal erzeugen


von moin (Gast)


Angehängte Dateien:

Lesenswert?

Moin Leude. Wie kann ich am AVR ein Sinussignal ausgeben?
Die Idee dahinter ist, einen kleinen Lautsprecher anzusteuern (siehe 
Bild), z.B. einen Ton mit 440Hz.
Mit einem Rechtecksignal habe ich das bereits hinbekommen (ohne PWM), 
aber wie ich ein Sinussignal hinbekomme kann ich mir gerade nicht 
vorstellen.

Könnt ihr mir ein Codebeispiel geben?

von Dirk B. (dirkb2)


Lesenswert?

Sinus? Diese schöne smoothige Kurve, mit den weichen Übergängen?
Geht nicht bei dir?

Und das Rechtecksignal mit seinen zwei harten Zustanden hat 
funktioniert?

von Kuno B. (Gast)


Lesenswert?

Dirk B. schrieb:
> Sinus? Diese schöne smoothige Kurve, mit den weichen Übergängen?
> Geht nicht bei dir?
>
> Und das Rechtecksignal mit seinen zwei harten Zustanden hat
> funktioniert?

Genau das schrieb er. Du bist ein Blitzmerker :-)

von Sebastian R. (sebastian_r569)


Lesenswert?

Najoa, dem DAC einen Wert übergeben, der in Abhängigkeit der Zeit einen 
sinusförmigen Verlauf hat. Setzt natürlich voraus, dass man einen 
Controller mit DAC gewählt hat. Ansonsten kann ein Tiefpass ein Rechteck 
schon rundbiegen.

von Falk B. (falk)


Lesenswert?

moin schrieb:
> Moin Leude. Wie kann ich am AVR ein Sinussignal ausgeben?

Mit PWM und einer Sinustabelle. Die PWM-Frequenz sollte dabei 
ausreichend hoch sein, so um die 8-22kHz.

Beitrag "Re: H-Bridge 50Hz Sinus - LC Filter dimensionieren"

von Alsdhsihfd (Gast)


Lesenswert?

Er will aber 440 Hz, nicht 50! Nun, es kommt auf die Verzerrungen an, 
die du zulässt! Willst du einen ganz sauberen Ton, dann brauchst dur 
Rechenleistung bzw. eine sehr hohe Taktrate. Schau dich um nach 
Tongenerator-ICs oder machs einfach analog.

von Axel S. (a-za-z0-9)


Lesenswert?

moin schrieb:
> Moin Leude. Wie kann ich am AVR ein Sinussignal ausgeben?

Gar nicht. Bestenfalls näherungsweise.

> Die Idee dahinter ist, einen kleinen Lautsprecher anzusteuern (siehe
> Bild), z.B. einen Ton mit 440Hz.

Und warum muß das ein Sinus sein?

> Mit einem Rechtecksignal habe ich das bereits hinbekommen (ohne PWM),
> aber wie ich ein Sinussignal hinbekomme kann ich mir gerade nicht
> vorstellen.

Mit einer hinreichend schnellen PWM, bei der du den PWM-Wert schnell 
änderst (einmal pro PWM-Periode) kannst du etwas hinbekommen, das vom 
Lautsprecher und den Ohren zu etwas ähnlichem wie ein Sinus geformt 
wird.

Nehmen wir mal an, du hast 11MHz Taktfrequenz und eine 8-Bit PWM. Dann 
dauert eine PWM-Periode 11MHz÷256 ~= 43kHz. Es kommen dann knapp 98 
solche PWM-Perioden auf eine Periode deines 440Hz Tons (genau sind es 
97.65625). Wenn du also eine Tabelle mit 98 Werten anlegst, die mit 
einer Periode eines Sinus befüllst (skaliert und verschoben auf Werte 
zwischen 0 und 255), und im PWM-Timer Interrupt imer den nächsten Wert 
ins PWM-Register schreibst, dann kannst du so einen halbwegs 
sinusartigen 440Hz Ton ausgeben.

von Harald W. (wilhelms)


Lesenswert?

moin schrieb:

> Mit einem Rechtecksignal habe ich das bereits hinbekommen (ohne PWM),
> aber wie ich ein Sinussignal hinbekomme kann ich mir gerade nicht
> vorstellen.

Wenn Du nur eine Frequenz ausgeben willst,
reicht ein analoges Tiefpassfilter. Je nach
Nebenbedingungen, zu denen Du nichts schreibst,
gibt es unterschiedliche Lösungen zur Erzeugung
von Sinussignalen.

von Falk B. (falk)


Lesenswert?

Alsdhsihfd schrieb:
> Er will aber 440 Hz, nicht 50! Nun, es kommt auf die Verzerrungen an,
> die du zulässt! Willst du einen ganz sauberen Ton, dann brauchst dur
> Rechenleistung bzw. eine sehr hohe Taktrate. Schau dich um nach
> Tongenerator-ICs oder machs einfach analog.

Jaja, unsere "Experten" und Reichsbedenkenträger mal wieder.

Komisch nur, daß sich der Rest der Welt nicht verrückt macht und 
ziemlich entspannt und auch mit ziemlich guter Qualität auf diese Weise 
sogar Audiodateien abspielt.

Beitrag "Re: Arduino Nano, SD Card, PCM"

von Timo N. (tnn85)


Lesenswert?

Für einen sauberen Sinus brauchst du so einen IC hinter dem AVR:

https://www.mikrocontroller.net/articles/DDS

Für die Impedanzanpassung auf 8 Ohm lohnt sich einen Verstärker dahinter 
und vor den Lautsprecher zu schalten.

von Gerhard Z. (germel)


Lesenswert?

Ohne PWM dafür aber mit Widerstandsnetzwerk (wohl das erste Projekt von 
Andreas) siehe hier:

https://www.mikrocontroller.net/articles/Digitaler_Funktionsgenerator

Da musst du nur noch einen Verstärker dahinter schalten. Dann geht nicht 
nur Sinus.

Gerhard

von Karl M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mal einen 1750Hz PWM Sinusgenerator gebaut.

Hier sind ein paar Spezifikationen:
* Als Mikrocontroller kommt eine Attiny85 SOIC-8 zum Einsatz.

* Er verwendet den internen RC-Oszillator, der über eine PLL den AVR 
CPU-
Kern mit 16MHz versorgt.

* Das Sinussignal wird durch den Attiny85 über eine 8Bit PWM mit 64MHZ 
PWM-
Frequenz mit 224 Sinus-Stützstellen generiert.

* ein 3-stufiges Tiefpassfilter sorgt mit einem nachgeschalteten
Emitterfolger für ein sauberes und belastbares Signal.

* Über einen Piezoschallwandler kann man das 1750Hz Sinussignal direkt 
einem Mikrofon eines Sendeempfängers zuführen.

* Alternativ kann man das 1750Hz Sinussignal direkt an einen 
Sendeempfängers einkoppeln, wenn man einen Spannungsteiler nebst 
Koppelkondensator einsetzt.

Das Spektrum wurde von Piezo-Lautsprecher über eine t.bone EM 800 
Kondensator-Kleinmembranmikrofon abgenommen und dann über Audacity eine 
FFT Durchgeführt.

von moin (Gast)


Lesenswert?

Klasse durch die vielen Antworten lese ich mich heut Abend durch.

Es soll eine Musicbox werden, man drückt eine Taste und es wird eine 
Note nach der anderen abgespielt. Bis zu 4 Stimmen gleichzeitig d.h. 
vier verschiedene Noten auf einmal sollen dabei abgespielt werden 
können.

von Falk B. (falk)


Lesenswert?

moin schrieb:
> Klasse durch die vielen Antworten lese ich mich heut Abend durch.
>
> Es soll eine Musicbox werden, man drückt eine Taste und es wird eine
> Note nach der anderen abgespielt. Bis zu 4 Stimmen gleichzeitig d.h.
> vier verschiedene Noten auf einmal sollen dabei abgespielt werden
> können.

Dann braucht es schon etwas mehr Know How. Aber der Meister aus dem 
Fernen Osten macht es vor.

http://elm-chan.org/works/mxb/report.html

von Harald W. (wilhelms)


Lesenswert?

moin schrieb:

> Es soll eine Musicbox werden, man drückt eine Taste und es wird eine
> Note nach der anderen abgespielt. Bis zu 4 Stimmen gleichzeitig d.h.
> vier verschiedene Noten auf einmal sollen dabei abgespielt werden
> können.

Vielleicht wäre das hier dann besser geeignet:
Beitrag "[V] Platinen aus Orgel Bj 1980"

von Wolfgang (Gast)


Lesenswert?

moin schrieb:
> Klasse durch die vielen Antworten lese ich mich heut Abend durch.

Wenn du dem ganze Gekrampfe mit PWM aus dem Weg gehen willst, hängst du 
an deinen µC einen DDS-Generator mit AD9833 für keine 3€ aus der Bucht 
dran.
z.B. https://www.ebay.de/itm/382093041897

von Falk B. (falk)


Lesenswert?

Wolfgang schrieb:
> moin schrieb:
>> Klasse durch die vielen Antworten lese ich mich heut Abend durch.
>
> Wenn du dem ganze Gekrampfe mit PWM aus dem Weg gehen willst, hängst du
> an deinen µC einen DDS-Generator mit AD9833 für keine 3€ aus der Bucht
> dran.
> z.B. Ebay-Artikel Nr. 382093041897

Nö. Lies mal was der OP WIRKLICH machen will.

Beitrag "Re: Sinussignal erzeugen"

von Harald W. (wilhelms)


Lesenswert?

Falk B. schrieb:

> Nö. Lies mal was der OP WIRKLICH machen will.

Dann muss er eben vier "DDSe" nehmen.
(Wie ist die Mehrzahl von DDS?)

von Falk B. (falk)


Lesenswert?

Harald W. schrieb:

> Dann muss er eben vier "DDSe" nehmen.

Immer noch Nö. Er will Noten abspielen, das sind selten bis nie 
Sinussignale.

> (Wie ist die Mehrzahl von DDS?)

Gibt es nicht, denn DDS heißt Direct Digital Synthesis oder zufällig auf 
Deutsch mit den gleichen Anfangsbuchstaben Direkte Digitale Synthese.
Es gibt bestenfalls die Mehrzahl von DDS-IC, DDS-ICs.

von SeverusSnäip (Gast)


Angehängte Dateien:

Lesenswert?

So erzeuge ich mir einen Sinus für eine Audio-Anwendung: Ist ein absolut 
sauberer, verzerrungsfreier Sinus:

Alles float. Muss man halt für AVR nach int skalieren.
1
// Sinus erzeugen
2
fOscSin += fFrq * fOscCos;
3
fOscCos -= fFrq * fOscSin;
4
5
// Amplitude berechnen und Abweichung von Amplitude 1.0 ermitteln
6
fOscCorr = 1.0 +((1.0 - (fOscSin * fOscSin + fOscCos * fOscCos))*0.01);
7
8
// Amplitude langsam nachregeln:
9
fOscCos *= fOscCorr;
10
fOscSin *= fOscCorr;

Im Anhang der Code als JavaScript. Dort hört man aber nix :)

von roehrenvorheizer (Gast)


Lesenswert?

Baue das Mini DDS nach. Das ist wirlich nicht schwer:


Beitrag "[S] Poor man's miniDDS von Jesper"

MfG

von Schorsch X. (bastelschorsch)


Lesenswert?

Ein paar Port Pins mit Widerständen als DA Wandler tut´s vielleicht 
auch. Mit 4-6 Bit ist das schon ein recht brauchbarer Sinus, wenn 
insgesamt noch ein Tiefpass dahinter kommt.

von ... (Gast)


Lesenswert?

Nimm ein SAM2695 und hab richtig Spaß ;-)

von ... (Gast)


Lesenswert?

Was der TO vllt gerade noch hinkriegt, ist ein Wavetablemodul
fuer eine Soundkarte bestellen, und mit MIDI befuettern.

Da muss man sich keine Illusionen machen...

Aber schon beim NT fuer so ein Modul, die gerne -12 V und +12 V
brauchen, sehe ich ja dunkel bis schwarz.

Mit so einem Modul, wenn es vom richtigen Hersteller ist, kann
man richtig amtlich Musik machen.

von ... (Gast)


Lesenswert?

Ha, da hatte mein Namensvetter auch den Gedanken...

von Marc (Gast)


Lesenswert?

Hier wurde vermutlich alles schon 10x durchgespielt:
https://www.mikrocontroller.net/articles/AVR-Synthesizer

von Jella (Gast)


Lesenswert?

Ich nutze dafür eine Sinus-Tabelle, z.B. download Link:

http://www.afug-info.de/Download/

Für mich war die immer hilfreich

von Tom (Gast)


Lesenswert?


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.