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!
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.
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.
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.
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.
wcmartin
wcmartin