Forum: Mikrocontroller und Digitale Elektronik stm32f103 wav player?


von Markus (Gast)


Lesenswert?

Eigentlich sollte die MCU dafür geeignet sein, WAV files mittels PWM 
abzuspielen.

Am besten wäre die DMA direkt mit der PWM zu verknüpfen. Hier hat das 
scheinbar schon mal jemand gemacht:
https://www.youtube.com/watch?v=-L-ZGksh9n8

Von STM gibt es ein Paper, wie man die Auflösung der PWM erhöhen kann:
http://www.st.com/content/ccc/resource/technical/document/application_note/7e/17/df/9e/5d/04/4b/72/DM00119042.pdf/files/DM00119042.pdf/jcr:content/translations/en.DM00119042.pdf

Leider gibt es in beiden Fällen keine Sourcen. Hat jemand schon mal so 
etwas gemacht oder kennt ein Code-Beispiel?

von Markus (Gast)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Markus schrieb:

> Eigentlich sollte die MCU dafür geeignet sein, WAV files mittels PWM
> abzuspielen.

Woher zum Teufel willst du das wissen? Du hast doch ganz offensichtlich 
rein überhaupt keine Ahnung vom Format von WAV Files. Die bieten nämlich 
als Containerformat eine schier unerschöpfliche Vielzahl möglicher 
Inhaltsformate an, u.a. sind natürlich welche zumindest denkbar, die die 
Fähigkeiten deiner MCU weit überfliegen.

> Am besten wäre die DMA direkt mit der PWM zu verknüpfen.

Das kann klappen. Aber nur bei den allerprimitivsten WAV-Files. Nämlich 
PCM-WAV, welches unkomprimierte Daten enthalten. Das ist vermutlich auch 
das, was du EIGENTLICH meintest, aber wegen intellektueller 
Beschränkungen nicht korrekt zum Ausdruck bringen konntest.

Der Trick ist dann ganz simpel: mache zwei Buffer (deren nötige Größe 
man dem WAV-Header entnehmen kann) und fülle sie abwechselnd mit den 
Daten aus den WAV-Chunks. Gebe den gerade gefüllten Buffer aus, sobald 
der zuvor gefüllte fertig ausgegeben ist. Fülle wiederum den gerade 
ausgegebenen Buffer mit dem Inhalt des nächsten Chunks. Trivialste 
Urschleimscheisse...

Funktioniert so einfach aber eben nur, wenn das WAV-File eben nur 
PCM-WAV enthält und das Bitformat der Samples obendrein dem benötigten 
Ausgabeformat entspricht. Wenn nicht, wird es schon etwas komplizierter. 
Und wenn es kein PCM-WAV ist, dann ist's nix mehr mit primitivem 
DMA-Bytegeschubse. Dann musst du den Scheiss erstmal dekodieren bevor du 
ihn ausgeben kannst. Dann brauchst du einen passenden Decoder. Welchen? 
Kannst du wiederum dem WAV-Header entnehmen.

> Leider gibt es in beiden Fällen keine Sourcen. Hat jemand schon mal so
> etwas gemacht oder kennt ein Code-Beispiel?

Lern' programmieren. Das ist was anderes, als fremden, unverstandenen 
Code stumpf zusammenzunageln. Das Minimum, was für eine kompetente 
Benutzung des fremden Codes erforderlich ist, ist in diesem Fall eine 
zumindest grundlegende Kenntnis über das WAV-Fileformat, seinen 
Charakter als Containerformat und die sich daraus ergebenden 
Konsequenzen...

von dasrotemopped (Gast)


Angehängte Dateien:

Lesenswert?

oder man liest die AppNote von ST
en.CD00259245.pdf : AN3126 Audio and waveform generation using the DAC 
in
 STM32
und such dann einen passenden uC aus (siehe Bild).
In den Beispielprojekten gibt es dann Beispiele:
X:\..\STM32Cube\Repository\STM32Cube_FW_F1_V1.4.0\Projects\STM3210C_EVAL 
\Examples\DAC\DAC_SignalsGeneration

Durch die Kopplung von Timer als Trigger für DMA und DAC ohne große CPU 
Last zu implementieren.

Und wer ein STM32F4-Disco hat kann mit dem Beispielcode das Onboard 
Mikrofon und den Kopfhörerausgang als Audio Schnittstelle nutzen und ein 
USB-Stick ist der Datenspeicher. Funktioniert gut.

Gruß,

dasrotemopped.

von Nop (Gast)


Lesenswert?

Wieso eigentlich über PWM, wenn der Chip schon einen DAC hat, der 
ebenfalls mit DMA funktioniert? Gibt's da einen Vorteil für PWM?

von Toralf W. (willi)


Lesenswert?

das simple PCM-WAVE Bitgeschubse geht schon mit einem "Minikleinen" 
Tiny85 AVR -> siehe ElmChan da sind auch src zu finden, wenn man nicht 
selber denken möchte.

LG

von Lubnan (Gast)


Lesenswert?

Nop schrieb:
> Wieso eigentlich über PWM, wenn der Chip schon einen DAC hat, der
> ebenfalls mit DMA funktioniert? Gibt's da einen Vorteil für PWM?

Leider haben nicht alle STM32F103 eine DAC.

