PWM-Soundausgabe 

Elektronik-Labor   Projekte   AVR   Bascom



Manchmal möchte man per Mikrocontroller einen besonderen Sound ausgeben. Wenn es um einen einfachen Gong geht, kann man spezielle Hardware wie den integrierten Gong SAE800 einsetzen, der über einen Impuls vom Mikrocontroller getriggert wird. Manchmal reichen aber schon die Ressourcen des Mikrocontrollers selbst. Man kann z.B. ein Soundfile einfach über den PWM-Ausgang abspielen.



Die Hardware ist extrem einfach und braucht nur einen Lautsprecher mit Vorwiderstand. Man kommt sogar ohne ein Tiefpassfilter auf, weil die PWM-Frequenz mit 21,6 kHz recht hoch liegt. Für mehr Lautstärke sollte man allerdings ein Filter und einen kleinen Audioverstärker wie dem LM386 nehmen.



Der einfache Audiorecorder im Windows-Zubehör kann verwendet werden um einen kurzen Sound aufzunehmen oder einen vorhandenen Sound zu konvertieren. Das Format soll PCM 11,025 kHz, 8 Bit, Mono sein. Für die dann folgende Konvertierung sollte die Datei sound.wav heißen. Im Beispiel habe ich übrigens zur Vermeidung urheberrechtlicher Probleme mit meiner höchsteigenen Stimme ein Ding-Dong erzeugt (darf jeder frei verwenden).



Für die Verwendung in einem Bascom-Programm sollten die Sound-Daten als Data-Zeilen vorliegen. Ein kleines VB-Programm liest das Soundfile ein und setzt es in Zahlenwerte um, die in Data-Zeilen zu je 16 Werte umgeformt werden.

Private Sub Command1_Click()
Open "sound.wav" For Binary As #1
Open "sound.txt" For Output As #2
Print #2, "Data ";
n = 0
While (Not EOF(1))
a$ = Input(1, #1)
If a$ <> "" Then
d = Asc(a$)
n = n + 1
If n < 16 Then
Print #2, Str(d); ",";
Else
Print #2, Str(d)
n = 0
Print #2, "Data ";
End If
End If
Wend
Close 1
Print #2, " "
Close 2
End Sub




Nach der Konvertierung erhält man einen Text mit den gewünschten Datenzeilen. Am Anfang und am Ende kann man ein paar Zeilen wegwerfen. Die ersten Bytes sind ein Vorspann der Wav-Datei. Richtig los geht es erst mit der ersten 128, was dem Mittelwert  bzw. Stille entspricht. Eventuell ist da noch zu viel Stille, sodass man noch ein paar mehr Zeilen löschen  kann. Dasselbe gilt auch für das Ende der Datei. Insgesamt kann man nämlich nur rund 2,8 Sekunden mit 11,025 kHz abspielen, denn dann sind die 32 KB im Flash des ATmega32 voll.

Data  82, 73, 70, 70, 26, 74, 0, 0, 87, 65, 86, 69, 102, 109, 116, 32
Data 18, 0, 0, 0, 1, 0, 1, 0, 17, 43, 0, 0, 17, 43, 0, 0
Data 1, 0, 8, 0, 0, 0, 102, 97, 99, 116, 4, 0, 0, 0, 232, 73
Data 0, 0, 100, 97, 116, 97, 232, 73, 0, 0, 128, 128, 128, 128, 128, 128
Data 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
Data 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128
Nach der passenden Auswahl der mittleren Datenzeilen muss man erst mal wissen, wieviele Bytes es nun geworden sind. Zählen ist mühsam. Aber man kann die Daten  z.B. in Word kopieren und dass die Funktion "Wörter zählen" aufrufen. Im vorliegenden Fall sind es 851 Zeilen, das macht genau 13616 Bytes. Das eigentliche Programm ist dann ganz einfach.

Download wav, txt, VB-Programm und Bascom-Programm: Wav2pwm.zip

'--------------------------------------
' PWM-Soundausgabe
' ATMEGA32, 11,0592 MHz
'--------------------------------------

$regfile = "m32def.dat"
$baud = 19200
$crystal = 11059200
$hwstack = 128
$swstack = 128
$framesize = 256

Dim Count As Word
Dim D As Byte


Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
Pwm1a = 127

Do
Restore Sounddata 'Adresse der Sound-Daten
For Count = 1 To 13616 '13616 Samples
Read D
Pwm1a = D
Waitus 85 'ca. 11 kb/s
Next Count
Waitms 500
Loop

End

Sounddata: '"Ding Dong"

Data 128, 128, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142
Data 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142
Data 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 141, 142, 142, 141, 141, 142
Data 115, 118, 113, 125, 123, 123, 113, 131, 129, 138, 144, 148, 154, 151, 160, 156
Data 172, 176, 178, 178, 178, 181, 178, 175, 163, 166, 159, 154, 151, 144, 134, 126
Data 130, 120, 127, 117, 117, 115, 119, 114, 115, 116, 126, 136, 127, 126, 137, 122
Data 125, 133, 129, 115, 140, 114, 120, 122, 112, 111, 122, 107, 98, 119, 107, 144
Data 151, 119, 121, 134, 150, 178, 207, 182, 168, 167, 183, 202, 219, 202, 167, 153
Data 162, 169, 160, 149, 126, 119, 110, 116, 117, 106, 94, 98, 107, 118, 126, 121
Data 128, 130, 137, 155, 157, 153, 151, 150, 146, 171, 154, 151, 134, 128, 131, 133
Data 134, 113, 112, 96, 102, 115, 119, 105, 102, 108, 101, 116, 120, 113, 107, 124
Data 123, 132, 131, 126, 133, 139, 160, 170, 167, 161, 158, 164, 185, 197, 191, 185
Data 171, 167, 176, 179, 169, 161, 139, 125, 132, 136, 124, 113, 105, 103, 119, 130
Data 132, 123, 120, 130, 151, 161, 165, 159, 155, 163, 171, 172, 169, 155, 140, 143
Data 139, 135, 123, 108, 104, 103, 99, 100, 93, 83, 82, 83, 92, 97, 94, 81
Data 79, 87, 94, 99, 98, 89, 119, 142, 149, 155, 141, 137, 167, 202, 229, 239
Data 193, 187, 210, 221, 233, 229, 175, 147, 149, 143, 151, 135, 97, 77, 81, 87
Data 105, 81, 66, 78, 96, 123, 145, 139, 132, 145, 166, 195, 200, 184, 177, 179
...
...



Elektronik-Labor   Projekte   AVR   Bascom