doing cool stuff with cars and electronics

AD5791 20Bit DAC

Porn for Engineers…. Der 1 ppm 20-Bit, +-1 LSB INL, Voltage Output DAC (+-10V) von Analog Devices (ADI) ist eines der feinsten Stücke Silizium in diesem Bereich. Das Teil musste ich natürlich gleich evaluieren und habe mir daher das Referenzdesign nachgebaut. RRRRRRRRRR.

Funktioniert wunderbar, aber die ganze Performance kann man natürlich einfacher und besser mit einer mehrlagigen Platine ausnutzen. Mein Design verwendet aber nur eine selbstgeätzte 2-lagige Leiterplatte. Aber das muss ja nicht immer schlecht sein… Leider gab es wieder Kontaktprobleme bei den Durchkontaktierungsnieten, sodass ich diese zusätzlich verlöten musste. Sieht schrecklich aus, aber das Teil kommt eh in ein Abschirmgehäuse und da sieht es niemand. Elektronik soll ja funktionieren und nicht gut aussehen😉AD5791 20Bit DAC

Die Stromversorgung übernimmt das Netzteil vom c’t-Lab über ein 14Pin Flachbandkabel. http://www.heise.de/ct/projekte/machmit/ctlab/wiki Darüber werde ich bei Gelegenheit mal schreiben. Tolles System und auch sehr praktisch, aber eine irrationale Angst vor SMD-Bauteilen führt zu „begehbarer Elektronik“ und verschenkt einige Möglichkeiten, aber das ist ein anderes Thema.

Zurück zum AD5791. Das System dient zum Testen von ADC- und OPV-Schaltungen, vor allem aber zum Simulieren der Ausgangsspannungen von verschiedenen Sensorentypen.

Die Ansteuerung geschieht mittels einer kleinen C# Anwendung über einen FTDI FT4232H. Dem ist ein eigener Eintrag gewidmet.

Auch mit dem allseits geliebten AVR (hier Segensformel einfügen) ist eine Ansteuerung sehr einfach möglich, allerdings nur mit einem Bruchteil der Geschwindigkeit, da die notwendigen Berechnungen den kleinen 8Bit Controller natürlich „etwas“ überfordern können.

Dazu mal ein bisschen C-Code: Zuerst die Hardware SPI Initialisierung auf einem ATmegax8:

DDRB = (1<<PB3) | (1<<PB5) | (1<<PB2); //MOSI, SCK, SS als Ausgang

SPCR = (1<<CPHA) | (1<<SPE) | (1<<MSTR) | (1<<SPR0); //Enable SPI Master

PORTB |= (1<<PB2); //CS HIGH

Senden und Empfangen geht mit folgendem Code:

SPDR = dataout;

while (!(SPSR & (1<<SPIF))); //until transmission complete

datain = SPDR;

datain und dataout sind jeweils 8Bit Werte (unsigned).

Jetzt wird das CTRL-Register des DACs beschrieben. Dazu werden 24Bit übertragen. Das erste Bit gibt an, ob geschrieben oder gelesen wird, die nächsten 3Bit sind Adressbits und dann kommen 20 Datenbits. Wir müssen diese 24Bit auf 3x 8 Bit aufteilen. Ist aber nicht weiter schlimm und vor allem alternativlos, wenn eine Hardware-SPI verwendet werden soll. Leider kenne ich keinen Mikrocontroller mit einer SPI-Einheit mit über 16Bit breiten Registern, aber das ist wieder eine andere Geschichte. Also wieder zurück zum AVR-Code. Den Chip-select Pin (hier B2) muss man selbst schalten, die Hardware-SPI Einheit des AVRs übernimmt das nicht. Diese Lösung ist aber flexibler.

PORTB &= ~(1<<PB2);//CS LOW;

SPI_TRANSMIT(0x20);

SPI_TRANSMIT(0x03);

SPI_TRANSMIT(0x12);

PORTB |= (1<<PB2); //CS HIGH;

Die Einzelheiten stehen im Datenblatt. Das muss natürlich gut gelesen werden, ich spare mir daher das Aufzählen aller Möglichkeiten.

Jetzt kommt die Hauptschleife. Dort wird der gewünschte Ausgabewert voltage, ein 32Bit Integer, von dem 20Bit verwendet werden, berechnet oder vom PC empfangen oder was auch immer, und an den DAC geschickt.

PORTB &= ~(1<<PB2);//CS LOW;

//Command for writing to DAC Register + 4 MSB

SPI_TRANSMIT(0x10 | ( (voltage >> 16) & 0xF ));

//Write Bits 15..8

SPI_TRANSMIT((voltage >> 8) & 0xFF);

//Write Bits 7..0

SPI_TRANSMIT(voltage & 0xFF);

PORTB |= (1<<PB2); //CS HIGH;

Zusammenfassend kann man also von einem enorm mächtigen IC sprechen. Sehr präzise und auch noch unproblematisch zu verwenden. Kleiner Nachteil ist, dass es sich bei diesem System nicht um eine „Single Chip“ Lösung handelt. Man muss sowohl die Referenzspannungseingänge als auch den Ausgang mit je einem sehr präzisen OPV puffern, was den Schaltungsaufwand etwas vergrößert. Aber natürlich ist das kein Vergleich zu früher, als man von knapp 20Bit Genauigkeit bei einem DACs entweder nur träumen konnte oder eine sehr aufwändige Schaltung brauchte. Eine Möglichkeit dazu war oder ist eine digitale Regelschleife, in der der Ausgang ständig mit einem 24Bit ADC überwacht und der DAC-Ausgabewert entsprechend anpasst. Das macht zwar Spass, ist aber nicht ganz unkritisch. Aber egal, jetzt gibt es ja den AD5791.

Ein kleines praktisches Problem ist, dass ich mit meinen Messgeräten die Temperaturabhängigkeit und die Linearität nicht mit der notwendigen Genauigkeit messen kann. Werde ich bei Gelegenheit aber nachholen.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s