DAC

XMega Blockdiagramm

Der XMega128A1 besitzt zwei DACs (Digital to Analog Converter) die es dem Mikrocontroller erlauben analoge Spannungen zu generieren. Natürlich kann der Controller mittels einer PWM auch eine analoge Spannung generieren nur bei der PWM wird die Höhe des Effektivwertes der Spannung vom Puls-Pause Verhältnis bestimmt. Beim DAC ist dies nicht so.
Jeder DAC besitzt zwei Kanäle und er kann zudem auch als Referenzspannung für den ADC genutzt werden.

-> DAC konfigurieren:

Bevor der DAC benutzt werden kann, muss er erstmal konfiguriert werden.
Für mein Beispiel verwende ich den DACB (der andere DAC wäre der DACA).
Der DAC besitzt, wie viele der Peripheriegeräte des Controllers, drei Controlregister (A, B und C). Zuerst beschreibe ich das C-Register (auf den Grund gehe ich nachher ein):

Diese Zeile macht im Grunde nichts anderes als die Bits, welche für die Auswahl der Referenzspannung und für die Ausrichtung des Ergebnises da sind, zu löschen.
Da ich als Referenzspannung die 1V Referenz verwenden möchte, muss eine 0x00 an der 3. und 4. Stelle des Register stehen.
Die Bitmuster für die Auswahl der Referenzspannung seht ihr hier:

DAC-Referenz

Da das Ergebnis von der Ausrichtung der Bits her nicht geändert werden soll (sprich links angeordnet), setze ich dieses Bit im Controlregister. Soll das Ergebnis rechts angeordnet werden, muss dieses Bit gelöscht werden.
Anschließend beschreibe ich das A-Register:

Hier aktiviere ich den Channel 0 vom DACB. Dafür setzte ich das 3. Bit vom Control A-Register auf High. Anschließend wird der DAC aktiviert, indem ich das 1. Bit des Registers auf High setze.
Der Grund warum ich erst das Control C-Register beschrieben habe und anschließend das Control A-Register ist der, dass es öfters vorkommt das die Peripheriegeräte erst fertig eingestellt werden müssen bevor sie aktiviert werden. Ansonsten kann es vorkommen das diese Geräte nicht richtig arbeiten.
Aus diesem Grund habe ich mir angewöhnt, dass ich die Geräte erst fertig konfiguriere und erst dann aktiviere ich sie.
Wenn der DAC mit zwei Outputchannel arbeiten soll, müssen in dem Control B-Register noch das 5. und 6. Bit dementsprechend gesetzt werden.
Die passende Codezeile sieht wie folgt aus:

Außerdem muss das Control B-Register noch angepasst werden:

Die Konfiguration des DACs ist nun soweit abgeschlossen.

-> Ausgangsspannung einstellen:

Die Ausgangsspannung stelle ich mit folgender Funktion ein:

Das Hauptprogramm sieht dann wie folgt aus:

Als erstes wird die Funktion DACB_Conversion aufgerufen. Wie aus der Deklaration der Funktion hervorgeht, erwartet diese Funktion einen Wert vom Typen Integer als Übergabeparameter. Dieser Wert wird dann innerhalb der Funktion unter dem Namen Voltage gespeichert (nicht verwirren lassen. Das die Variable im Programm und in der Funktion Voltage heißt, hat nichts zu sagen.
Alternativ kann auch

geschrieben werden. Dann wird der Wert 0x100 in die Funktion übergeben.
Sobald der Wert dann in der Funktion ist, wird dieser Wert in das dementsprechende Datenregister des Channels geschrieben. Hier in meinem Beispiel bekommen beide Channel den selben Wert. Aber das kann natürlich geändert werden. Es kann z.B. gesagt werden, dass die Funktion nicht einen Integerwert erwartet sondern zwei (für jeden Channel einen). Das Prinzip ist aber dasselbe.
Mit den Zeilen

wird nun also der Wert der Variable Voltage in das DACB.CH0DATA-Register geschrieben. Die while-Schleife sorgt dafür, dass das Programm solange an der Stelle stehen bleibt bis die Wandlung abgeschlossen ist.
Wenn alles richtig gemacht wurde liegt an den demensprechenden DAC-Pins des Mikrocontrollers eine Spannung an. Welche Pins das sind kann dem Datenblatt vom XMega128A1 entnommen werden. Für den DACB sind es die Pins B2 und B3 (Pin 7 und 8).

Die Auflösung des DACs beträgt 12-Bit. Bei einer Referenzspannung von 1V entspricht 1 Bit einer Spannung von ~0,25mV:

Latex formula

Wenn mein Beispielcode verwendet wird und die Variable Voltage einen Wert von 0xFFF besitzt, gibt der DAC eine Spannung von 1V aus (also genau die Spannung die die interne Referenz bereitstellt).
Die Ausgangsspannung kann also auf 0,8mV genau eingestellt werden.
Wenn die Spannung ganz genau sein soll, muss der DAC noch kalibriert werden. Dazu müssen die entsprechenden Werte aus dem Signaturenregister in das DAC-Kalibrationsregister geladen werden.
Wie dies funktioniert erfahrt ihr unter dem Punkt Kalibration.

 

-> Zurück zum XMega Tutorial

6 thoughts on “DAC
  1. Hallo,
    ich will meine Vref für den DAC auf Vcc sprich 3,3V setzen, funktioniert aber leider nicht! :(
    Könntest du mir da evtl weiter helfen?

    Danke

    • Hey,

      hast du den eine 3,3V Referenz angeschlossen?
      Der XMega besitzt keine, sprich du musst eine externe verwenden.

      Gruß
      Daniel

  2. Hallo,
    Du schreibst: Wenn mein Beispielcode verwendet wird und die Variable Voltage einen Wert von 0xFFF besitzt, gibt der DAC eine Spannung von 1V aus (also genau die Spannung die die interne Referenz bereitstellt).
    Die Ausgangsspannung kann also auf 0,8mV genau eingestellt werden.

    Sollte die Auflösung nicht ca. 0,25mV bei 12 Bit betragen?

    Gruß Jürgen

    • Hallo Jürgen,

      ja, du hast Recht. Meine Rechnung bezog sich auf 3,3V. Ich korrigiere das :)
      Danke für den Hinweis!

      Gruß
      Daniel

  3. Hallo,
    ich bin ein absoluter Laie und versuche gerade eine atxmega32a3u zu programmieren. Ich hänge gerade an der Programmierung des DAC. Ich habe ein Paar sehr grundsätzliche Fragen..

    So wie ich das verstanden habe wird doch am DAC Ausgang ein digitales Signal ausgesendet oder? Bei meinem Fall soll der Chip ein digitales Signal an einem DAC-Chip: http://www.analog.com/media/en/technical-documentation/data-sheets/AD5624_5664.pdf senden, der dann ein analoges Signal an den 4 Ausgängen schaltet.

    Könnntest du mir bei meinem Problem helfen?
    viele Grüße
    g44

    • Hallo,

      der DAC erzeugt eine analoge Spannung (also z.B. eine Spannung von 0-5V) mit Hilfe eines digitalen Eingangswertes. Der digitale Eingangswert sind die Bits die du in den DAC rein schiebst.

      Gruß
      Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.