Forum: Analoge Elektronik und Schaltungstechnik Audio DA-Wandler mit R2R-Netz und OP


von Ulf R. (roolf)


Lesenswert?

Es geht um die Audioausgabe mit einem Mikrocontroller, billig und 
einfach.

Ein (8 Bit) R2R-Netzwerk an einem Ausgangsport eines uC liefert mir eine 
wenig belastbare Spannung (ungefähr) im Bereich 0..5V. Die möchte ich 
nun impedanzwandeln und am Ausgang als Audio-Linelevel-Signal zur 
Verfügung stellen.(Statt dem R2R-Netz könnte ich auch z.B. einen AD7524 
nehmen, das nachfolgende Problem bleibt das gleiche.)

Mir kommt ein OP in den Sinn, als Spannungsfolger beschaltet, d.h. obige 
Spannung kommt auf den (+)-Eingang, und der Ausgang wird mit dem 
(-)-Eingang kurzgeschlossen.

Nachdem die Stromversorgung aber nur 5V und 0V hergibt, wäre der OP in 
der Sättigung und hätte Verzerrungen. Für ein Audio-Line-Signal brauche 
ich aber (soweit ich das verstehe) ohnehin nur eine Wechselspannung von 
ca. 1V.

Kann ich obige Ausgangsspannung des R2R-Netzes (0..5V) ganz einfach mit 
je einem weiteren R nach Vcc und Gnd verbinden und so auf (ca.) 2..3V 
umformen, damit der OP nicht in die Sättigung kommt? Am Ausgang des OP 
dann einzig ein Kondensator in Reihe, damit kein DC durch den 
nachgeschalteten Verstärker fließt? Das R2R-Netz braucht (zur Schonung 
der Lautsprecher) wohl auch noch einen Tiefpass, kommt der vor oder nach 
dem OP?

Schonmal vielen Dank für Hinweise.

Edit: bei http://www.avr-asm-tutorial.net/avr_de/avr_dac.html wird so 
etwas ähnliches gemacht; dort wird aber die Sättigung dadurch umgangen, 
dass der Digitalwert von [0..255] auf [0..127] beschnitten wird, also 
auf ein Bit der Dynamik verzichtet wird.  Das kann nicht der 
elegantestmögliche Ansatz sein?

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


Lesenswert?

Schon an einen Spannungsteiler gedacht, mit dem der (+)Eingang auf Vcc/2 
vorgespannt wird? Dann wird mittels Serienwiderstand und ungepoltem 
Koppel-Kondensator das R/2R-Signal eingekoppelt. Die Größe des 
Serienwiderstands relativ zum Spannungsteiler bestimmt die Begrenzung 
des Signals, um innerhalb der OV-verträglichen Spannungen zu bleiben.

von ... .. (docean) Benutzerseite


Lesenswert?

op als addierer verwenden und 2,5V fest dazuaddieren..

von Peter R. (pnu)


Lesenswert?

Schon mal gehört, dass man an einem OP-Amp die Verstärkung in der 
invertierenden Schaltung auf 1/2 einstellen kann ?

Also +-Eingang an 2,5 V legen, den -Eingang  über 100k ansteuern und als 
Rückkopplungswiderstand 50k nehmen.

von Ulf R. (roolf)


Lesenswert?

Travel Rec. schrieb:
> Schon an einen Spannungsteiler gedacht, mit dem der (+)Eingang auf Vcc/2
> vorgespannt wird? Dann wird mittels Serienwiderstand und ungepoltem
> Koppel-Kondensator das R/2R-Signal eingekoppelt. Die Größe des
> Serienwiderstands relativ zum Spannungsteiler bestimmt die Begrenzung
> des Signals, um innerhalb der OV-verträglichen Spannungen zu bleiben.

Danke. Mir fehlt fürs Analoge ein bisschen die Erfahrung. Wie ermittle 
ich einen sinnvollen Wert für diesen Koppelkondensator? Es geht wie 
gesagt um Audiosignale.

Mein erster Vorschlag ist im Prinzip auch dieser Spannungsteiler, aber 
direkt ohne Koppelkondensator. Was wäre daran falsch?

von X- R. (x-rocka)


Lesenswert?

Also...

1) besser den nicht-invertierenden Spannungsfolger nutzen, da sonst das 
R2R Netzwerk belastet wird. Hängt aber von den verwendeten

