Forum: Mikrocontroller und Digitale Elektronik Frage zu R2R-Netzwerk


von Ralf (Gast)


Lesenswert?

Hi,

ich möchte ein R2R-Netzwerk basteln und hab die Schaltung aus dem 
hiesigen Artikel mit der Wikipedia-Version verglichen:

http://www.mikrocontroller.net/articles/DA-Wandler
http://de.wikipedia.org/wiki/R2R

In der Wiki-Version fehlt der letzte Widerstand. Welche Schaltung ist 
denn nun richtig?

Zweite Frage wäre, wie man vorgeht, wenn man beispielsweise eine 
Sinustabelle verwendet, und die Amplitude modifizieren will. Wenn man es 
so genau wie möglich haben will, kommt man um Floatberechnungen zu 
Lasten der Geschwindigkeit wahrscheinlich nicht drumrum, oder?
Welche weiteren Wege gäbe es noch?

Ralf

von Purzel H. (hacky)


Lesenswert?

>Zweite Frage wäre, wie man vorgeht, wenn man beispielsweise eine
Sinustabelle verwendet, und die Amplitude modifizieren will. Wenn man es
so genau wie möglich haben will, kommt man um Floatberechnungen zu
Lasten der Geschwindigkeit wahrscheinlich nicht drumrum, oder?
Welche weiteren Wege gäbe es noch?

Die Tabelle besteht aus Integern, die rechnet man ein mal aufm PC, mit 
float, dann nie wieder. Fuer verschieden Amplitudenskalierungen macht 
man die Tabelle etwas groesser und indiziert zusaetzlich.

von Ralf (Gast)


Lesenswert?

Moin,

> Die Tabelle besteht aus Integern, die rechnet man ein mal aufm PC, mit
> float, dann nie wieder.
Ja, klar, so hätte ich das auch gemacht.

> Fuer verschieden Amplitudenskalierungen macht man die Tabelle etwas
> groesser und indiziert zusaetzlich.
Nicht ganz klar. Hört sich an, als ob man die Tabelle nicht linear 
durchläuft, sondern mit Sprüngen konstanter Größe?

Ralf

von Purzel H. (hacky)


Lesenswert?

Nein, fuer die Amplitude = 1 gibt es eine Tabelle. Fuer Amplitude = 0.5 
oder =2 nimmt man dieselbe Tabelle und schiebt nach links oder rechts. 
Man braucht somit nur noch Tabellen fuer Zwischenwerte der amplitde, zB 
Amplitude = 3/4, 5/8, 7/8, .. wieviele auch immer. Und diese Tabellen 
spricht man ueber einen Index an. Wenn man zB fuer 4 Amplitden 4 
Tabellen hat, so braucht man zusaetzliche 2 bits, die man zB oberhalb 
der hoechstwertigen Bits platziert. Und dann muss man die Tabellen nur 
noch nacheinander anordnen.

von Helmut -. (dc3yc)


Lesenswert?

Zu deiner Widerstandsfrage: nimm die Wiki-Version, dann sparst du dir 
diesen einen Widerstand. Du musst sowieso einen Puffer hinterherhängen 
(OpAmp), da muss halt dann die übliche Beschaltung dran.

von Falk B. (falk)


Lesenswert?

@Ralf (Gast)

>In der Wiki-Version fehlt der letzte Widerstand. Welche Schaltung ist
>denn nun richtig?

Naja, man kann beide verwenden. AFAIK ist aber die Wikipediaversion 
nicht ganz korrekt, eben weil der letzte 2R Widerstand am Ausgang fehlt.

>Zweite Frage wäre, wie man vorgeht, wenn man beispielsweise eine
>Sinustabelle verwendet, und die Amplitude modifizieren will.

Man multipliziert mit Festkommaatrithmetik. Das ist einfach und 
schnell.

>so genau wie möglich haben will, kommt man um Floatberechnungen zu
>Lasten der Geschwindigkeit wahrscheinlich nicht drumrum, oder?

Oder ;-)

>Welche weiteren Wege gäbe es noch?

Wenn man die Amplitude ändert, berechnet man einmal die Tabelle per 
Festkommaarithmetik neu im RAM und giobt sie dann aus.

