Klangerzeugung
Für die Klangerzeugung mit Microcontrollern gibt es eine Reihe unterschiedlicher Ansätze und Umsetzungen. Die jeweils optimale Methode hängt von der Art des zu erzeugenden Geräusches, der zur Verfügung stehenden Hardware, dem akzeptierten Aufwand an Software und Rechenzeit, sowie dem gewünschten Ergebnis ab.
Im einfachsten Fall erzeugt ein externer Klangerzeuger (z.B. ein Piezo-Element an einer Messingmembran) durch simples Ein- und Ausschalten Warn- oder Piepsgeräusche, wie es z.B. bei alten PCs üblich war. Mit entsprechendem Aufwand ist aber auch mit einfachen uCs die Musik- und Sprachwiedergabe über Lautsprecher möglich.
Automatische Erzeugung von Tonfrequenzen
Es stehen eine Reihe von Chips zur Verfügung, die selbständig Klänge erzeugen können und u.U. nur eine minimale Ansteuerung oder einen Trigger benötigen:
Voltage controlled Oscillator (VCO)
- XR8038 oder neuer MAX038
- XR2206
Spezielle Klang-ICs
Für spezielle Klänge werden komplexe Klangerzeuger-ICs angeboten z.B.:
Der klassische Gong-IC SAB800 / SAE800 -> Conrad, Reichelt, Bausatz bei ELV
Des Weiteren:
- UM 3561 -> Conrad
- Module bei Conrad
Mit Voice-Recordern lassen sich kurze Audiosequenzen über ein Mikrofon aufnehmen und auf Befehl abspielen.
- ISD25xx z. B. ISD2560 -> Reichelt
- ISD17xx z. B. ISD1730 -> ?
- ISD14xx z. B. ISD1416 -> Conrad
- Beispiel aus Roboternetz.de
DTMF, Telefontönen
- MT 8880 -> Conrad
- MT 8870 -> Conrad
- CM 8870
DDS-Tongeneratoren
- AD 9850
Der Klassiker aus dem C64:
- MOS 6581/SID 6581 C64-Soundchip -> eBay
- SID-Emulator mit AVR
- [1] Beitrag hier im Forum, SID an AVR
Für OEM-Kunden gibt es u.a. von Yamaha einige Chips zum Verbau in elektronischen Klangerzeugern, welche mit DSPs angesteuert werden können. Vereinzelt sind OPL- und FM-Chips im Markt verfügbar.
Sowohl für den SAB-Chip, den SID aus dem C64 und auch OPL-Chips gibt es eine Reihe unterschiedlicher Implementierungen in FPGAs und PLDs.
Manuelle Erzeugung von Tonfrequenzen
Im allgemeinen Fall, wenn ganz bestimmte Wellenformen wiedergegeben werden sollen, müssen diese vor der Ausgabe hinterlegt, oder erzeugt werden. Dazu gibt es unterschiedliche Methoden:
RAM-WAVE-Player
Mit einem Microcontroller kann eine zuvor in einem RAM gespeicherte Wertefolge durch einfaches Durchzählen ausgegeben und mit einer externen Elektronik in ein analoges Signal verwandelt werden. Die interne Wertefolge entspricht dabei direkt der Amplitude. Dabei werden entweder komplette Samples über einen Datenbus an einen AD-Wandler gesendet, oder eine 1-Bit Tonerzeugung mit nur einem digitalen PIN verwendet, der einen DSD-Datenstrom erzeugt. In beiden Fällen werden externe Filter benötigt.
DDS-Sinus
Ein konkretes Beispiel für eine solche direkte digitale Klangerzeugung ist das DDS-Verfahren, bei dem ein Sinus ausgeben wird. Auf der Basis dieses Verfahrens funktionieren die o.g. fertigen DDS-Chips.
modulierter Sinus
Für mehr Musikalität kann man z.B. im Flash eine Sinustabelle ablegen und je nach gewünschter Frequenz schneller oder langsamer abtasten, wobei die Frequenz moduliert wird. Somit erhält man einen quasi analogen Momentanwert der Amplitude als Vorgabe zur Bildung z.B. einer eines PWM-Signal. Damit und zusätzlich einem Tiefpass hat man Sinustöne variabler Frequenzen, die sehr schön rund klingen können, sofern die Abtastung fein genug und die Bildung der PWM schnell genug erfolgt. Mit etwas Rechenaufwand kann man noch Lautstärke-Hüllkurven aufmodulieren (AM) und somit glockenähnliche Sounds erzeugen.
rückgekoppelter RAM-WAVE-Player
In ein RAM wird einmalig eine beliebige Wertefolge geladen und danach zyklisch abgespielt. Dabei wird einer oder mehrere Ausgänge über einen EQ auf den Eingang zurückgeführt und ständig neues Samples berechnet. Typischerweise erhält man dann ein ausklingendes Tonfrequenzspektrum mit besonders schnell abklingenden Oberwellen. Ein Beispiel für eine Rückführung ist der Karplus-Strong-Algorithmus. Ein Beispiel für eine Mehrwegrückführung findet sich hier: https://www.mikrocontroller.net/topic/475337#new
Im Einzelfall können die Werte auch wie bei der synthetischen Klangerzeugung generisch erzeugt werden:
Wellenformerzeugung
PDM-EXOR-Dreiecksgenerator
Durch die Interferenz zweier 1-Bit-Rechtecksignale mit geringfügig unterschiedlicher Frequenz und multiplikativer Mischung mit XOR entsteht eine PDM, die nach Glättung am Ausgang ein Dreieck erzeugt. Beispiel: https://www.mikrocontroller.net/topic/434877#5144809
Sinusoszillator
Mit Hilfe eines rückgekoppelten IIR-Filters, kann ein selbstschwingender Oszillator programmiert werden. Die einfachste Version ergibt sich z.b. durch den Konstrukt: Wert4 = 0,9* Wert3 + (Wert3-Wert2)*1,4 - (Wert2-Wert1)/2 - ausgehend von den Initialwerten -1, 0 und 1. Die Periode liegt etwa bei 1/10 der Aktualisierungsfrequenz und ist damit für sehr langsame MCUs geeignet. Durch Variation der Werte lassen sich auch gedämpfte Schwingungen erzeugen. Beispiel: https://www.mikrocontroller.net/topic/324429#3778743
Binäre Wellenerzeugung
Ein einfacher Rechteck-Tongenerator lässt sich erzeugen, indem ein Integer-Wert periodisch um einen Inkrementalwert erhöht- und die höchsten Bits zur Tonausgabe genutzt werden. Je höher der Inkrementalwert, desto höher die Tonfrequenz. Dabei nimmt man in digitalen Schaltungen wie PLDs z.B. einen 32 Bit-Wert und inkrementiert mit einer Frequenz von z.B. 100MHz. Statt wie bei der DDS eine Tabelle anzusteuern, wird einfach das MSB ausgegeben. Eine Verbesserung ergibt sich, wenn man z.B. die höchsten 13 Bits interpretiert und über Y x (4095-Y) eine Parabel bildet und skaliert, wobei das MSB die negative Halbwelle anzeigt. Dies ergibt eine positive und negative Parabel. Diese ist sehr sparsam zu erzeugen und musikalisch gehaltvoller, als ein Sinus, da sie viel der zweiten Oberwelle enthält.
Für einen 8-Bit Microcontroller ließe sich folgende Version verwenden: Akkumulator = (Akkumulator + Inkrement) Modulo 65536, Step = Ganzzahl(Akkumulator/256), Halbwelle = Step x (255 - Step), Inkrement = 128 - Ganzzahl (Halbwelle / 256).
Tonausgabe
Die analoge Ausgangsspannung für den Verstärker und später den Lautsprecher bzw ein elektronikfreies Piezoelement kann außerhalb des Mikrocontrollers auf verschiedene Weise erzeugt werden:
Digital-Analog-Wandler
Mit einem DAC kann eine hochgenaue Ausgabe realisiert werden.
R2R-Netzwerk
Mit einem R2R-Netzwerk kann ein einfacher Wandler realisiert werden. Siehe Widerstandsnetzwerk, R2R-Netzwerk Samplerate direkt in der Ausgabe
Nach dem R2R folgt in der Regel ein OPV. Mit einem Kondensator in der Signalleitung kann dabei ein eventuell vorhandener Gleichspannungsanteil (DC-Offset) reduziert werden.
PWM / PDM
Die Pulsweitenmodulation eignet sich zur Ausgabe von Tönen über einen digitalen Pin. Für einigermaßen hochwertiges Audio wird eine schnell laufende PWM benötigt, d.h. der Controller wird schnell getaktet - z.B. mit 256facher Samplerate. Wenn Piezo zum Einsatz kommt, dann sollte mit 50% Duty-Cycle gearbeitet werden. Die Toggle-Frequenz entspricht der halben Tonhöhe (zwei mal Umschalten pro Periode).
Für eine effektive und klanglich hochwertige Tonausgabe ist das Pulsdichtemodulations-Verfahren (PDM) vorzuziehen. Dabei kann mit sehr viel geringerer Taktrate gearbeitet werden. DSD für 48kHz Audio arbeitet z.B. mit 3MHz (Faktor 64).
Hardware
Piezo-Element
Piezo-Elemente sind einfach anzusteuern und als Buzzer/Summer von Reichelt, Conrad... erhältlich.
Es gibt hier zwei Typen:
- Mit integrierter Elektronik; braucht nur mit Gleichspannung versorgt zu werden.
- Ohne Elektronik; braucht eine Wechselspannung.
Die Piezo-Elemente haben eine Eigenresonanzfrequenz um 1,5 kHz ("Fiep"), und sind damit am lautesten. Fertige Module sind oft mit Resonanzkörper ausgestattet (Helmholtz-Resonator).
Piezo Elemente ohne integrierte Elektronik können direkt an die Pins eines AVR oder PIC angeschlossen werden. Um die Lautstärke zu erhöhen, kann man zwei Pins benutzen, die immer abwechselnd auf LOW bzw. HIGH gesetzt werden. Dadurch ergibt sich eine Wechselspannung um V_cc. (Prinzip der H-Brücke)
Bei selbsterregenden Elementen (die aus einer Gleichspannung ihre Frequenz selbst erzeugen) sollte man auf die Daten achten. Im Allgemeinen brauchen kleine Module aber auch nur einige mA.
Lautsprecher
Meistens liefert eine Direktbeschaltung der Ausgangsstufe an einem Mikrocontroller nicht genügend Leistung. Um Lautsprecher an einem µC betreiben zu können, bedarf es daher oft eines Verstärkers, da die Portpins des µC i.d.R. nur wenige mA Strom vertragen (Datenblatt!). Bereits eine einfache Treiberstufe kann aber Abhilfe schaffen:
Die 20Ω Widerstand/ 4,7 µF Kondensator Kombination als Tiefpass reduziert die hohen Frequenzen des PWM-Signals im Audiosignal. Noch besser ist eine zusätzliche Drossel im Ausgangszweig. Durch Verringern des Ausgangswiderstandes kann noch etwas mehr Leistung herausgeholt werden. Wichtig ist das Verständnis, dass bei dieser Schaltung das digitale Signal verstärkt wird, um es erst nach der Verstärkung zu filtern, was sich dazu eignet, Strom und damit Leistung zu sparen. Für geringe Leistungen ist es allerdings besser, die Filterung vor den Verstärker zu setzen und diesen im AB-Modus zu fahren, um zu einer besseren Qualität zu gelangen.
Klanggestaltung
Ein weit unterschätzter Punkt ist die Gestaltung des Klanges im Bezug auf seinen Informationsgehalt. Viele Töne in Geräten drücken nicht das aus, was sie eigentlich ausdrücken sollten. Warntöne z.B. sollten deutlich wahrnehmbar sein, Meldungen und Bestätigungen dagegen eher beruhigend und keinesfalls aggressiv. Statische und gleichbleibend laute Töne sind zu vermeiden. Wirksame Töne, die dennoch nicht erschrecken, erzeugt man z.B. mit einer ansteigenden Lautstärke. Gut wahrnehmbar sind Töne mit grosser Bandbreite, die also aus mehreren Einzeltönen auf unterschiedlichen Oktaven bestehen. Weiche Töne wiederum erzeugt man mit einem nicht zu komplexen Gong-Ton, mit limitierter Anstiegszeit von minimal 20ms und einer Ausklingzeit von wenigstens 1s.
Es ist auch wichtig zu verstehen, daß bei realen Klängen die Amplituden, Frequenz und Phase in einem natürlichen Zusammenhang stehen und sich gleichmäßig ändern müssen, um nicht langweilig und steril zu klingen. Diese Effekte sind nur bei richtig nachgebildten Oszillatoren korrekt und z.B. mit starrem Vibrato oder Tremolo nur unzureichend nachzubilden. Ein natürlicher Klang ist daher kein mathematischer Sinus sondern eine sich permanent ändernde Welle mit Offset, Phasenänderung und Amplitudenänderung, die sich aufgrund des durch äußere Einflüsse gestörten Oszillators einstellt.
Unnötige Töne bei elektrischen Geräten sind gänzlich zu vermeiden, weil sie zu einer Abstumpfung im Gehör führen und wichtige Töne dann nicht mehr wahrgenommen werden.
Artikel
- AVR-Synthesizer
- OneBitSound
- AVR-Synthesizer
- Digitale Sinusfunktion
- Pulsdichtemodulation
- Vervielfachung der Frequenz mittels Multiplikation
Weblinks
(TODO: Sichten und den verschiedenen Methoden zuordnen)
- Doorbell bei www.microsyl.com (en, AVR, C)
- Simple SD Audio Player with ATtiny85 (elm-chan.org)
- PIC18F SD WAV Audio Player ähnlich 1 zusätzlich mit Tiefpassfilter
- MIDI DDS(Englisch)
- http://www.elby-designs.com/contents/en-us/d5.html
- http://www.microsyl.com/index.php/category/anything-that-make-sound/
- http://elm-chan.org/works/sd20p/report.html (en, AVR, ASM)
- http://www.mikrocontroller.net/topic/25051 (en,AVR,ASM)
- AVR314: DTMF Generator
- AVR335: Digital Sound Recorder with AVR and DataFlash
- AVR336: ADPCM Decoder
- http://www.hanneslux.de/avr/divers/melody/index.html (de, ASM)
- http://www.jcwolfram.de/projekte/avr/avrmusicbox/main.php (de, ASM)
- Rage Against The AVR - WAV-Daten mit PWM über Atmega48 in Stereo ausgeben (en, BASCOM AVR, PC: Python)
- Make an Arduino talk to you auf hackaday.com
- Driving 5 speakers simultaneously with an Arduino by Jeremy Blum.
- discovercircuits.com, Umfangreiche Linksammlung
- C64 SID Emulation auf Atmega8 und Atmega168
- C64 SID mit I2C auf Sourceforge
- 1 Bit Sound Codierung mit AVR
- 1-bit audio example program for Atmega (Atmega32)