Auswahl eines DAC für einen Audioverstärker

Ich versuche, einen bestimmten Audioverstärker, TPA3111D1 , zu verwenden, um einen 10-Watt-Lautsprecher über einen Mikrocontroller mit Strom zu versorgen. Ich möchte Ton von einem Mikrocontroller erzeugen, der keinen eingebauten DAC hat, also suche ich nach einem guten DAC, der mit diesem Verstärker funktionieren würde. Der Verstärker ermöglicht sowohl differenzielle als auch einzelne Audioquelleneingänge, und ich möchte, dass der DAC mit 0 bis 5 V TTL-Eingängen von 16 Pins des Mikrocontrollers arbeitet.

Ich denke, 16 Bit sollte die angemessene Größe des DAC sein, aber es gibt so viele zur Auswahl. Wenn jemand ein gutes Tutorial zur Verwendung eines DAC für die Audioerzeugung von einem Mikrocontroller hat, würde ich es gerne sehen. Kann jemand einen DAC vorschlagen oder meine Suche zumindest ein wenig eingrenzen? Danke!

Es ist ein ATmega2560, also dachte ich daran, nur parallel zu arbeiten, aber ich bin offen für andere Ideen, da ich den Code noch nicht geschrieben habe. Wäre ein anderes Ausgabeformat besser?
Wow, danke für die tollen Antworten. Sie waren alle sehr nützlich.

Antworten (3)

DACs haben je nach Anwendung unterschiedliche Anforderungen. Sie werden hochpräzise Lösungen finden, die teure Komponenten verwenden, um eine gute absolute Präzision zu erzielen, aber im Audiobereich brauchen Sie das nicht. Die Linearität ist der wichtigste Parameter.

Da Sie einen ATmega2560 verwenden , der in einem 100-poligen Gehäuse geliefert wird, können Sie wahrscheinlich 16 E / A sparen, und dann würde ich mich für parallele E / A entscheiden. Sie haben weniger Timing-Probleme als bei der Arbeit mit seriellen I/O wie I2S .

Bearbeiten
Will scheint I2S zu bevorzugen und er hat einen Punkt unter der Bedingung, dass Sie eine Verbindung zu anderen (semi-) professionellen Audiogeräten herstellen möchten . Soweit ich weiß, ist Ihr digitaler Audiopfad sehr lokal und auf die Verbindung zwischen Ihrem AVR und dem DAC beschränkt. Und dann würde ich bei der Parallele bleiben. Wählen Sie für eine Abtastrate von 44,1 kHz einen Quarz, der es Ihnen ermöglicht, alle 22,676 einen Interrupt zu erhalten μ S. Verwenden Sie den Interrupt, um das letzte Sample automatisch in den DAC einzuklinken, und Sie haben dann viel Zeit, um Ihr nächstes Sample vorzubereiten. Das ist das einzige Timing, auf das Sie angewiesen sind. Mit I2S hingegen haben Sie mehr zu tun. Sie können SPI verwenden, um die Daten herauszuschieben, aber mitten in einem Wort müssen Sie die Wortuhr umschalten. Dinge, um die Sie sich bei Parallel-I/O keine Sorgen machen müssen.

Der einfachste ADC ist eine R-2R-Widerstandsleiter . Die Linearität hängt von der Anpassung der Widerstände ab, und hier liegt das Problem für eine diskrete Lösung. Sie würden ziemlich teure Präzisionswiderstände benötigen. Der integrierte Ansatz ist viel besser. Der AD5547 verwendet auch ein R-2R-Leiternetzwerk (siehe Abb. 17 auf Seite 12), also warum ist dies besser als diskrete? Integrierte Widerstände (und Kondensatoren) haben möglicherweise eine gewisse Toleranz in Bezug auf ihren Nennwert, aber ihre gegenseitige Übereinstimmung ist die beste, die Sie bekommen können. Also die 80k Ω Widerstände können 80,5 k betragen Ω , aber Sie sind sicher, dass sie all diesen Wert haben, und das ist wichtiger als der eigentliche Wert selbst.
Der AD5547 akzeptiert eine 5-V-Stromversorgung und ist 16-Bit-Paralleleingang.

