Mostrando entradas con la etiqueta Conversión analogica Digital. Mostrar todas las entradas
Mostrando entradas con la etiqueta Conversión analogica Digital. Mostrar todas las entradas

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

lunes, 31 de julio de 2017

ACS712 Sensor de Corriente

Características electrónicas del sensor de corriente ACS712

En la actualidad la electrónica ha alcanzado infinidad de campos, como lo es la medicina, bioquímica, domótica, etc. Existen sensores capaces de realizar actividades o trabajos que no nos imaginábamos en años atrás.
Primero revisaremos ¿Que es un sensor?  Un sensor es un dispositivo capaz de detectar magnitudes físicas o químicas tales como temperatura, intensidad lumínica, distancia, aceleración, inclinación, desplazamiento, presión, fuerza, torsión, humedad, movimiento, pH, etc.
En este articulo revisaremos el sensor de corriente ACS712 este sensor es construido por la compañía Allegro MicroSystems, LCC y cuenta con tres modelos capaces de interpretar rangos diferentes de corriente directa y alterna, este sensor comúnmente esta encapsulado en SOIC con ocho pines. Funciona a través de efecto de Hall a través de campos magnéticos de los conductores. Este sensor es muy económico y preciso es usado en la industria y en sistemas de comunicación en aplicaciones como control de motores, detección de cargas, conmutación de fuentes de poder y sobre corrientes entre otras.

Numero de parte
Rango
Sensibilidad
ACS712-05B-T
±5 A
185 mV/A
ACS712-20A-T
±20 A
100 mV/A
ACS712-30A-T
±30 A
66 mV/A

La sensibilidad puede variar según la temperatura ambiente, pero los valores de la tabla son los promedios a 25°C. Se puede observar en la tabla del datasheet los valores mínimos y máximos de sensibilidad, aunque estos varían muy poco es importante tenerlo en cuenta. La salida de este sensor es lineal a la corriente sensada en los bornes, y es importante mencionar que el cero se encuentra con un offset de VOE=(Vcc/2) Volts, por lo que encontraremos el cero en ese valor. Ejemplo: Si tenemos un Vcc=5 Volts, nuestro VOE=5/2=2.5 Volts, según la formula.

Conversión analógica Digital (ADC)



¿Qué es un ADC?

Teniendo en cuenta todas las características electrónicas que obtuvimos de su hoja de datos, ya somos capaces de trabajar con esté sensor para realizar actividades o practicas correspondientes. Antes de seguir con nuestra practica revisaremos lo que es un ADC (Conversión Analógica Digital). En el medio ambiente lo que es captado por un sensor es una señal analógica cambiante en el tiempo, pero nosotros lo que buscamos es poder tener esa señal digitalmente para poder realizar operaciones o para la interpretación del mismo. Para realizarlo utilizaremos el ADC, normalmente los microcontroladores cuentan con uno o más canales que nos ayudaran para adquirir la señal digital.
Principalmente un ADC cuenta con una resolución especifica entre más bits tenga, será más exacta la lectura del canal.
# de bits
(2n-1)
10
1,023
12
4,095
14
16,384

El tamaño de escalón será igual a el voltaje del ADC/entre el número de bits-1.
El microcontrolador Arduino y Microchip cuentan con una resolución de diez bits del ADC, por lo tanto, tenemos un Vref+=5, Vref-=0 y 2n=1023, el resultado sustituyendo los valores es igual a 4.88 mV.

Una vez obtenido el valor podemos verificar si la resolución es apta para utilizarse en la lectura del sensor; podemos observar que se encuentra dentro del rango y posible detectar un cambio de corriente (185 mV/Ampere) hasta (66mV/Ampere) dependiendo del modelo del ACS.