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
>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 | 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.