Geben Sie hier die Bildbeschreibung ein

Das Anwendungsschema stammt aus dem Datenblatt , also schauen Sie dort nach, wenn dies nicht sehr lesbar ist.

Der DAC ist registriert, was bedeutet, dass Sie den Latch verwenden können, um mehrere DACs gleichzeitig zu aktualisieren, aber Sie können ihn auch asynchron und transparent machen, indem Sie /WR auf niedrig und LDAC auf hoch setzen (siehe Seite 13). Dann wird die Ausgabe kontinuierlich aktualisiert. Dies ist aber nur möglich, wenn alle Eingänge gleichzeitig aktualisiert werden! Mit einem 8-Bit-Mikrocontroller schreiben Sie wahrscheinlich auf 2 E / A-Ports, und dann benötigen Sie den Latch!
Wie die meisten DACs ist es ein Stromausgang, also müssen Sie es in Spannung umwandeln. In dieser Anwendung mit dem AD8628 verwenden sie einen RRIO (Rail-to-Rail I/O) Operationsverstärker, dessen Spezifikationen der erforderlichen Auflösung entsprechen, aber Sie können einen anderen Operationsverstärker verwenden, wenn Sie möchten.
Der ADR03 ist eine Präzisions-Spannungsreferenz, geringe Drift und dergleichen, was für eine Audioanwendung übertrieben ist. Stellen Sie einfach sicher, dass Ihre Spannungsreferenz frei von Welligkeit und Rauschen ist!

Bearbeiten
David kommentiert zu Recht, dass dies eine etwas ältere Technologie ist, aber ich fand es in Ordnung, da Sie sowieso einen Mikrocontroller (anstelle eines DSP) und einen nicht ganz perfekten Klasse-D-Verstärker verwenden. Ich habe dies für meine Antwort ausgewählt, auch weil es leicht zu verstehen ist.
David erwähnt auch Sigma-Delta-DACs, die zwar eine bessere Leistung haben, aber vom Arbeitsprinzip etwas komplexer sind und (fast?) ausnahmslos seriell gesteuert werden, wofür der AVR die Hardware nicht hat.

