Gängige Verfahren zur Digital-Analog-Wandlung

Seite 3: R2R-Netzwerk

Inhaltsverzeichnis

Findige Köpfe haben sich das Ohmsche Gesetz und die Mathematik zunutze gemacht und einzelne Spannungsteiler so miteinander vernetzt, dass sich prinzipiell DA-Wandler mit beliebig vielen digitalen Eingängen konstruieren lassen, an deren Ausgang ein analoges Signal herauskommt.

Solche Wandler heißen R2R-Netzwerke und benötigen pro Eingang nur zwei Widerstände, wobei der Wert des einen Widerstands immer exakt doppelt so groß ist, wie der des anderen, also beispielsweise R = 10 KOhm und 2R = 20 KOhm. Aufgrund der markanten Form des R2R-Netzwerks in Schaltplänen wird es auch als R2R-Leiter bezeichnet.

Auf dem Bild wurde ein 8-Bit-R2R-Netzwerk an den PortD eines Arduino Nano angeordnet. Achtung: Beim Arduino Nano ist Pin0 der TX-Pin und Pin 1 der RX-Pin. Aus diesem Grund kreuzen sich die beiden Widerstände auf dem Bild. Die grüne Leitung (rechts unten) ist der analoge Ausgang.

Die Eingänge des R2R-Netzwerks repräsentieren die Bits einer Binärzahl und bei N Eingangsbits berechnet sich die Ausgangsspannung A für die Binärzahl x nach der Formel A = 5 V * x / 2 N. Bei acht Eingangsbits gilt also A = 5 V * x / 256. Für x = 0 ergeben sich 0 V und x = 255 führt zu 4,98 V, was im Toleranzbereich liegt.

Wird PD7 am Arduino auf HIGH gesetzt, also auf 5 V geschaltet, so liegen am Ausgang des R2R-Netzwerks 2,5 V an, und so weiter.

Wird PD6 auf HIGH geschaltet, so liegen 1,25 V an. Werden PD7 und PD6 auf HIGH geschaltet liegt die Summe der beiden Spannungen also 3,75 V an.

Für einen DA-Wandler mit 8 Bit Auflösung werden insgesamt 16 Widerstände benötigt. Aus diesem Grund wird ein R2R-Netzwerk oft auch als Widerstandsgrab bezeichnet.

Werden die Widerstände an einen Port des Mikrocontrollers angeordnet, so genügt ein einziger Befehl an diesen Port, um alle 8 Pins gleichzeitig zu schalten und damit die Spannung zu generieren.

Um nun eine Spannung zu generieren, genügt im Arduino-Sketch der Befehl PORTD = Wert; (z. B. PORTD = 125). Die Spannung ergibt sich dann aus der Formel Spannung = 5 V * Wert/255. Vorher müssen im Setup-Bereich alle Pins am PortD als Ausgang definiert werden: DDRD = B11111111;. DDR steht für Data Direction Register und bezeichnet ein Konfigurationsregister des im Arduino verwendeten Mikrocontrollers. Im Sketch ist sie zugleich eine bereits in den internen Bibliotheken reservierte Konstante.

R2R-Netzwerk.ino

 1 void setup() 
 2 {
 3  // Alle Pins am PortD als Ausgang definieren
 4  DDRD = B11111111;    
 5 }
 6 
 7 void loop() {
 8  for (int i = 0 ; i < 256 ; i++ )
 9  { 
10   PORTD = i;
11  }
12 }

Bei der Auswahl der Widerstände ist es besonders bei den höherwertigen Bits sehr wichtig, auf eine möglichst kleine Toleranz zu achten. Brauchbare Ergebnisse erreicht man mit Metallfilmwiderständen ab einer Toleranz von 1 % oder weniger.

Zwei DA-Kanäle mit je 12 Bit Auflösung an einem Arduino Mega. Es waren dafür immerhin 48 Widerstände nötig.

Auf diese Weise lassen sich DA-Konverter mit nahezu jeder beliebigen Auflösung herstellen. In der Regel setzt aber die Toleranz der Widerstände und das zunehmende Quantisierungsrauschen der Auflösung ein Ende. Aber probieren Sie es selbst aus!