MFG
Falk

von Ralf (Gast)


Lesenswert?

> Naja, man kann beide verwenden. AFAIK ist aber die Wikipediaversion
> nicht ganz korrekt, eben weil der letzte 2R Widerstand am Ausgang fehlt.
Aber in der Version aus dem Forum ist das nur 1R, nicht 2R.

> Man multipliziert mit Festkommaatrithmetik. Das ist einfach und schnell.
Okay, oder alternativ wie oben vorgeschlagen mit div.Tabellen. Wobei FKA 
denke ich den Vorteil hat, wesentlich mehr Werte darstellen zu können.

> Wenn man die Amplitude ändert, berechnet man einmal die Tabelle per
> Festkommaarithmetik neu im RAM und giobt sie dann aus.
Muss gucken, was neben der eigentlichen Applikation übrig bleibt =)

Ralf

von Peter D. (peda)


Lesenswert?

Ralf schrieb:
> ich möchte ein R2R-Netzwerk basteln

Das scheint nur einfach, ist es aber nicht.

Schon für popelige 8 Bit müssen die Widerstände besser 1/256 = 0,4% 
sein, inklusive der Fehler durch den Innenwiderstand der Schalter.

Heutzutage nimmt man daher nur fertige Wandler, 8..16 Bit ist dann kein 
Problem.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wow wie Denn schrieb:
> Die Tabelle besteht aus Integern, die rechnet man ein mal aufm PC, mit
> float, dann nie wieder.

Wenn man C++ nimmt, kann man sie sogar direkt im Compiler rechnen
lassen. ;-)
1
#include <stdint.h>
2
#include <math.h>
3
4
#include <avr/io.h>
5
6
#define ENTRY(i) 255 * sin((double)i / 16 * M_PI)
7
8
const uint8_t array[16] = {
9
  ENTRY(0), ENTRY(1), ENTRY(2), ENTRY(3),
10
  ENTRY(4), ENTRY(5), ENTRY(6), ENTRY(7),
11
  ENTRY(8), ENTRY(9), ENTRY(10), ENTRY(11),
12
  ENTRY(12), ENTRY(13), ENTRY(14), ENTRY(15)
13
};
14
15
void update_pwm(int i)
16
{
17
  OCR0A = array[i];
18
}

Geht in C leider nicht, da dort das Ergebnis von sin() nicht als
Konstante akzeptiert wird, mit der man ein Array initialisieren
kann.

von Ralf (Gast)


Lesenswert?

PeDa schrieb:
> Schon für popelige 8 Bit müssen die Widerstände besser 1/256 = 0,4%
> sein, inklusive der Fehler durch den Innenwiderstand der Schalter.
> Heutzutage nimmt man daher nur fertige Wandler, 8..16 Bit ist dann kein
> Problem.
Hm... Ich seh schon, mein Wunsch eines SingleChip-Designs für die 
Ausgabe von Audiodaten löst sich langsam auf :)

Ralf

von Peter D. (peda)


Lesenswert?

Ralf schrieb:
> Hm... Ich seh schon, mein Wunsch eines SingleChip-Designs für die
> Ausgabe von Audiodaten löst sich langsam auf :)

Nimm doch nen AVR mit PWM.

Z.B. der ATtiny861 hat nen 10Bit-Timer, der mit 64MHz getaktet werden 
kann.
Das ergibt dann 62kHz PWM-Frequenz, also weit über der Hörgrenze.


Peter

von Ralf (Gast)


Lesenswert?

Hi Peter,

> Nimm doch nen AVR mit PWM.
Ich bin 8051-Anhänger :) Ich würd gern einen der SiLabs Controller 
verwenden, die sind wie die AVRs auch SingleCycle-Core, aber das weisst 
du ja :)

Vielleicht sollte ich mal schildern was ich machen will:
Ich möchte ein Audiosignal erzeugen, dessen Signalform (z.B.Sinus, 
Dreieck, Sägezahn, oder was völlig eigenes) und -amplitude variabel sein 
soll.