2) wie wär's mit nem 5V single-supply rail-to-rail-input OP?

3) Grundlagen mit OPVs lernen! ;)

von Ulf R. (roolf)


Lesenswert?

Peter R. schrieb:
> Schon mal gehört, dass man an einem OP-Amp die Verstärkung in der
> invertierenden Schaltung auf 1/2 einstellen kann ?
>
> Also +-Eingang an 2,5 V legen, den -Eingang  über 100k ansteuern und als
> Rückkopplungswiderstand 50k nehmen.

Ah, das klingt nach einer sehr einfachen Lösung. Wenn ich es recht 
verstehe, kann man auf diese Weise jedes Intervall [a,b] von 
Eingangsspannungen auf jedes gewünschte Intervall [c,d] von 
Ausgangsspannungen bringen:

Plus-Eingang auf Potential (c+d)/2 legen, Minus-Eingang über R ansteuern 
und Rückkopplung von Ausgang auf Minus-Eingang über (d-c)/(b-a) * R. 
Nebenbedingung ist, dass [c..d] innerhalb der Spezifikationen des Opamp 
liegt.

von Ulf R. (roolf)


Lesenswert?

Lc E. schrieb:

> 2) wie wär's mit nem 5V single-supply rail-to-rail-input OP?

Das habe ich mich auch schon gefragt. Meine Recherchen (die sicher 
unvollständig sind) haben bisher ergeben, dass ein rail-to-rail OV in 
der Praxis nicht existiert oder aber gleich deutlich teurer ist. Weitere 
Überlegung war: am Ende brauche ich für das Line-Level-Audiosignal gar 
kein 0..5V, sondern etwas Kleieneres; somit erschien es mir widersinnig, 
einen aufwendigen OV zu verwenden und erst danach die Spannung zu 
teilen. (Kommentare zu diesen Überlegungen immer willkommen.)

> 3) Grundlagen mit OPVs lernen! ;)

Mit eurer Hilfe ...

von Matthias B. (matthias882)


Lesenswert?

Line-Level sind 1V Spitze-Spitze. Lass das ganze R2R Zeug weg, Gib das 
ganze per PWM raus, Tiefpass, Spannungsteiler und Koppel-Kondensator 
dahinter und fertig. Sollte belastbar genug sein und reicht für Audio 
allemal.

von Ulf R. (roolf)


Lesenswert?

Matthias Becher schrieb:
> Line-Level sind 1V Spitze-Spitze. Lass das ganze R2R Zeug weg, Gib das
> ganze per PWM raus, Tiefpass, Spannungsteiler und Koppel-Kondensator
> dahinter und fertig. Sollte belastbar genug sein und reicht für Audio
> allemal.

Pulsweitenmodulation macht ja nochmal ein ganz neues Fass auf. Wie ist 
denn die Audioqualität dabei? Mein Ziel ist die Synthese von musikalisch 
halbwegs brauchbaren Tönen mit Obertönen.

Meine Überlegung: Wenn ich da 44kHz "Samplingfrequenz" hätte, bin ich 
mit 8bit auf dem PWM-Ausgabe-Pin schon bei 44k * 256 = 11.2MHz 
Auflösung, also 1 Takt bei einem Mikrocontroller.  Realistisch 
erreichbar wären vermutlich nicht mehr als 4bit@44kHz, 5bit@22kHz, 
6bit@11kHz usw. Dazu vermute ich (ist das richtig?), dass die 
Samplingfrequenz selbst auch noch irgendwie störend hörbar ist und mit 
einem Tiefpass gefiltert werden muss. Da bleibt dann nicht mehr viel 
übrig von den hohen Frequenzen?

von Matthias B. (matthias882)


Lesenswert?

Du brauchst erstmal 2 Timer im Controller, der idealerweise mit 16 MHz 
laufen sollte.
Einen 8Bit Timer für die PWM. Der läuft mit den vollen 16 MHz -> /256 = 
eine 62 kHz PWM -> Sollte sich gut mit nem Tiefpass filtern lassen.

Der 2. Timer muß nun deine PWM zur richtigen Zeit mit neuen Werten 
versorgen. Dieser bestimmt die Sampling-Rate. Ob dieser nun mit 44kHz, 
22kHz oder sogar noch weniger läuft ist für deinen Tiefpass egal.

