martedì 28 gennaio 2014

ADS1115 ADC 16Bit su Arduino Uno

Per il progetto di acquisizione dati del Laboratorio Terre del Dipartimento di Scienze della Terra e' necessario utilizzare un convertitore analogico digitale migliore di quello presente su Arduino (10 bit =1024 livelli per Arduino Uno e 12 bit=4096 livelli per Arduino Due)

La soluzione piu' semplice e' stata utilizzare l'ADS1115, un integrato che dialoga su canale I2C con quattro ingressi analogici (in multiplex) con un ADC da 16 bit montato su una BreakOut della AdaFruit


http://learn.adafruit.com/assets/2675
Le connessioni sono semplici

Vdd = 5 V Arduino
GND = GND Arduino
SDA = A4 Arduino
SCL = A5 Arduino

non sono necessarie le resistenze di PullUp sui pin A4,A5
L'integrato ADS1115 contiene al suo interno sia l'oscillatore che la tensione di riferimento per cui non e' necessaria ulteriore elettronica di contorno. E' possibile anche settare il valore del guadagno

Per i vari valori di guadagno si hanno differenti valori di fondo scala e differente sensibilita'

Gain 2/3 : fondo scala 6.144V 1bit = 0.1875 mV
Gain 1 : fondo scala 4.096V 1bit = 0.125 mV
Gain 2 : fondo scala 2.048V 1bit = 0.0625 mV
Gain 4 : fondo scala 1.024V 1bit = 0.03125 mV
Gain 8 : fondo scala 0.512V 1bit = 0.015625 mV
Gain 16 : fondo scala 0.256V 1bit = 0.0078125 mV

(attenzione: se si setta un guadagno e si eccede il fondo scala si rischia di bruciare l'ADC)

Considerando le tensioni di lettura della strumentazione del laboratorio di geotecnica il Gain ottimale e' il 4

Per controllare questo componente si usa la libreria scaricabile a questo indirizzo 

Di seguito un semplice esempio ovvero la misura della tensione su un potenziometro variabile (montato su A0 dell'ADS1115)


ed ecco il semplice codice per la lettura
----------------------------------------------------------
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

void setup(void) 
{
  Serial.begin(9600);
  //                                                                ADS1015  ADS1115
  //                                                               -------  -------
  ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV      0.1875mV (default)
  // ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  // ads.setGain(GAIN_TWO);        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  // ads.setGain(GAIN_FOUR);       // 4x gain   +/- 1.024V  1 bit = 0.5mV    0.03125mV
  // ads.setGain(GAIN_EIGHT);      // 8x gain   +/- 0.512V  1 bit = 0.25mV   0.015625mV
  // ads.setGain(GAIN_SIXTEEN);    // 16x gain  +/- 0.256V  1 bit = 0.125mV  0.0078125mV
  
  ads.begin();
}

void loop(void) 
{
  int16_t adc0, adc1, adc2, adc3;

  adc0 = ads.readADC_SingleEnded(0);
  Serial.print("AIN0: "); Serial.println(adc0);
  delay(100);
}