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);
}