Der Mensch der 20kHz noch hört ist schon nichtmehr ganz normal, also 
sollte es kein Problem sein die 62kHz mit nem einfachen RC Filter 
rauzubekommen.

von Matthias B. (matthias882)


Lesenswert?

PS: Der 2. Timer muß natürlich nicht mit 44  22  11 kHz laufen, sonder 
mit dieser Frequenz Interrupts auslösen.
Wichtig ist außerdem, das deine PWM nicht langsamer ist als dein 
Sampling, da es sonst zu aliasing kommt.

von Marci W. (Gast)


Lesenswert?

Hallo Ulf,

Ulf Rolf schrieb:
[...]
> Meine Überlegung: Wenn ich da 44kHz "Samplingfrequenz" hätte, bin ich

44kHz wäre CD-Qualität

> mit 8bit auf dem PWM-Ausgabe-Pin schon bei 44k * 256 = 11.2MHz

allerdings nie und nimmer mit 8Bit ;-) Sag doch mal was Du vorhast. Du 
willst doch dieses "Geräusch" nicht auf eine Stereoanlage geben, oder?

> Auflösung, also 1 Takt bei einem Mikrocontroller.  Realistisch
> erreichbar wären vermutlich nicht mehr als 4bit@44kHz, 5bit@22kHz,
> 6bit@11kHz usw. Dazu vermute ich (ist das richtig?), dass die
> Samplingfrequenz selbst auch noch irgendwie störend hörbar ist und mit
> einem Tiefpass gefiltert werden muss. Da bleibt dann nicht mehr viel
> übrig von den hohen Frequenzen?

Die Samplingfrequenz passt einfach nicht zu den acht Bit! Und weitere 
Frage, woher kommen die Digitaldaten, die Du ausgeben willst?

Der nachgeschaltete Tiefpass muss idealerweise bei fsampling / 2 bereits 
komplett sperren. In Deinem Fall würde ich mal die max. Audiofrequenz 
auf 5kHz festlegen. Samplingfrequenz dann z.B. 20KHz und den Tiefpass 
bei knapp über 5KHz dimensionieren. Je höher die Ordnung des 
nachgeschalteten TP ist, desto näher können Samplingfrequenz und 
Audiofrequenz liegen. Die Samplingfrequenz muss aber immer größer als 
die doppelte Audiofrequenz sein. Aber ein paar wenige Artefakte durch 
nicht optimalen TP dürften bei 8Bit kaum zu hören sein ;-)

ciao

Marcus

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ulf Rolf schrieb:
> Matthias Becher schrieb:
>> Line-Level sind 1V Spitze-Spitze. Lass das ganze R2R Zeug weg, Gib das
>> ganze per PWM raus, Tiefpass, Spannungsteiler und Koppel-Kondensator
>> dahinter und fertig. Sollte belastbar genug sein und reicht für Audio
>> allemal.
>
> Pulsweitenmodulation macht ja nochmal ein ganz neues Fass auf. Wie ist
> denn die Audioqualität dabei? Mein Ziel ist die Synthese von musikalisch
> halbwegs brauchbaren Tönen mit Obertönen.

PWM ansich ist entgegen den oftmals gehörten Behauptungen voll 
Hifi-tauglich. Das Problem ist hierbei nämlich die Frequenzauflösung! 
Ein quasi-kontinuierlicher Takt im MHz-Bereich reicht völlig aus.
Nun haben aber alle gängigen Prozessoren einen zeitdiskreten 
equidistanten Takt.


>
> Meine Überlegung: Wenn ich da 44kHz "Samplingfrequenz" hätte, bin ich
> mit 8bit auf dem PWM-Ausgabe-Pin schon bei 44k * 256 = 11.2MHz
> Auflösung, also 1 Takt bei einem Mikrocontroller.  Realistisch
> erreichbar wären vermutlich nicht mehr als 4bit@44kHz, 5bit@22kHz,
> 6bit@11kHz usw. Dazu vermute ich (ist das richtig?), dass die
> Samplingfrequenz selbst auch noch irgendwie störend hörbar ist und mit
> einem Tiefpass gefiltert werden muss. Da bleibt dann nicht mehr viel
> übrig von den hohen Frequenzen?

