Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Jun 2, 2014 in Raspberry Pi | 4 comments

Raspberry Pi ADC Python: LTC2309 I2C 12Bits

Raspberry Pi ADC Python: LTC2309 I2C 12Bits

 Raspberry Pi ADC LTC2309

Raspberry Pi ADC LTC2309

Como posiblemente ya se habrán dado cuenta si investigaron un poco acerca de la tarjeta de desarrollo Raspberry Pi, la misma no viene con un módulo de ADC (conversor Analogo-Digital) integrado. Esta es una de las razones por las que considerarias optar por un microcontrolador o algúna otra tarjeta de desarrollo como Arduino. En este tutorial tenemos una solucion a ese problema.

La tarjeta HeTPro RaspDuino incluye un módulo de ADC externo por I2C (TWI) de 12 bits de resolución y la capacidad de tomar 14Ksps. El módulo ADC tiene un rango de operación de 0 a 5V. El método de conversión es por aproximaciones sucesivas y opera con un reloj interno que le permite tiempos de conversión de 1.3uS. Entre las características mas importantes de este circuito están:

  • 12 Bits de resolución.
  • Bajo consumo: 1.5mW @ 1Ksps.
  • 14 Ksps maximo.
  • Relacion señal a ruido: 73.4dB.
  • Voltaje de alimentación: 5V.
  • Protocolo de comunicación: I2C/TWI.
  • Tiempo de conversión:  1.3uS.
  • Referencia de voltaje interna.
  • 8 canales multiplexados.
  • Unipolar o bipolar.

El ADC se encuentra conectado en la tarjeta mediante las lineas del protocolo I2C para poder controlarlo con la tarjeta Raspberry Pi, para leer datos se encuentran conectados los primeros 4 canales del circuito, ADC0 a ADC3, estos están en las salidas correspondientes:

  • ADC3 – A0
  • ADC2 – A1
  • ADC1 – A2
  • ADC0 – A3

 

Se puede observar en las siguientes imágenes como están conectadas Raspberry Pi ADC LTC2309:

adc_rasp2

adc_rasp

Para poder utilizar el Raspberry Pi ADC LTC2309 solo basta con leer los datos, pero aun asi se recomienda ampliamente revisar la hoja de datos para poder usar el circuito de una manera mas completa, debido a que el mismo tiene diferentes cualidades que pueden resultar interesantes, como modos de hibernacion, selecciones de canales, lecturas single-ended o diferencial, datos con signo o sin signo. La hoja de datos la pueden encontrar en:

http://cds.linear.com/docs/en/datasheet/2309fd.pdf

Los modos de operación se pueden modificar mediante un registro de 6 bits, a continuación se muestran estos parámetros:

 

adc_rasp3

El bit S/D es para seleccionar single ended o diferencial, en este caso la opción diferencial resulta útil cuando se requiere restar el valor de las entradas, en estos casos ideal para elementos como termopares, galgas extensiometricas, etc. El single ended sirve para tomar el dato referenciado a tierra, este es el método mas común, ideal para sensores analógicos como el LM35, potenciometros, etc. El parámetro ODD/SIGN indica si el numero va a tener signo (ODD) o va a ser entero positivo (SIGN). Los parámetros S1 y S0 indican el canal a utilizar. El parámetro UNI es para usar el ADC como unipolar o bipolar. El parámetro SLP se habilita si queremos poner el circuito en modo de hibernación para ahorro de energía.

 

Raspberry Pi ADC LTC2309

 

Raspberry Pi ADC LTC2309

El código que se muestra a continuación funciona para leer un solo canal en modo single endend. Notese que la dirección del dispositivo es 0x08 y que se configura el dispositivo como 0xDC en donde como se menciona corresponde al registro de 6 bits 0b110111xx en donde las “x”s son despreciables ya que no se toman en cuenta en el registro solo los 6 bits mas significativos, es por esto que esta siguiente instrucción es la fundamental en el código:

data_raw1 = bus.read_word_data(DEVICE_ADDRESS,0xDC)

 