1
Digital-to-analog converter (DAC)
2
3
Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx
4
microcontrollers where the Flash memory density ranges between 16 and 32 Kbytes.
5
6
Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx
7
microcontrollers where the Flash memory density ranges between 64 and 128 Kbytes.
8
9
High-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 256 and 512 Kbytes.
10
11
XL-density devices are STM32F101xx and STM32F103xx microcontrollers where the Flash memory density ranges between 768 Kbytes and 1 Mbyte.
12
13
This section applies to connectivity line, high-density and XL-density STM32F101xx and STM32F103xx devices only.

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

>Wieso eigentlich über PWM, wenn der Chip schon einen DAC hat, der
>ebenfalls mit DMA funktioniert? Gibt's da einen Vorteil für PWM?

Es dieses Board, also ohne DAC. Deshalb PWM.
Mein Ziel sind Audioanwendungen wie WAV-Player und Synthesizer. Ich habe 
einiges dazu mit den AVRs entwickelt ( from scratch ).
Jetzt will ich einiges mit den kleinen STM machen ( Kosten, viele 
verteilte Klangerzeuger ), da diese wesentlich komplexere Synthesizer 
und Filter ermöglichen.
Die DMA im STM hat den Vorteil, dass keine Rechenlast durch die DAC 
Ausgabe entsteht. Beim AVR war das immer eine Interruptroutine welche 
die PWM nachladen musste, da geht Einiges beim ohnehin für 
Synthesizeranwendungen etwas knapp bemessenen AVR verloren.

von Markus (Gast)


Lesenswert?


von dasrotemopped (Gast)


Lesenswert?

>Mein Ziel sind Audioanwendungen wie WAV-Player und Synthesizer.
Macht bestimmt Spaß.
>Jetzt will ich einiges mit den kleinen STM machen ( Kosten, viele >verteilte 
Klangerzeuger ), da diese wesentlich komplexere Synthesizer
>und Filter ermöglichen.
Das ist richtig im Vergleich zu AVR.

Aber warum dann einen STM32F103 ohne DAC / I2S ?
Warum nicht das Nucleo-STM32F446RE mit Rechenpower, DAC, I2S ?
Oder das STM32F4-Discovery mit Audio Ausgang ?
Sportlicher Ergeiz mit wenig Hardware alles möglich zu machen ? Oder nur 
Geiz, das billigste Board zu finden ?

Gruß,

dasrotemopped.

von dasrotemopped (Gast)


Lesenswert?

vielleicht interessiert ja das Projekt auf einem STM32:
http://www.pouet.net/prod.php?which=61197
Audio und Video Out, Demo als Source verfügbar ...

Gruß,

dasrotemopped.

von Markus (Gast)


Lesenswert?

>vielleicht interessiert ja das Projekt auf einem STM32:
>http://www.pouet.net/prod.php?which=61197
>Audio und Video Out, Demo als Source verfügbar ...
Das ganze ist aber für einen STM32F4 gemacht ( welches Board? ).
Die haben wahrscheinlich allen einen DAC, da kann man sich die PWM dann 
sparen.

von Markus H. (dasrotemopped)


Angehängte Dateien:

Lesenswert?

>welches Board?
STM32F4-Disco
Der Audio Ausgang wird über I2C (Konfiguration) und I2S (Audio 
Datenstrom) implementiert, siehe Bild.

Neben "Jupiter&Beyond" gibt es noch "peridiummmm" auf der selben 
Hardware vom selben Progrmmierer.

Wenn man die Grafik weglässt bleibt viel Power für Audio Synthese übrig. 
Der F4 hat ja den DSP Befehlssatz, der dir bei der Synthesizer Anwendung 
sicher nützlich ist. Und über die USB Buchse ist auch genug Platz für 
WAV Dateien auf nem Memory Stick.
Die richtige Hardware für die Aufgabe, aber geschenkt wird einem da nix, 
da ist Arbeit zu Hauf zu erledigen.

Gruß,

dasrotemopped.

von Markus (Gast)


Lesenswert?

Ja, aber ich habe dieses Board:
http://www.mikrocontroller.net/attachment/preview/302883.jpg

Einen AudiDAC kann man überall dran basteln. Es geht hier darum, das 
Maximum aus dem Minimum heraus zu holen.

Hier kannst Du mal hören, was man aus einem LPC810 ganz ohne Hardware 
Peripherie nur mit Bit-Banging heraus holen kann:

https://www.indiegogo.com/projects/the-dsp-g1-analog-modeling-synthesizer#/

von Markus H. (dasrotemopped)


Lesenswert?

>Es geht hier darum, das Maximum aus dem Minimum heraus zu holen.
Dann ist der STM32F103 überdimensioniert:
http://www.linusakesson.net/scene/craft/
Geht auch mit nem Atmega88.

Ich bin nicht so leidensfähig. In Zeiten von Multicore CPU/GPU PCs ist 
embedded schon Beschränkung genug. Dann muss es nicht auch noch ein uC 
ohne die Hardwarefunktionen sein, die ich in meiner Anwendung benötige.

Gruß,

dasrotemopped.

von Markus (Gast)


Lesenswert?

Den Link kenne ich schon seit gefühlten 10 Jahren.
>Ich bin nicht so leidensfähig.
Wenn man so argumentiert, kann man gleich einer RasPi mit Soundkarte 
nehmen.
Irgendwo muss die Herausforderung ja bleiben.

von Markus H. (dasrotemopped)


Angehängte Dateien:

Lesenswert?

wav Player geht !

So, jetzt ist aber gut.

dasrotemopped.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.