PWM-Soundausgabe
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