AVR Soundmodul

Das AVR Soundmodul ist ein universal einsetzbares Projekt, es ermöglicht ein kurzes Soundfile mittels eines AVR Mikrocontrollers ohne Zusatzspeicher zu realisieren.

Um zu verstehen, wie man am besten einen Sound abspielen kann, sollte man sich als erstes einmal ansehen wie so ein WAV File aufgebaut ist. Eine WAV Datei eignet sich besonders gut zur Verwendung in einem Mikrokontroller, da die digitalen Samples hier unkomprimiert gespeichert werden. Ein solches WAV File wird im Grunde durch 3 Faktoren festgelegt: Die Anzahl der Spuren, die Sampling Rate und die Bittiefe. Bei einer WAV Datei werden also lediglich in zeitdiskreten Abständen gemessene Werte gespeichert. Diese stellen jeweils die am Lautsprecher bzw. Mikrofon anliegende Spannung dar. 

 

Um Spannungen zu erzeugen haben die AVR Mikrocontroller eine so genannte Fast PWM Funktion in ihren Timern integriert. Die Pulsweitenmodulation generiert Impulse unterschiedlicher Breiten welche über einen Tiefpass zu einer Spannung gewandelt werden kann. Nun sollte man versuchen die Frequenz des PWM Timers möglichst hoch zu wählen um auch hohe Töne gut abbilden zu können:

In meiner Software verwende ich ein Sound mit einer Sampling Rate von 16kHz. Ein typischer Prozessortakt für einen Mikrocontroller ist 16 MHz. Der Timer0 zählt immer von 0 bis 255. Es sind also 256 Takte pro Schleife. Daraus ergibt sich, dass jeder PWM Wert 4 Mal ausgegeben wird.

16MHz Prozessortakt / (256 Zählwerte * 4 Wiederholungen) = 15,625 kHz Sampling Rate

So kann durch eine minimale Abweichung in der Sampling Rate relativ einfach die PWM speißen. 

 

Als Außenbeschaltung verwende ich entweder einen Tiefpass mit einer möglichst niedrigen Grenzfrequenz (< Sampling Rate) für einen Line Out oder den auf meinem Entwicklungsboard [Pollin Electronic] befindlichen Summer.

Um den Sound in den Mikrokontroller zu bekommen wird er als Array einzelner Bytes in das PROGREG (den Programmspeicher) geschrieben. Hierzu muss er in den Quellcode geschrieben werden. Dieses erfolgt mittels einem selbst verfassten WinForms Programm dass eine WAV 16kHz 8bit einliest und als fertiges *.c File ausgibt. Bei der WAV Datei müssen lediglich die Abspielinformationen (lesbarer Text) an Anfang und Ende vorher mit dem Editor entfernt werden.

DOWNLOADS

Beispielcode für einen ATmega32 mit 16Mhz

WAVtoC (Soundconverter)