Nun, wenn Sie keine I2C-Schnittstelle auf dem uC haben, ist dies möglicherweise in Ordnung, wenn auch etwas schmerzhaft. Sie benötigen eine DC-Sperrkappe am Ausgang und einen Widerstand, um den Ausgang auf 0 V vorzuspannen. Abgesehen davon wird die Audioqualität aufgrund vieler Probleme schlecht sein (Schreibvorgänge in den DAC haben viel Jitter, der DAC ist nicht sehr linear usw.). Für uCs ohne I2C wäre es besser, ein kleines CPLD zu verwenden, um Ihnen eine I2C-Schnittstelle zu geben, und dann einen der vielen I2C-Audio-DACs zu verwenden.
@David - Kannst du den Jitter erklären? Wenn Sie den DAC auf einem Timer-Vergleichsausgang verriegeln, ist er meiner Meinung nach perfekt synchron.
@David - was meinst du auch damit, dass der DAC nicht linear sein wird?
Sie haben Recht, wenn Sie eine Art Timer verwenden. Sie müssen immer noch mit etwas Jitter fertig werden (vielleicht 1 oder 2 ns Zyklus-zu-Zyklus-Jitter auf dem Abtasttakt), für den moderne Delta-Sigma-Wandler viel weniger anfällig sind.
R-2R-basierte DACs haben Linearitätsprobleme, die eine Verzerrung des Audios verursachen. Wie Sie sagten, ist dies ein Problem der Widerstandsanpassung - aber integrierte Lösungen sind immer noch problematisch. Dieses Linearitätsproblem, plus Clock-Jitter, war maßgeblich dafür verantwortlich, dass Digital Audio in den frühen 80er Jahren einen schlechten Ruf bekam, weil es beschissen klang. Delta-Sigma DACs haben die Dinge stark verbessert, weil sie von Natur aus linear sind und eine verbesserte Jitter-"Unterdrückung" haben. Die von Ihnen vorgeschlagene Lösung wird ähnlich wie digitales Audio der 80er Jahre klingen - was völlig in Ordnung sein kann! Aber es ist nicht vergleichbar mit dem, was der TPA3111 kann.
@David - Die Frage bezieht sich auf 16-Bit-Parallel von einem Mikrocontroller, nicht von einem DSP, also denke ich nicht, dass dies High-End sein soll. Ich habe keine Erfahrung mit integriertem R-2R, daher weiß ich nicht, wie schlecht die Anpassung ist. Ich dachte, es wäre in Ordnung für 16-Bit, aber ich würde keinen 24-Bit-DAC auf diese Weise bauen! Denken Sie, dass die Anpassung schlecht genug sein könnte, um ein nicht monotones Verhalten zu verursachen? Das wäre natürlich noch schlimmer.
Sie würden wahrscheinlich "12- oder 14-Bit-äquivalente Leistung" von einem 16-Bit-R-2R-DAC erhalten. Ein 24-Bit-Delta-Sigma-DAC würde Ihnen eine 16- bis 20-Bit-Leistung in Stereo für 2 US-Dollar + Schnittstellenlogik (falls vorhanden) bieten. Ich würde hoffen, dass der von Ihnen erwähnte DAC zumindest vollständig monoton ist.
@David - Warum gibst du keine Antwort um ein Sigma-Delta? OP wird interessiert sein.
@David Kessner, @stevenvh: Ich dachte, die Anpassung von integrierten Rs wäre gut genug, um eine 16-Bit-Leistung zu erzielen, und auf jeden Fall monoton! Diese Anpassung ist der Grund, warum beispielsweise >100 dB/Oktave geschaltete Kondensatorfilter möglich sind.

Ich vermute, dies ist ein Hobbyprojekt, und wenn ja, ist die andere Antwort wahrscheinlich in Ordnung. Wenn dies jedoch ein echtes Produkt ist, sollten Sie nach einem Mikro mit einer I2S-Schnittstelle suchen und dann einen geeigneten Audio-DAC (möglicherweise als „Codec“ bezeichnet) verwenden, der dafür ausgelegt ist, damit zu laufen.

So ziemlich alle D-zu-A-Audiodaten werden mit I2S-Teilen durchgeführt - hier ist eine ganze Seite davon, ohne besondere Sorgfalt oder Billigung von mir ausgewählt, aber es gibt Ihnen eine Vorstellung von typischen Integrationsebenen.

Und hier ist eine App-Notiz (zufälligerweise von Atmel) über das Hinzufügen von I2S-Peripheriegeräten zu einem Nicht-I2S-Mikro. Dass jemand denkt, dass es so viel Mühe wert ist, zu I2S zu gelangen, gibt Ihnen eine Vorstellung von der Bedeutung der Schnittstelle in dieser Nische.

I2S ist extrem einfach - es ist nicht so, als würde man sich mit USB oder PCI auseinandersetzen, aber für eine realistische Leistung benötigen Sie ein Mikro mit integrierter Hardwareunterstützung.