El código completo para correr el programa Raspberry Pi ADC LTC2309 y mostrar en la pantalla el voltaje de entrada en el canal ADC correspondiente es el siguiente:

</pre>
<pre>#Raspberry Pi ADC LTC2309</pre>
<pre>print "i2c test 01";

import smbus
import time

time.sleep(0.5) # Dormir por 0.5 segundos

bus = smbus.SMBus(1)

DEVICE_ADDRESS = 0x08

print "Configurado";

#S/D = 1   Single ended / Una entrada a tierra
#O/S = 0   Odd / sin signo
#S1  = 0   Seleccion de canal
#S0  = 0   Seleccion de canal / Canal 0 pin A3
#UNI = 1   Bit unipolar
#SLP = 0   Activo

# 100010xx
# 0x88

time.sleep(1) # Dormir por 0.5 segundos

for i in range (1,40):
    time.sleep(0.2)
    data_raw1 = bus.read_word_data(DEVICE_ADDRESS,0xDC)
    data_fix = ((data_raw1&0xFF00)>>8)+((data_raw1&0x00FF)<<8)
    data_fix2= float(data_fix>>4)
    data_volt= float (data_fix2 * 5/4096)
    print float(data_volt)

print "End"</pre>
<pre>#
#Raspberry Pi ADC LTC2309

 

A continuación una captura de pantalla del programa Raspberry Pi ADC LTC2309, notese como es que también se puede leer el dato del ADC a través de la terminal con la instrucción:

 

sudo i2cget -y 1 0x08 0xDC w

El W es por que es una palabra debido a que el dato es de 12 bits, por lo que necesitamos por lo menos un tipo de dato “word” o palabra para poder leer el dato del ADC que es de 12 bits.

 

Raspberry Pi ADC LTC2309

4 Comments

  1. Mil gracias funcionó perfecto
    Y tambien probre con otro shield el cual posee el mismo ADC y funcionó perfecto
    Gracias por el aporte y compartir, cualquier novedad ya les comento

    • Muchas gracias por tus comentarios, quedamos al pendiente y seguiremos subiendo mas tutoriales. Saludos

  2. Saludos
    Por favor me podría ayudar indicando como hago para leer el pin 1 analogico.. aun no etntiendo como funciona me podría ayudar, segun yo la direccion debería ser 0x09 y lo mismo 0xDC… me podría explicar, un poco más
    Mil gracias por la ayuda que pudieran brindarme

    • Darwinazio, primero que nada vemos la tabla que sale:
      ADC3 – A0
      ADC2 – A1
      ADC1 – A2
      ADC0 – A3

      Supongamos entonces que quieres leer el canal A1 de la tarjeta, el cual corresponde al ADC2 o CH2 del LTC2309, entonces nos vamos a la imagen de la tabla 1 y vemos el siguiente segmento de código:

      #S/D = 1 Single ended / Una entrada a tierra LO DEJAMOS IGUAL.
      #O/S = 0 Odd / sin signo LO DEJAMOS EN 0 SEGÚN LA TABLA.
      ——————
      #S1 = 0 Seleccion de canal AQUI CAMBIAMOS EL CANAL.
      #S0 = 1 Seleccion de canal AQUI CAMBIAMOS EL CANAL.
      ——————
      #UNI = 1 Bit unipolar LO DEJAMOS IGUAL.
      #SLP = 0 Activo LO DEJAMOS IGUAL.

      Lo que ahora nos da
      # 100110xx – EN BINARIO
      # 0x98 – EN HEXADECIMAL

      Entonces para leer el canal A1 cambiamos el renglón de la lectura:
      data_raw1 = bus.read_word_data(DEVICE_ADDRESS,0xDC)
      Y nos quedaría:
      data_raw1 = bus.read_word_data(DEVICE_ADDRESS,0x98)

      PD: El renglón de la dirección del dispositivo no lo cambies, por que ahí si ya no lo va a detectar, este hay que dejarlo:
      DEVICE_ADDRESS = 0x08

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *