PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wav out mit PWM unter bascom?



sebastian.heyn
07.06.2005, 14:58
Hi,

hat schonmal jemand eine wav datei über pwm ausgegeben? (bascom benutzt) könnte man ja so anstatt ein schnödes fipsen auch einen angenehmen gong oder so ausgeben, oder?

PicNick
07.06.2005, 18:04
Hi, ein großes Problem ist wohl der benötigte Speicherplatz. aber es wär sicher eine nette Fingerübung, sich vom PC über die UART eine Wav-File schicken zu lassen und sie auf die PWM aufzumodulieren. Ein Lautsprecher als Getriebemotor hätte wohl genug Power.
Ein andere Variante wäre Klang-synthese

sebastian.heyn
08.06.2005, 08:12
mmhh, aber da müsstest du ja wieder daten interpretieren, und umrechnen. die rechenzeit habe ich nicht über. oder meinst du man sollte einen vs1003 mal testen, der kann mp3 und midi.

PicNick
08.06.2005, 08:25
WAV-Daten brauchst du nicht umzurechnen.
Irgendwelche Codec-Chips anzusteuern gibt nix her, und RNspeak gibt es schon

Interessant is ja nur Audio-->PWM

sebastian.heyn
08.06.2005, 11:50
Dazu müsste man wissen wie ein wav aufgebaut ist, grins

wie gibst du eine wav aus auf dem PWM ausgang? (dann kann man ja mal umgedreht probieren)

PicNick
08.06.2005, 12:06
WAv Files sind im Windows-RIFF Format, abgesehen von den Header Chunks ganz einfach eben die Samples hintereinander.
Ich würde die übliche Mediaplayer -Methode nehmen. Zwei Buffer, in einen schreibt man (neue)daten rein, der andere geht über PWM raus.
d.h PWM interrupt ganz normal, als compare-value aber den jeweils aktuellen Pegel, und wenn der Buffer leer ist, umswitchen auf den anderen, der (hoffentlich) inputseitig inzwischen schon frisch geladen ist.
Man muß halt vom Timing her schauen, was möglich ist. Wenn der PWM mit 5 kHZ werkt, könnt' man ca 2.5 kHZ ausgeben, für Sprache oder für den Anfang halt tät das schon reichen.
Bei 8-Bit samples müßten dann 40000 Bit/s über irgendeinen geeigneten Draht, bei RS232 wäre die Baudrate ~50000 Baud, knappe sache, aber da der AVR ja eigentlich sonst nix zu tun hat, könnt man es versuchen.
Schlimmstenfalls klingt es jämmerlich.
Man braucht noch ein PC-Programm, das das RIFF-Format auftröselt, auf 8-Bit mono und entsprechende sample-rate umfummelt und über rs232 ausgibt. kann man zu Fuß machen oder mit den div. Multimedia-functions.
Wie gesagt, eigentlich eine Fingerübung.

sebastian.heyn
08.06.2005, 12:35
mmhh wollte eigentlich ein im code oder eeprom gespeichertes file spielen... also was ganz ganz kurzes ist denke an die qualität wenn de mittelwelle sender hörst... was das andere angeht, ich denke das könnte man gut mit zwei prozessoren realisieren: einer liest die daten mit vorgegebenem takt ein (sampeln) und der andere macht "whatever" damit: speichern, an rs232 senden oder so...

PicNick
08.06.2005, 12:47
Wie auch schon gesagt, eine Platzfrage. Für eine sekunde brauchst du 5 kByte. Für Samples mit Loop-Markern kann man ev. noch etwas sparen.
Also kurze Töne gingen schon. Darüber hinaus würde man schon (externen) extra-Speicher brauchen.

Da könnt man dann am PC was brauchen, das aus Wav-Dateien gleich die DB od. DATA statements als include-datei herstellt.

sebastian.heyn
08.06.2005, 13:03
mal schauen ich kann nur turbo pascal. das ist glaub ich blöd mit win2k und xp. ansonsten wenn du mir vorgeben würdest wie es aussehen muss kann man ja mal was probieren..

PicNick
08.06.2005, 13:18
Also, wenn du es nicht grad diese Woche noch brauchst, das PC Zeugs könnt ich dir machen.
Sagen wir mal, fixe conversion auf 8-Bit mono, BasCom format,
z.B.
c:\wav2dat.exe "path1\wavefile.wav" "path2\xyz.dat" nnnnn
nnnn = samplerate, default 5000

sebastian.heyn
08.06.2005, 13:32
mmhh ja, grins. nur das ursprüngliche problem der ausgabe auf dem pwm ist mir immernoch einrätsel, warscheinlich müsste ich mir mal den aufbau einer wave datei anschauen...

PicNick
08.06.2005, 14:03
Halb so schlimm

http://www.genesis3d.com/~kdtop/misc/Tutorial%20WAV%20file%20format.htm

Nur sind inzwischen noch eine Menge Chunks dazugekommen

sebastian.heyn
09.06.2005, 08:32
OKAY, also angenommen du nimmst den data part. es sind werte von -x(00) bis +x (ff) enthalten, aber wie setzt du diese mit pwm um? vorallem die negativen? oder gibst du die negativen als positive aus oder lässt du sie einfach weg? das man je nach wert das impuls/pausenverhältniss der pwm ändert und somit die spannung an einem kondi ändert ist mir irgendwie schon bewusst.

PicNick
09.06.2005, 09:26
Mal angenommen, ich habe am PWM eine Getriebemotoransteuerung angeschlossen, z.B. RNBFRA, dann ginge das Vorzeichen auf den Direction-Pin und der Sample-Wert als ABS() auf den PWM-Wert.
Gibt es nur den PWM-Pin, muß man wohl ein Offset (mitte) auf den PWM-Wert addieren.

sebastian.heyn
09.06.2005, 09:36
das würde heissen, du lässt die 00 eine null sein, und ff den maximalwert und ziehst dir mit nem kondi in reihe den gleichspannungsanteil raus und hast somit eine wechselspannung am ausgang... muss heute mal mit winbin probieren was sich machen lässt....

PicNick
09.06.2005, 09:45
Nun, bei Null-Signal liegt am PWM duty 50 % gleichbleibend. Mit Kond als Differenzierglied gibt das Null.
Die Grund-Frequenz vom PWM muß man natürlich steil filtern, sonst klingen die Ohren, denn ein paar kHz überträgt ein NF-Verstärker ganz schön deutlich

Überigens, eine WAV-Datein mit 8-Bit ist eigentlich schon richtig formatiert, da das keinen signed-chars sind, sondern unsigned + Offset.
(was gut ist, denn BasCom kennt eh keine signed bytes)

sebastian.heyn
10.06.2005, 08:28
habe malvon einer wave-datei den header weggemacht, und nach bascom gewandelt (siehe anhang) die wave hat 8 bit bei 8khz abtastrate...
leider habe ich im moment keinen isp programmer um es zu probieren, den bekomme ich erst am montag wieder..

PicNick
10.06.2005, 08:55
Mal sehen, vielleicht komm ich dazu. Is ja mono, gelle ?

sebastian.heyn
10.06.2005, 09:02
Jep isses... (so jetzt muss ich noch was schreiben, um über 15 zeichen zu kommen...)