www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu R2R-Netzwerk


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Helmut -dc3yc (dc3yc)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)
#include <stdint.h>
#include <math.h>

#include <avr/io.h>

#define ENTRY(i) 255 * sin((double)i / 16 * M_PI)

const uint8_t array[16] = {
  ENTRY(0), ENTRY(1), ENTRY(2), ENTRY(3),
  ENTRY(4), ENTRY(5), ENTRY(6), ENTRY(7),
  ENTRY(8), ENTRY(9), ENTRY(10), ENTRY(11),
  ENTRY(12), ENTRY(13), ENTRY(14), ENTRY(15)
};

void update_pwm(int i)
{
  OCR0A = array[i];
}

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: avr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.