Die Anforderungen für die Filterung sind nicht zu unterschätzen. Mal als 
Anhaltspunkt: Meine integrierte Soundkarte im PC liefert bei der 
maximalen Ausgabefrequenz 24kHz ein vierphasiges 96KHz Signal in der 
Art: 0, +1, 0, -1
Wie du siehst, ist da nicht mehr viel analog drin. Klingt aber meiner 
Meinung für MP3-Niveau völlig ausreichend.


Warum nicht was fertiges nehmen? AKM oder Cirrus, TI irgendwas.

von Ulf R. (roolf)


Lesenswert?

Marcus Woletz schrieb:
>> Meine Überlegung: Wenn ich da 44kHz "Samplingfrequenz" hätte, bin ich
>
> 44kHz wäre CD-Qualität

wenn auch noch 16 Bit Auflösung dabei wären.

>> mit 8bit auf dem PWM-Ausgabe-Pin schon bei 44k * 256 = 11.2MHz
>
> allerdings nie und nimmer mit 8Bit ;-) Sag doch mal was Du vorhast. Du
> willst doch dieses "Geräusch" nicht auf eine Stereoanlage geben, oder?

Mich würde einfach mal interessieren, wie weit man mit einem solchen 
Mikrocontroller soundmäßig kommen kann, ohne gleich einen DSP zu 
verwenden. (Die Vermutung ist dabei, dass eine höhere Samplingfrequenz 
wichtiger wäre als eine hohe Bitauflösung.)

> Die Samplingfrequenz passt einfach nicht zu den acht Bit!

Gibt es einen notwendigen Zusammenhang zwischen Samplingfrequenz und 
Auflösung?

> Und weitere
> Frage, woher kommen die Digitaldaten, die Du ausgeben willst?

Z.B. eine Wellenform aus Grundsinus und Oberschwingungen vorab im RAM 
berechnet, dann je nach gewünschter Frequenz mit Festkommaarithmetik aus 
der Tabelle ausgelesen und ausgegeben. Bei 40kHz Sampling und mit einer 
Tabelle von 1k Größe müsste man Töne bis herunter zu 40 Hz "sauber" 
ausgeben können?

> Der nachgeschaltete Tiefpass muss idealerweise bei fsampling / 2 bereits
> komplett sperren. In Deinem Fall würde ich mal die max. Audiofrequenz
> auf 5kHz festlegen. Samplingfrequenz dann z.B. 20KHz und den Tiefpass
> bei knapp über 5KHz dimensionieren. Je höher die Ordnung des
> nachgeschalteten TP ist, desto näher können Samplingfrequenz und
> Audiofrequenz liegen. Die Samplingfrequenz muss aber immer größer als
> die doppelte Audiofrequenz sein. Aber ein paar wenige Artefakte durch
> nicht optimalen TP dürften bei 8Bit kaum zu hören sein ;-)

Die angegebenen Richtwerte sind auf jeden Fall schon mal hilfreich.

von Ulf R. (roolf)


Lesenswert?

Abdul K. schrieb:

> PWM ansich ist entgegen den oftmals gehörten Behauptungen voll
> Hifi-tauglich. Das Problem ist hierbei nämlich die Frequenzauflösung!
> Ein quasi-kontinuierlicher Takt im MHz-Bereich reicht völlig aus.
> Nun haben aber alle gängigen Prozessoren einen zeitdiskreten
> equidistanten Takt.

Ich verstehe nicht ganz, was mit "quasi-kontinuierlicher" Takt gemeint 
ist.

Geht es darum, dass man die An/Aus-Zeiten für jedes gewünschte 
Tastverhältnis immer so kurz wie möglich machen sollte? Das würde 
natürlich die schöne Timer-Idee (Timer läuft mit fester Frequenz, je 
nach gewünschtem Tastverhältnis wird der Anfang jedes Timerintervalls 
mehr oder weniger lang auf 1 ausgegeben) unmöglich machen und einen 
Mikrocontroller mit ~10 MHz Takt überfordern.

> Warum nicht was fertiges nehmen? AKM oder Cirrus, TI irgendwas.

Ich möchte durchs Basteln etwas lernen. Zum Musikhören steht schon ein 
CD-Spieler im Regal ...

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ein quasi-kontinuierlicher Takt wäre z.B. ein RC-Oszillator mit einem 
74HC14-Inverter realisiert, bei dem R variabel ist.

von Ulf R. (roolf)


