viernes, 18 de agosto de 2017

ADS1115 -ADC 16 Bits

ADS1115 ADC 16 BITS

¿Qué es el ADS1115?


Este circuito integrado es un dispositivo electrónico que se encarga de convertir una señal analógica a digital (ADC) capaz de captar hasta 16 bits en su ADC y este es configurable.
Se comunica a través de un protocolo de comunicación llamado i2c, este protocolo es compatible con Arduino y microcontroladores (PIC), recordemos que normalmente estos cuentan con ADC de hasta 10 bits, por lo que si queremos mejorar la precisión de la lectura de una variable es recomendable utilizar este dispositivo. También es posible conectar cuatro canales a este circuito integrado y se puede leer por medio del protocolo direccionando cada entrada sin problemas.
Este cuenta con tres modos de medición Single Ended, Diferencial y Comparador.
En el modo Single Ended disponemos de cuatro canales de 16 bits. En el modo diferencial usamos dos ADC para cada medición, por lo que el número de canales se reduce a 2, pero tendremos la ventaja de poder medir tensiones negativas y mayor inmunidad al ruido. El modo comparador es una especie de alerta la cual se activará en el canal AIN0, cuando el valor registrado supere el umbral seleccionado.

Tabla 1.- Índices máximos absolutos.

Tabla 2.-Modelos de productos.

Figura 3.-Diagrama a bloques ADS1115.

Como podemos observar las características de este ADC son superiores a los ADC que se encuentran en los microcontroladores PIC y de Arduino, las mediciones en este caso serán más precisas y podríamos compararlas con las de Arduino para verificar la diferencia, La velocidad de este ADC es de 860 muestras por segundo como se especifica en la tabla, este incluye internamente un amplificador de ganancia programable. Además, que el consumo del mismo es de 150 uA en modo continuo.

Figura 4.-Amplificador de Ganancia Programable

Esquema de conexión



Figura 5.-Conexión de ADS1115 con ARDUINO.
Para realizar los distintos modos del ADS se usará una librería desarrollada por Adafruit:

*Independientemente del PGA elegido la máxima tensión que podemos medir será siempre la tensión de alimentación. Es decir, aunque el PGA sea 6.144V, no podremos medir tensiones superiores a 5V.

Esta librería cuenta con el modo Single End


#include <Wire.h>
#include <Adafruit_ADS1015.h>

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

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Hello!");
 
  Serial.println("Getting single-ended readings from AIN0..3");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
 
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                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);
  adc1 = ads.readADC_SingleEnded(1);
  adc2 = ads.readADC_SingleEnded(2);
  adc3 = ads.readADC_SingleEnded(3);
  Serial.print("AIN0: "); Serial.println(adc0);
  Serial.print("AIN1: "); Serial.println(adc1);
  Serial.print("AIN2: "); Serial.println(adc2);
  Serial.print("AIN3: "); Serial.println(adc3);
  Serial.println(" ");
 
  delay(1000);
}
Figura 6.-Monitor serial mostrando las salidas ADC1…3

Este código despliega cada uno de los ADC con los que cuenta el dispositivo imprimiendo por el puerto serial el valor del ADC, si queremos obtener su salida en voltaje, solo tenemos que multiplicar el valor leído por el sensor por la resolución. La resolución se calcula con la siguiente ecuación:

Introduciendo un voltaje de 3.3 volts aproximadamente obtenemos 17442 bits, multiplicarlos por la resolución obtenemos el voltaje.



Figura 7.-Valor en voltaje de los ADC.

Observamos en el código que podemos seleccionar la Ganancia, por si tenemos voltajes en específico y lograr una medición más confiable. Por ejemplo, si sabemos que nuestro voltaje estará entre 0V hasta 1V podemos seleccionar una ganancia más baja y que el ADC sea más preciso dentro de ese rango.


Este es el código del Modo Diferencial:


#include <Wire.h>
#include <Adafruit_ADS1015.h>

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

void setup(void)
{
  Serial.begin(9600);
  Serial.println("Hello!");
 
  Serial.println("Getting differential reading from AIN0 (P) and AIN1 (N)");
  Serial.println("ADC Range: +/- 6.144V (1 bit = 3mV/ADS1015, 0.1875mV/ADS1115)");
 
  // The ADC input range (or gain) can be changed via the following
  // functions, but be careful never to exceed VDD +0.3V max, or to
  // exceed the upper and lower limits if you adjust the input range!
  // Setting these values incorrectly may destroy your ADC!
  //                                                                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 results;
 
  /* Be sure to update this value based on the IC and the gain settings! */
  //float   multiplier = 3.0F;    /* ADS1015 @ +/- 6.144V gain (12-bit results) */
  float multiplier = 0.1875F; /* ADS1115  @ +/- 6.144V gain (16-bit results) */

  results = ads.readADC_Differential_0_1(); 
   
  Serial.print("Differential: "); Serial.print(results); Serial.print("("); Serial.print(results * multiplier); Serial.println("mV)");

  delay(1000);
}

El código del Modo comparador es el siguiente:


#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;

void setup(void)
{
  Serial.begin(9600);
  
  ads.begin();
  
  // Activar comparador para 2.5V en canal 0
  // (Donde 13333 = 2500 / 0.1875F)
  ads.startComparator_SingleEnded(0, 13333);
}

void loop(void)
{
  int16_t adc0;

  // Actualizar comparadores
  adc0 = ads.getLastConversionResults();
  Serial.print("AIN0: "); Serial.println(adc0);
  
  delay(100);
}

No hay comentarios:

Publicar un comentario