Digitaal naar Analoog Converter (DAC)

Een DAC maakt van een digitaal signaal een analoge gelijkspanning. Je regelt hierbij de grootte van de spanning (in tegenstelling tot dan de "analoge" spanning van de Arduino). Hoe nauwkeurig je de spanning kunt regelen hangt af van het aantal bits dat gebruikt wordt. 12 bits is heel gebruikelijk. Dat betekent dat je (uitgaande van maximaal 5 volt) de spanning in stapjes van van de 5V/4096 = 1,22 mV kunt regelen. Ook nauwkeuriger DAC's met bijvoorbeeld 14 of 16 bits zijn tegenwoordig heel betaalbaar.

De 12-bits MCP4725

Deze DAC heeft een I²C interface, hetgeen het gebruik zeer gemakkelijk maakt. Het adres is 0x62, maar dit kun je gemakkelijk veranderen in 0x63 door de ingang A0 van de module door te verbinden met VCC. Dat werkt inderdaad. Ik testte deze module met verschillende Arduino's. Er is een bibliotheek beschikbaar, die je (in tegenstelling tot wat de documentatie zegt) niet hoeft uit te pakken: gewoon in je library map zetten en via de Arduino IDE toevoegen als zip-bibliotheek. Het gebruik is vervolgens heel eenvoudig: als je in de sketch het object "dac" hebt genoemd dan zet je de uitgangsspanning met de instructie dac.setVoltage(waarde, false); De waarde is een geheel getal in het bereik van 0 tot maximaal 4095. Je moet zelf uitrekenen welke spanning bij welke waarde hoort, zie het voorbeeld. De tweede parameter is false. Alleen als je de DAC bij opstarten een bepaalde waarde wilt geven dan zet je deze eenmalig op true. Al met al is deze DAC een veelzijdig apparaatje en zo klein dat het bijna overal in past.
Het onderstaande testprogramma laat zien welke waarde is ingesteld, de bijbehorende digitale waarde en wat ik meet op analoge pin A0. Je moet dus de uitgang van de DAC aansluiten op A0. Dit lijkt bijzonder goed te kloppen, maar als je nauwkeuriger meet, dan geeft de analoge input behoorlijk afwijkende waarden. Dit ligt vermoedelijk aan de ADC die de Arduino gebruikt, niet aan de DAC. Om de DAC echt goed te kunnen testen heb je een heel goede spanningsmeter nodig.
Uitvoer van het programma
#include <Adafruit_MCP4725.h>

Adafruit_MCP4725 dac;

void setup(void) {
  Serial.begin(9600); // Tweede waarde: A0 is verbonden met VCC
  // MCP4725A1 adres: 0x62 of 0x63 
  // MCP4725A0 adres: 0x60 of 0x61
  // MCP4725A2 adres: 0x64 of 0x65
  dac.begin(0x62);
  Serial.println("V_wens \"waarde\" V_ADC");
}

void loop(void) {
  for (float voltage = 0; voltage <= 5; voltage += 0.5) {
    int waarde = floor(voltage * 4095.0 / 5);
    dac.setVoltage(waarde, false);
    Serial.print(voltage, 1); Serial.print("\t");
    if (waarde < 10) Serial.print(" "); if (waarde < 100) Serial.print(" "); if (waarde < 1000) Serial.print(" ");
    Serial.print(waarde, 1); Serial.print("\t"); Serial.println(5.0 * analogRead(A0) / 1024.0, 1);
    delay(500);
  }
  while (true); // stop hier
}