I²C Analoog Digitaal Converter ADC

Waarom zou je een ADC willen gebruiken, terwijl je Arduino er zelf al zes heeft? Een belangrijke reden kan zijn dat je een nauwkeuriger waarde wil hebben. De hier beschreven ADC gebruikt een 16 bitsconverter, die heel erg veel nauwkeuriger is dan de Arduino. Voor lage spanningen kun je nog veel nauwkeuriger meten. Bovendien heeft deze ADC maar twee analoge poorten nodig om vier analoge spanningen te digitaliseren. Een andere reden kan zijn dat je een differentiële meting wilt doen (je meet dan het spanningsverschil tussen twee ingangen).

De ADS1115 ADC

Twee ADS1115 modules
De ADS1115 is een goedkope, goede ADC. Ik testte twee versies (zie de foto). Beiden hebben een PGA (programmable gain amplifier) ingebouwd. Ze werken perfect. Om de module te gebruiken kun je het best de bibliotheek Adafruit_ADS1015.h installeren. Dat kan door downloaden, maar makkelijker via het menu bibliotheken beheren.
Sluit GND van de module aan op GND van de Arduino en VCC op 5V of 3,3 V. Bij de meeste Arduino's sluit je SDA aan op A4 en SCL op A5.
Deze AC heeft een aantal opmerkelijke eigenschappen. Zo worden feitelijk slechts 15 bits gebruikt; de zestiende geeft aan of de spanning negatief is. Negatieve spanningen kun je echter niet meten. De module zal dan ongeveer -0,6 volt aangeven. Je kunt de module wel kapot maken als je negatieve spanningen aansluit! Je kunt wel een negatieve differentiële spanning meten, mits beide spanningen groter dan 0 zijn. Een differentiële spanning (of verschilspanning) kun je meten tussen AIN0 en AIN1 en/of tussen AIN2 en AIN3 via de instructie ads.readADC_Differential_0_1(void); of ads.readADC_Differential_2_3(void);, maar dat heb ik nog niet getest.
uitvoer van het testprogramma
Een andere vreemde eigenschap is dat de module zijn 15 bits verdeelt over 6,144 volt. Dat wil echter niet zeggen dat je 6,144 volt kunt aansluiten. Als vuistregel kun je ervan uitgaan dat je op een ADC maximaal VCC mag aansluiten; hier dus 5 volt. Als je de digitale waarde wilt omzetten naar een spanning, dan moet je dus het digitale getal vermenigvuldigen met 6,155 en dan delen door 215. Dat komt erop neer dat je het uitgelezen getal vermenigvuldigt met 0,0001875. Dit is ruim 26 keer zo goed als de standaard Arduino ADC's. Hieronder zie je mijn testprogramma. Ik heb A0 en A2 aangeloten op 3,3 volt en A1 en A3 op 5 volt. Als je de PGA wilt testen, met kleine signalen (!), gebruik daar dan de functie ads.setGain() voor, met daarin een van de constantes volgens de volgende tabel:
constantereferentie factor (mV)
GAIN_TWOTHIRDS 6,144 V0,1875
GAIN_ONE4,096 V0,125
GAIN_TWO2,048 V0,0625
GAIN_FOUR1,024 V0,03125
GAIN_EIGHT0,512 V0,015625
GAIN_SIXTEEN0,256 V0,0078125
De standaard instelling is GAIN_TWOTHIRDS.
Vergeet niet spanningen die hoger zijn dan de referentie of 5 volt los te koppelen.
Bijvoorbeeld: Sluit de 3,3 volt uitgang aan op een van de ADC ingangen. Zet ergens in setup() de instructie ads.setGain(GAIN_ONE); Verander de factor 0,1875 in het voorbeeldprogramma in 0,125 en je zult zien dat de 3,3 volt perfect gemeten wordt. Ik heb al deze versterkingsfactoren getest en inderdaad kreeg ik dezelfde spanningen uit; alleen bij de hoogste versterking kreeg ik een iets lagere waarde.
Hieronder volgt het voorbeeld programma met de standaard instelling.
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48); // 0x48: ADDR -> GND; 0x49: ADDR -> VCC; 0x4A: ADDR -> SDA; 0x4B: ADDR -> SCL
float Spanning = 0.0;

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

void loop(void) {
  int16_t adc;  // we krijgen een 16 bits getal terug van de ADC
  for (int invoer = 0; invoer <= 3; invoer++) {
    adc = ads.readADC_SingleEnded(invoer);
    Spanning = (adc * 0.1875) / 1000; // Standaard is de stapgrootte 0,1875, maar dat kun je verkleinen
    Serial.print("AIN"); Serial.print(invoer); Serial.print(": ");
    Serial.print(adc);
    Serial.print("\tSpanning: ");
    Serial.print(Spanning, 7); Serial.println(" V");
  }
  Serial.println();
  delay(1000);
}
Je ziet in het commentaar dat je ook het adres kunt veranderen. Dat is vooral nuttig als je meer dan een module wilt koppelen aan de bus. Dan moet elke module een ander adres hebben. Je zou dus met twee draden op A4 en A5 tot 16 analoge ingangen kunnen maken met vier van deze deze modules. Om het adres te veranderen verbind je de adrespin (met bijschrift ADRR) met VCC, of met SDA, of met SCL.