Op PCF8591 gebaseerde AD/DA converter

De PCF8591 module
De PCF8591 chip is een goedkope 8 bits AD/DA converter met I²C interface. Ik tesste een breakout board met deze chip erop, die zelfs nog meer mogelijkheden biedt. Zo is en nog een LDR aan board en een fototransistor om licht te meten en een instelbare weerstand. Voor mij hoeven deze extra's niet, maar je krijgt ze gratis bij deze toch al erg goedkope module. Ik heb alleen de DAC en de ADC getest. Deze keer gebruik ik in de voorbeeldprogramma's alleen de Wire.h bibliotheek. Deze bibliotheek is tegenwoordig standaard aanwezig en hoef je dus niet te installeren.
Sluit GND van de module aan op GND van de Arduino en VCC op 5V of 3,3 V. Bij de meeste Ardujino's sluit je SDA aan op A4 en SCL op A5.

Gebruik als DAC

Als eerste zie je hoe je een analoge spanning kunt instellen. Om de test zo eenvoudig mogelijk te houden kun je de uitgangsspanning AOUT aansluiten op A0 van de Arduino. Zet de de seriële plotter aan. Zo moet je twee driehoekvormige signalen zien: de laagste komt overeen met de ingestelde waardes en de bovenste is evenredig met de uitgangsspanning. Als je liever de seriëe monitor gebruikt kun je het best een extra delay invoeren. Bij mijn module zag ik dat de werkelijke waarde wordt afgekapt bij ca. 4,5 volt. Dat hoeft in veel toepassingen geen bezwaar te zijn. Als je wilt dat de spanning wel goed gaat kun je de weerstand R2 aan de onderkant van de module los solderen.
#include "Wire.h"
#define PCF8591 0x48 // I2C adress
void setup()
{
  Wire.begin(); Serial.begin(9600); // zet zelf de seriĆ«le plotter aan!
}

void loop()
{
  for (int i = 0; i < 256; i++)
  {
    Wire.beginTransmission(PCF8591);
    Wire.write(0x40); // controlegetal
    Wire.write(i);    // digitale waarde
    Wire.endTransmission();
    Serial.print(i); Serial.print(" "); Serial.println(analogRead(A0));
  }

  for (int i = 255; i >= 0; i--)
  {
    Wire.beginTransmission(PCF8591);
    Wire.write(0x40); // control getal
    Wire.write(i);    // digitale waarde
    Wire.endTransmission();
    Serial.print(i); Serial.print(" "); Serial.println(analogRead(A0));
  }
}

Gebruik als ADC

Hieronder zie je hoe je de module als ADC kunt gebruiken. Er zijn dan 4 analoge inputs beschikbaar, die je bijvoorbeeld omstebeurt kunt uitlezen. Als je ze niet alle vier nodig hebt dan kun je de for-lus aanpassen. Omdat er slechts 8 bits worden gebruikt kun je de spanning minder nauwkeurig meten dan met de ADC's van de Arduino, maar voor de meeste toepassingen nauwkeurig genoeg. Sluit regelbare spanningen aan op AIN0 t/m AIN1 van de module. Je ziet op de seriële monitor de vier digitale waarden naast elkaar staan. Hierbij komt de waarde 255 overeen met VCC.
#include "Wire.h" // Lees de vier ADC's na elkaar uit
#define PCF8591 0x48

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

byte ADC_[4]; // sla hierin de waardes van de ADC's op
void loop()
{
  for (byte a = 0; a <= 3; a++) {
    Wire.beginTransmission(PCF8591);
    Wire.write(a); // Kies de ADC die je wilt lezen
    Wire.endTransmission();
    Wire.requestFrom(PCF8591, 2); // Vraag twee bytes
    Wire.read(); // Negeer de eerste byte
    ADC_[a] = Wire.read(); // Zet de tweede byte in ADC_[a]
    Wire.endTransmission();
    Serial.print(ADC_[a]); Serial.print(" ");
  }
  Serial.println();
  delay(1000);
}