Eine Appnote von Atmel für I2S mag auf den ersten Blick ermutigend aussehen, aber dies ist ein ARM9-Controller und kein AVR! Das ist leistungstechnisch eine ganz andere Klasse.
Steven - Das war überhaupt nicht mein Punkt - das heißt, wenn Sie Audio-DA machen wollen, ist der Druck, I2S zu verwenden, stark genug, dass die Leute alle möglichen Komplexitäten zusammenschustern werden, nur um eine I2S-Schnittstelle zu erstellen. dh wenn Sie es ohne I2S tun, tun Sie es auf die harte Tour. Aber für ein Einzelstück macht das nichts, Musik kriegt man trotzdem raus.
Ich wollte nur auf den Unterschied hinweisen, damit @wcmartin nicht denkt "Hey, cool, eine I2S-Appnote für meinen Controller". Da dies sehr lokal ist (nur uC-zu-DAC-Kommunikation), würde ich dem Druck widerstehen und parallel gehen, wie ich in meiner Antwort erklärt habe.
"So ziemlich alles Audio D-to-A wird mit I2S-Teilen gemacht" - stimmt nicht. So ziemlich alle kleinen Arbeiten sind. Der Großteil erfolgt über das AC97-Protokoll.
@Matt - Wird AC97 nicht hauptsächlich in PCs und Mobiltelefonen und so weiter verwendet und I2S eher für reine Audiogeräte? Ich habe AC97 noch nie auf einem Stereo-Set gesehen (und sogar I2S nur auf High-End).
Entschuldigung, mit "so ziemlich alle" meinte ich Hi-Fi / Consumer-Audio, nicht PCs. Ich dachte über das Innere von MP3-Playern, CD-Playern usw. nach, da ich davon ausgegangen war, dass dies die Art von Gadget war, die das OP herstellte.
Ja, AC97 ist hauptsächlich PC, könnte aber auch für andere Geräte verwendet werden. Wenn Sie darüber nachdenken, wie viele Computer es auf der Welt gibt, können Sie sehen, wo das Verhältnis von AC97 zu I²S sehr stark zugunsten von AC97 sein kann. Die meisten MP3-Player verwenden einen Chip mit eingebettetem DAC. TOSLINK ist in Audiogeräten weiter verbreitet als I²S.
Häh? TOSLINK ist eine optische Verbindung zwischen Boxen. I2S ist (überwiegend) eine Verbindung zwischen Chips. (Aber natürlich, wie I2C, bringen die Leute es manchmal nach draußen, obwohl das ein Eckfall ist)
Übrigens haben einige der Microchip dsPICs I2S eingebaut.
@Matt AC97 wird fast nie außerhalb der PC-Welt verwendet. Im Jahr 2004 wurde AC97 durch Intels „HD Audio“-Schnittstelle ersetzt, die ihre eigenen Probleme hat. Ich habe noch keinen HDAudio/AC97-Codec mit anständiger Audioleistung gesehen - bestenfalls spricht man von Leistung auf iPod-Niveau. Es gibt noch etwas Wichtiges zu beachten: I2S-ähnliche Schnittstellen sind VIEL EINFACHER zu verbinden als AC97/HD Audio. TOSLINK ist im Wesentlichen S/PDIF über Glasfaser und wird absolut nie innerhalb einer Box verwendet. Die Leute verwenden nicht einmal S/PDIF (über Kupfer) für Chip-zu-Chip-Verbindungen, wenn sie nicht müssen.

OK. Auf Drängen von @stevenvh würde ich es so machen ...

Das von Ihnen gewählte uC verfügt nicht über eine I2C-ähnliche Schnittstelle, die normalerweise mehr oder weniger direkt mit einem Audio-DAC verbunden wäre. Die ideale Lösung wäre, ein anderes uC zu wählen, das I2C direkt unterstützt, aber diesen Luxus haben wir natürlich nicht immer. Wir könnten einige der E / A-Ports auf dem uC verwenden, aber das würde viele Pins / Signale erfordern. Eine Sache, die verwendet werden könnte, ist das SPI-Master-Peripheriegerät. Also, hier ist, was ich vorschlage.

Verwenden Sie ein billiges CPLD, um den SPI-Port des uC mit dem I2C-Port eines typischen Audiokonverters zu verbinden.

Beginnen Sie mit einem Oszillator mit geeigneter Frequenz, vielleicht 24,576 MHz für eine Abtastrate von 48 kHz. Im CPLD haben Sie einen Zähler, der von dieser Uhr abläuft. Die Ausgabe des Zählers wird verwendet, um alle Ihre Audiotakte zu generieren: MCLK, BITCLK und LRCLK. Es wird auch verwendet, um ein oder zwei Steuersignale zu erzeugen.

