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-Wandlerhttp://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
>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.
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
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.
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.
@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
> 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
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
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
constuint8_tarray[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
voidupdate_pwm(inti)
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.
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
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
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
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.
> 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
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
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
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