Lesenswert?

Ulf Rolf schrieb:

> Pulsweitenmodulation macht ja nochmal ein ganz neues Fass auf. Wie ist
> denn die Audioqualität dabei? Mein Ziel ist die Synthese von musikalisch
> halbwegs brauchbaren Tönen mit Obertönen.
>
> Meine Überlegung: Wenn ich da 44kHz "Samplingfrequenz" hätte, bin ich
> mit 8bit auf dem PWM-Ausgabe-Pin schon bei 44k * 256 = 11.2MHz
> Auflösung, also 1 Takt bei einem Mikrocontroller.  Realistisch
> erreichbar wären vermutlich nicht mehr als 4bit@44kHz, 5bit@22kHz,
> 6bit@11kHz usw.

Das ist Unfug, weil ich davon ausgegangen war, dass die PWM zu Fuß 
gemacht werden muss.

Ich lese gerade im Datenblatt, dass (z.B.) der ATMEGA8 ja schon PWM (bis 
10 Bit Auflösung) hardwaremäßig mit seinen Countern unterstützt. Der 
Programmier-Rechen-Aufwand beschränkt sich damit allein auf das Update 
des Samplingwertes, was ja relativ langsam passieren muss (z.B. bei 
12MHz Takt: 8 Bit @ 47kHz oder 10 Bit @ 12kHz).

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


Lesenswert?

Man braucht übrigens nicht 2 Timer, wie oben behauptet. 1 Timer reicht, 
der macht das PWM in Hardware und beim Überlaufen löst er einen 
Interrupt aus, dessen ISR das OCRx-Register nachläd. Da das 
OCRx-Register doppelt gepuffert ist, wird der Wert beim nächsten 
Timer-Überlauf in die Hardware übernommen. Man hat also eine zur 
Samplerate vollsynchrone und 'jitterfreie' Ausgabe der Sounddaten. 
Trotzdem bleiben 8Bit nur 8Bit, und das hört man bei ruhigen Passagen 
immer.

von Matthias B. (matthias882)


Lesenswert?

Wenn man aber 44 oder 22 kHz Samplingrate in der richtigen 
Geschwindigkeit abspielen will, braucht man den 2. Oder man konvertiert 
halt die Sound-Datei auf diese krumme Samplingrate die mit einem 
verfügbaren Quartz machbar ist.

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


Lesenswert?

Matthias Becher schrieb:
> Wenn man aber 44 oder 22 kHz Samplingrate in der richtigen
> Geschwindigkeit abspielen will, braucht man den 2.

Das ist leider keine Lösung. Wenn der PWM-Timer mit 65kHz läuft, der 
LadeTimer mit 44kHz, gibt es fiese Aliasing Effekte, weil manchmal das 
Sample sofort mit dem laufenden Timer-Zyklus übernommen wird und 
manchmal einen Timerzyklus warten muß, da die Timer ja asynchron laufen. 
Es wir also manchmal dasselbe Sample 2x wiedergegeben und manchmal halt 
nicht. Das beste ist es, die Taktfrequenz des Controllers auf genau 256x 
oder (übertaktet und 2fach Oversampling) auf 512x Samplerate zu bringen 
und wirklich nur einen Timer zu verwenden.

von Ulf R. (roolf)


Lesenswert?

Travel Rec. schrieb:

> Das ist leider keine Lösung. Wenn der PWM-Timer mit 65kHz läuft, der
> LadeTimer mit 44kHz, gibt es fiese Aliasing Effekte, weil manchmal das
> Sample sofort mit dem laufenden Timer-Zyklus übernommen wird und
> manchmal einen Timerzyklus warten muß, da die Timer ja asynchron laufen.

Danke für den Hinweis. In meinem (bisher nur im Kopf existierenden) 
Projekt spielt das keine so große Rolle, weil ich nicht vorgefertigte 
Samples einer festen Samplerate wiedergeben will, sondern so etwas wie 
Soundsynthese auf dem AVR machen möchte. Die Samplerate muss daher nicht 
zwingend 44.1kHz oder ein anderer Standardwert sein, sondern kann mehr 
oder weniger frei festgelegt werden, wie es sich aus dem Systemtakt und 
dem Timer-Teiler gerade passend ergibt.

von Matthias B. (matthias882)


Lesenswert?

Na dann reicht natürlich 1 Timer

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.