Forum: Mikrocontroller und Digitale Elektronik I2S+ USB an einem PIC32 - Clock


von WehOhWeh (Gast)


Lesenswert?

Hi,

Ich habe eine Frage an die I2S-Spezialisten hier:

Ich überlege gerate einen Software MP3-Player mit PIC32 bauen. Der soll 
auf SD-Karten (FATFS) gespeicherte MP3-Files abspielen und sich über 
USB-mass-storage laden und befüllen lassen.

Als DAC hätte ich mir den I2S-DAC UDA1334ATS ausgekuckt. Mein PIC kann 
ja I2S. Dieser DAC kann aus dem Wordclock seinen eigenen Clock 
generieren.

Problem:
MP3s sind gerne mit z.B. 44100kHz Samplerate codiert.
Das beißt sich mit USB, denn für Audio bräuchte ich z.B. 11,289MHz, für 
USB 12MHz. Beides muss jetzt aber akkurrat sein. Zwei Systemtakte sind 
leider nicht möglich.

Fragen:
Ab welcher Abweichung bei der Samplerate leidet die Audioqualität?
Gibt es möglicherweise eine elegantere Lösung für das Problem?

Auch Links auf Appnotes wären schon eine Hilfe :-)

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Nimm 48kHz für die Samplerate. Takte den Controller mit 48Mhz. Daraus 
kannst Du 12Mhz und 48kHz teilen.

von WehOhWeh (Gast)


Lesenswert?

Knut B. schrieb:
> Nimm 48kHz für die Samplerate. Takte den Controller mit 48Mhz. Daraus
> kannst Du 12Mhz und 48kHz teilen.

Das wäre eine Möglichkeit.

Allerdings hätte ich das gerne vermieden.
Ich habe eine riesige Menge MP3s mit 44,1kHz. Das kommt eben so von der 
CD. Vermutlich würde das "umsamplen" dem armen PIC überfordern. Ich 
wüsste ja nicht einmal wie ich das genau anstellen soll.

Daher müsste ich das umcodieren am PC erledigen. Das wäre unelegant :-(

Ich habe inzwischen entdeckt, dass man der SPI des PIC32 den REFCLOCK 
füttern kann. Und da habe ich viel mehr Möglichkeiten, den Clock zu 
manipulieren als nur mit dem Baudratengenerator.

Mal schauen, wo ich da mit 12MHz hinkomme. Ich werde mir da wohl erst 
mal ein Excel-File zur Taktberechnung machen müssen.

Bei 40MHz wäre das Teilen durch 907. Mal schauen, ob das geht. Das wäre 
ein Fehler von nur 0,003% :-)

von Frank K. (fchk)


Lesenswert?

Du kannst doch den Bittakt extern einspeisen, d.h. den PIC als SPI Slave 
arbeiten lassen. Ob er gleichzeitig SPI Slave und Frame Master sein 
kann, weiß ich nicht, das wäre zu prüfen. Ansonsten müsstest Du auch den 
Word Clock selber erzeugen, was wofür im Prinzip ein 1:32 oder 1:64 
Teiler ausreichen würde. Sowohl SPI Slave als auch Frame Slave geht auf 
jeden Fall.

Bei 16 Bit Sampletiefe bräuchtest Du einen 1.536MHz und einen 1.4112 MHz 
Oszillator. Letzterer ist kein Standardwert. Problemlos erhältlich sind 
Oszillatoren mit 256*fs, also 11.2896 MHz und 12.288 MHz. Viele Codecs 
brauchen einen Master Clock mit eben dieser Frequenz. Den kannst Du dann 
ja problemlos herunterteilen.

Wenn Du das so machst, ist es exakt. So exakt, wie Quarzoszillatoren 
eben halt sind.

fchk

von WehOhWeh (Gast)


Angehängte Dateien:

Lesenswert?

Ok, ich habe eine Lösung gefunden, mit der ich hinkommen werde.
Man kann den Refclock für die SPI nehmen.

Microchip stellt da ein sehr praktisches Excelsheet zur Verfüging:
http://microchip.wikidot.com/32bit:osc-overview

Und den kann man sehr genau einstellen. Ein Beispiel hab ich mal 
angehängt.
Das wären 1,4112MHZ (=44100kHz * 32MHz) aus 12MHz mit hoher Genauigkeit. 
Das ist auf alle Fälle genau genug, weil immer besser als 0,1%.

Schön ist, dass man das zur Laufzeit beliebig ändern kann - damit sind 
alle Audiobaudraten erschlagen.

Falls ich nichts übersehen habe. Zeit, das mal aufzubauen und zu testen.

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.