Hierzu habe ich mir diverse ICs besorgt, um einfach mal generell damit 
zu spielen, und zu schauen, bei welcher Lösung ich am besten fahre, 
sprich wo am wenigsten Performance bei akzeptabler Qualität flöten geht. 
Zu den ICs gehören AD9833 (WaveformGenerator), UDA1330 (StereoDAC) und 
TLV320AIC23 (ebenfalls StereoDAC).
Zusätzlich dachte ich, ich könnte das ganze auch noch diskret per 
R2R-Netzwerk machen.

Bei den DACs sowie dem R2R-Netzwerk kann ich Signalform und -amplitude 
selbst bestimmen, beim AD9833 fehlt mir noch die Lösung was die 
Amplitudenänderung angeht. Hier bin ich grad im Forum am Suchen, dein 
Vorschlag mit der PWM brachte mich auf die Idee, dass es vielleicht eine 
PWM-gesteuerte OP-Verstärkerschaltung o.ä. gibt.

So gesehen habe ich die von dir weiter oben vorgeschlagenen integrierten 
Wandler ja schon.

Ralf

von ulrich (Gast)


Lesenswert?

Für mehrere Tabellen reicht de Platz beim µC selten aus. Man kann die 
Rechnung aber mit Festkommazahlen machen, man braucht da noch kein 
Fließkomma. Die Tabelle könnte dazu ggf. 1-2 Bit mehr Auslösung als der 
DA Wandler gebrauchen.

Das Gehöhr ist für keine Stufen nicht besonders empfindlich, man braucht 
also keine wirklich feine Stufung.
Mit einem externen DA Wandler mit variabler Ref. Spannung hätte man es 
da aber einfacher, und man verliert bei kleinerer Amplitude nicht an 
Auflösung. Alternativ zuschaltbare Widerstände am Ausgang der R2R Kette.

Was man an Lastwiderstand bei der R2R Kette hat, ist für die Funktion 
egal, das ändert nur die Amplitude.

von Ralf (Gast)


Lesenswert?

> Mit einem externen DA Wandler mit variabler Ref. Spannung hätte man es
> da aber einfacher, ...
Zugegeben, aber vielleicht finde ich einen brauchbaren 
Feld-Wald-Und-Wiesen-VCA (Voltage-Controlled-Amplifier), sodass ich 
evtl. mit PWM zu potte komme :)

Die Sache mit den Tabellen werde ich aber auch ausprobieren.

Ansonsten: Hat noch jemand Ideen? =)

Ralf

von Peter D. (peda)


Lesenswert?

Ralf schrieb:
> Ich bin 8051-Anhänger :) Ich würd gern einen der SiLabs Controller
> verwenden,

Was gefällt Dir dann an deren internen 12Bit DACs nicht?


Peter

von avr (Gast)


Lesenswert?

Hallo Ralf,

das Signal mit Tabelle erzeugen ist dann DDS.

Was die Amplitute angeht ist das mit dem rechnen zwar möglich
verschenkt aber Auflösung. Wenn du externe DA-Wandlung machst
dann such dir Wandler (R2R geht) die mit Referenzspannungen
arbeiten. Es gibt z.B. welche die von -10 bis 10 Volt können.

Diese Referenzen kannst du mit einem weiteren DA erzeugen und
bestimmst damit deine Amplitute. Inerhalb dieser hast du dann
immernoch deine kpl. Signalauflösung.

avr

von Ralf (Gast)


Lesenswert?

PeDa schrieb:
> Was gefällt Dir dann an deren internen 12Bit DACs nicht?
Oh, die gefallen mir sehr gut, das Problem ist nur, dass ich genau solch 
einen SL-Controller hier grad nicht rumfahren hab :)

AVR schrieb:
> Wenn du externe DA-Wandlung machst dann such dir Wandler (R2R geht) die
> mit Referenzspannungen arbeiten. Es gibt z.B. welche die von -10 bis 10
> Volt können.

> Diese Referenzen kannst du mit einem weiteren DA erzeugen und bestimmst
> damit deine Amplitute. Inerhalb dieser hast du dann immernoch deine kpl.
> Signalauflösung.
Ja, das wäre auch noch ne Möglichkeit. Mal sehen, was der örtliche 
Händler grad so auf Lager hat.

Ralf

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.