Mikrocontroller-Typen, auf denen der DAC12-Block implementiert ist, verfügen über zwei D/A-Ports (DAC0 und DAC1). Es handelt sich dabei um Spezialfunktionen von digitalen I/O-Ports. Auf dem MSP430F1612 belegt DAC0 den Port P6.6 und DAC1 den Port P6.7. Der genaue Anschluss hängt von der gewählten MSP430-Variante ab und ist dem jeweiligen Datenblatt zu entnehmen.
Jeder D/A-Port kann sowohl im 8-Bit- als auch im 12-Bit-Modus arbeiten. Die Steuerung
der beiden D/A-Ports übernehmen insgesamt vier interne Register. Dabei stehen pro
D/A-Port jeweils ein Kontrollregister und ein Datenregister zur Verfügung. Im Datenregister
steht der Ausgabewert des D/A-Wandlers. Das Kontrollregister (DAC12_xCTL), das in
Abbildung 7.5 dargestellt ist, dient zur Initialisierung des D/A-Ports und zur Einstellung der
Laufzeitparameter.
Die grau unterlegten Flags sind nur zugänglich, wenn das Bit DAC12ENC gesetzt ist. Das ist eine Sicherungsfunktion, wie wir sie auch schon bei den analogen Eingängen kennengelernt haben.
Jeder D/A-Port lässt sich mit einer eigenen Referenzspannung konfigurieren. Dabei kann man entweder auf eine externe Referenzspannung oder auf eine der internen Referenzspannungen (1.5V oder 2.5V) zurückgreifen. Die Referenzspannung wird mit Hilfe der Bits DAC12SREFx nach Tabelle 7.1 festgelegt.
SREFx | Referenzspannung |
00 | V REF+ |
01 | V REF+ |
10 | V eREF+ (extern) |
11 | V eREF+ (extern) |
Die interne Referenz leitet sich von der ADC12-Referenz ab und muss daher aktiviert und konfiguriert werden. Mit der nachfolgenden Codezeile wird beispielsweise die 2.5V-Referenzspannung ausgewählt:
Referenzspannung und Ausgangsspannung des DAC12 sind über einen Input- und einen Output-Buffer miteinander verknüpft. Die Puffer sorgen für eine stabile Betriebsfunktion. In der Dynamik schnell ausgelegte Puffer benötigen mehr Strom als langsam ausgelegte Puffer. Mit den DAC12AMPx-Flags lässt sich die Dynamik und damit der Stromverbrauch der Puffer einstellen (Tabelle 7.2).
AMPx | Input-Buffer | Output-Buffer |
000 | ausgeschaltet | DAC12 ausgeschaltet |
001 | ausgeschaltet | DAC12 ausgeschaltet |
010 | langsam | langsam |
011 | langsam | mittel |
100 | langsam | schnell |
101 | mittel | mittel |
110 | mittel | schnell |
111 | schnell | schnell |
Durch die Wahl der Puffer-Einstellungen (DAC12AMPx > 0) wird der I/O-Port direkt als D/A-Port ausgewählt. Die Initialisierung der Spezialfunktion ist nicht nötig.
Die Amplitude des Ausgangssignals ist abhängig von der gewählten Referenzspannung und einem Verstärkungsfaktor, der mit dem Bit DAC12IR ausgewählt werden kann. Ist DAC12IR gesetzt, so ist die Amplitude gleich der Referenzspannung. Wenn das Bit allerdings gelöscht ist, so entspricht die Amplitude dem dreifachen der Referenzspannung. Da der MSP430 aber mit einer Versorgungsspannung von 3.3V betrieben wird, geht das Ausgangssignal bei 3.3V in Sättigung. Alle Signalanteile mit einer größeren Amplitude werden abgeschnitten. Abbildung 7.6 verdeutlicht den Signalverlauf für beide Fälle (links: DAC12IR = 1 und rechts: DAC12IR = 0).
Auf Grund von Fertigungsschwankungen und Temperatureffekten kann die analoge DAC-Ausgangsspannung einen positiven oder negativen Offset haben, wie es in Bild 7.7 gezeigt ist. Der Absolutwert der Abweichung kann z.B. bei dem MSP430F1612 bis zu 21mV betragen. Um dies zu kompensieren, verfügt das DAC12-Modul über einen internen Kalibriermechanismus.
Die Kalibrierung wird durch Setzen des Bits DAC12CALON gestartet. Nach der Kalibrierung wird das Bit automatisch vom Mikroprozessor gelöscht. Damit kann man feststellen, ob die Kalibrierung erfolgreich ausgeführt wurde. Während des Kalibriervorgangs sollte der DAC12 nicht angesteuert werden. Nach der Kalibrierung beträgt der Offset maximal 2.5mV.
Die Wahl der Puffer-Einstellung hat Auswirkungen auf die Zeit, die der Controller für die Kalibrierung benötigt. Bei einem langsam ausgelegten Puffer benötigt der Controller etwa 100ms. Für einen schnell ausgelegten Puffer werden nur 6ms benötigt.
Die Funktionalität der weiteren Bits und Flags im Kontrollregister ist dem Datenblatt zu entnehmen. Da sie teilweise vom verwendeten Modell abhängen und zum anderen für die Konzeption üblicher DAC12-Anwendungen keine große Bedeutung haben, sollen sie hier nicht weiter berücksichtigt werden.
Wir haben nun einige Informationen über die Initialisierung eines D/A-Ports erfahren und können nun ein einfaches Beispielprogramm entwickeln. Das Programm aus Listing 7.2 soll eine Dreiecksspannung mit einer Amplitude von 2.5V ausgeben. Dazu wird der DAC12 initialisiert und dann einfach die entsprechende Wertefolge ausgegeben.
Bei der Ausgabe analoger Spannungen ist natürlich wichtig, welche Last daran angeschlossen werden soll. Lasten bis maximal 500μA können direkt durch den MSP betrieben werden. Bei höheren Strömen muss der Steuerkreis mit DAC12 und Mikrocontroller vom Lastkreis getrennt werden. Hierzu gibt es mehrere Möglichkeiten:
Eine einfache Möglichkeit den Steuer- vom Lastkreis zu trennen, ist die Verwendung einer Transistortreiberstufe oder einer Darlington-Schaltung. In Kapitel 2.3.3 haben wir diese ja schon eingeführt und man kann prinzipiell auch eine Schaltung wie in Bild 2.5 verwenden. Nachteilig ist, dass beide Schaltungen ein relativ stark nichtlineares Verhalten von Uin∕Uaus aufweisen. Normalerweise ist ein lineares Übertragungsverhalten erforderlich, weshalb man lieber gleich auf eine Operationsverstärkerschaltung zurückgreifen sollte. Einfache Lasten bis 20mA können mit den meisten Standard-Typen (z.B. LM358 LM324 TL084 uA741) direkt betrieben werden. Bei größeren Strömen bis 200mA kann man zum Beispiel auf einen OPA551 oder einen AD815 zurückgreifen. Der Anschluss erfolgt dann beispielsweise als ganz normale nichtinvertierende Operationsverstärkerschaltung, siehe Abbildung 7.8. Mit einem Verstärkungsfaktor > 1 können auch höhere Ausgangsspannungen als die Versorgungsspannung des MSP erreicht werden. Immer vorausgesetzt natürlich, der Operationsverstärker wird mit einer entsprechend größeren Versorgungsspannung betrieben.
Besteht die Notwendigkeit, Ströme größer als 10..20 mA abzugeben, kann man eine Schaltung wie in Bild 7.9 gezeigt verwenden. Die hier gezeigte Schaltung linearisiert die Ausgangskennlinie des Transistors durch die Rückführung über den Operationsverstärker. Im Prinzip ist es gleich, ob man dort einen FET oder einen Bipolartransistor einsetzt. Entscheidend ist eher die Dimensionierung der Verlustleistung und der maximal erlaubte Strom durch den Transistor.