Ein weiterer Abschnitt des CPLD ist ein RX-Schieberegister. Der RX SR kann 16, 24 oder sogar 64 Bit lang sein. Es erhält seine Daten von der SPI-Schnittstelle auf dem uC und überträgt seine Daten in regelmäßigen Abständen an das TX-Schieberegister. Das TX-Schieberegister hat die gleiche Größe wie das RX-Schieberegister und taktet seine Daten mit der gleichen Rate wie BITCLK an den DAC aus.

Die ideale Größe der SR's ist wirklich ein Balanceakt. Sie gleichen die Größe des CPLD gegen den Software-Overhead gegen die Anzahl der Bits in Ihrem Audio ab. Nehmen wir für den Moment 1 Kanal mit 16-Bit-Audio an.

Für dieses Beispiel sind die SRs 16 Bit lang. Zu Beginn des Samples generiert das CPLD einen IRQ an die CPU. Die CPU antwortet, indem sie das nächste 16-Bit-Sample über die SPI-Schnittstelle an den RX SR sendet. Am Ende des Samples oder zu Beginn des nächsten werden die RX SR-Daten in den TX SR geladen, wo sie zum DAC hinausgeschoben werden. Es könnten also zu jedem Zeitpunkt zwei Übertragungen gleichzeitig stattfinden: SPI zu RX SR und TX SR zu DAC.

Der TX SR ist so eingerichtet, dass beim Herausschieben von Daten Nullen hineingeschoben werden. Sie senden tatsächlich 64 Datenbits an den DAC, aber es ist in Ordnung, wenn die "unbenutzten" Bits alle Null sind.

Wenn Sie 24-Bit-Audio anstelle von 16 Bit senden möchten, verlängern Sie einfach Ihre Schieberegister auf 24 Bit. Aber wenn Sie zu Stereo-Audio wechseln möchten, werden die Dinge etwas kniffliger. Ich weiß, dass sich das OP nur um Mono-Audio kümmert, aber ich werde es der Vollständigkeit halber hier aufnehmen.

Sie haben die Wahl: Sie können die SR's auf 16 oder 24 Bit belassen, aber die IRQ's doppelt so schnell laufen lassen (und die TX SR doppelt so schnell laden). Oder Sie können die SRs auf fast 64 Bit verlängern. Die erste Option hält das CPLD klein, verdoppelt aber die Anzahl der auszuführenden IRQs. Die zweite Option ist umgekehrt.

Für einen einfachen Einzelkanal mit 16-Bit-Audio benötigen Sie ein CPLD mit etwa 48 Flip-Flops: 9-Bit-Zähler, zwei 16-Bit-SRs, drei Ausgangstakte, einen IRQ und ein paar Extras. Dies würde in ein Xilinx Coolrunner-II 64-Makrozellenteil passen, das in mittleren Stückzahlen um die 1,50 US-Dollar kostet. Altera hat einige Max V-Teile, die Flip-Flop-reicher sind und billiger sein könnten.

Was einen richtigen DAC betrifft, stehen Dutzende zur Auswahl. Cirrus Logic, Texas Instruments (Burr Brown) und AKM sind die drei besten, aus denen ich auswählen würde. Alle haben einen preiswerten Stereo-DAC, der gut funktioniert. Je einfacher desto besser. Ich mag die Cirrus Logic CS4334/35/38/39 . Digikey hat das Teil für 3 US-Dollar. Aber die anderen Jungs haben sehr ähnliche Teile für einen ähnlichen Preis.

"I2C-ähnliche Schnittstelle, die normalerweise mehr oder weniger direkt mit einem Audio-DAC verbunden ist" Meinen Sie I2S? „Trotz des Namens hat es nichts mit dem bidirektionalen I²C-Bus zu tun.“