Gängige Verfahren zur Digital-Analog-Wandlung

Mit bestimmten Techniken kann man digitale Signale in analoge Spannungen umwandeln. Wir geben Ihnen einen Überblick.

In Pocket speichern vorlesen Druckansicht
Symbolgrafik Digital-Analog-Wandler.
Lesezeit: 14 Min.
Von
  • Ulrich Schmerold
Inhaltsverzeichnis

In einigen unserer Make-Projekte wie der Uhr aus Messinstrumenten, der Musik mit dem Arduino oder der Laserharfe sind wir bereits auf einzelne Techniken zur Umwandlung digitaler Signale in analoge Spannungen eingegangen. Grund genug nun einmal in einem Übersichtsartikel alle gängigen Verfahren zur Digital-Analog-Wandlung zusammenzufassen.

Viele moderne Mikrocontroller haben bereits Wandler integriert, um analoge Signale in digitale Werte umzusetzen. Auch der Arduino hat einen solchen Wandler eingebaut.

Mehr Arduino-Projekte:

Sind analoge Signale jedoch erst einmal digitalisiert, so lassen sie sich nicht ohne Weiteres wieder zurück in analoge Spannungsverläufe umwandeln. Dafür benötigt man Digital-Analog-Wandler/Umsetzer (DAW/DAU; engl. Digital Analog Converter, DAC).

Beim Arduino liest der Befehl analogRead(Port) ein analoges Signal zwischen 0 und einer Referenzspannung (meist den internen 5 V) von einem Analogport ein und wandelt es in einen digitalen Wert zwischen 0 und 1024 um (10 Bit). Prinzipiell könnte man nun annehmen, dass der Befehl analogWrite(Port, Wert) diesen Wert anschließend wieder als analoge Spannung über einen Pin ausgeben kann. Leider hat der Arduino (respektive der im Kern verwendete ATmega328) jedoch keine echte DA-Wandler-Funktion. Vielmehr erzeugt analogWrite ein PWM-Signal (PWM = Pulsweitenmodulation), aus dem sich durch Glättung ein analoger Spannungswert ableiten lässt.

Da alle Mikrocontroller letztlich nur mit 1 und 0, also Spannung ein und Spannung aus umgehen können, wird beim PWM ein digitaler Wert zwischen 0 und 255 in eine schnelle Folge von HIGH- und LOW-Zuständen umgesetzt. Das Verhältnis zwischen den An- und Auszeiten wird als Pulsweite oder Pulsdauer bezeichnet und entscheidet über die resultierende Spannung. Hier muss man zwischen dem Gleichrichtwert (beziehungsweise dem arithmetischen Mittel) unterscheiden, der sich aus tan/T berechnet, sowie dem Effektivwert, der sich aus der Quadratwurzel der Verhältnisse berechnet. Er ist in der Praxis für die Leistungsberechnungen wichtig.

Kurzinfo
  • Verfahren der Digital-Analog-Wandlung
  • DA-Wandler aus Widerständen bauen
  • Fertige DAC-ICs nutzen

Unten das Oszilloskop-Bild einer analogen Sinus(halb)welle; oben das gleiche Signal als PWM

Mit PWM lässt sich über einen Transistor oder MOSFET problemlos die Leistung von Gleichstrommotoren oder die Helligkeit von Lampen steuern. Das funktioniert dort besonders gut, weil die Verbraucher das gepulste Signal selbst durch ihre elektrischen Eigenschaften (Induktivität etc.) glätten.

Bei einem echten DA-Wandler liegt der analoge Wert konstant am Ausgang an, man muss nicht mehr glätten. Die schnellen An- und Ausimpulse haben bei der Steuerung von Gleichstrommotoren allerdings einen entscheidenden Vorteil: Bei kleinen Impulsbreiten bekommt der Motor kurze Impulse mit der vollen Spannung. Dadurch lässt sich die Geschwindigkeit wesentlich leichter und genauer regeln, als wenn er nur eine dauerhafte, dafür aber kleine Spannung erhält. Dies ermöglicht etwa bei einer Modelleisenbahn das langsame Anfahren der Züge oder Schleichfahrten. Auch die Motoren von Elektroautos werden oft mit Pulsweitenmodulation angesteuert.

Die in einem Arduino Uno oder Nano integrierte PWM arbeitet standardmäßig mit einer Frequenz von 490 Hz an den Pins 3, 9, 10, 11 und 976 Hz an den Pins 5, 6. Für die Steuerung eines flinken Galvo-Scanners wie er in der Laserharfe zu finden ist, ist diese Frequenz jedoch zu niedrig. Der Spiegel würde dann immer noch versuchen, den schnellen An- und Ausimpulsen zu folgen, was in unschönen Zuckungen endet.

Die Erhöhung der PWM-Frequenz ist erfreulicherweise beim Arduino problemlos möglich. Letztlich genügt im Arduinosketch folgende Code-Zeile, um die internen Timer und Counter neu zu konfigurieren:

TCCRnB = TCCRnB & 0b11111000 | Wert;

Dabei müssen die beiden Ziffern n gegen die Nummer des Timers und Wert gegen den Wert aus der Tabelle ausgetauscht werden. Ein Beispiel zeigt das folgende Listing.

PWM-Tiefbandfilter.ino

 1 int PWMPin = 5;    
 2 int pause=64;  // Die Pause ist erforderlich, damit der Tiefbandfilter funktioniert
 3 
 4 void setup() 
 5 {
 6   pinMode(PWMPin, OUTPUT);
 7 
 8   // Hier kann die PWM Frequenz angepasst werden
 9   // 0x01; ==> 62500 Hz
10   // 0x03; ==> 976 Hz (default)
11   // 0x05; ==> 61 Hz
12   TCCR0B = TCCR0B & 0b11111000 | 0x01; 
13 }
14 
15 
16 void loop() { 
17   for (int i = 0 ; i < 256 ; i++)
18   {
19     analogWrite(PWMPin, i);
20     delay(pause);
21   }
22 }

Dabei gilt es jedoch zu beachten, dass bei einer Änderung der PWM-Frequenz an den Pins 5 und 6 auch andere Zeitfunktionen wie die Befehle delay(), millis() und micros() in Mitleidenschaft gezogen werden. Doch das lässt sich meist kompensieren: Bei einer Erhöhung der PWM-Frequenz um den Faktor 8 wartet der Befehl delay (8000) wieder genau eine Sekunde.

PWM-Frequenzen von einem Arduino Uno
Timer Pins Teiler Wert PWM Frequenz
Timer 0 5, 6 1 0x01 62500 Hz
8 0x02 7812 Hz
64 0x03 976 Hz <= default
256 0x04 244 Hz
1024 0x05 61 Hz
Timer 1 9, 10 1 0x01 31372 Hz
8 0x02 3921 Hz
64 0x03 490 Hz <= default
256 0x04 122 Hz
1024 0x05 30 Hz
Timer 2 11, 3 1 0x01 31372 Hz
8 0x02 3921 Hz
32 0x03 980 Hz
64 0x04 490 Hz <= default
128 0x05 245 Hz
256 0x06 122 Hz
1024 0x07 30 Hz