Frage zu R2R-Netzwerk

Gast #1804308
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
#1804313
>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.
Gast #1804379
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
#1804392
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.
#1804411
@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
Gast #1804421
> 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
#1804426
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
Moderator Persönliche Seite #1804517
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.
Gast #1804552
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
#1804664
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
Gast #1805059
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
Gast #1805066
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.
Gast #1805108
> 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
Gast #1805256
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
Gast #1805359
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.