[ Accueil ] [ CONTACT ] [ PLAN du Site ] [ RCNV ] [ Publications ] [ Chantiers Bateaux ] [ Technique Modélisme ] [ Electronique ] [ Radios Vintage ] [ Multi-Switch ] [ Vrac ] [ Astuces ] [ Liens ] [ Base ] [ Compteur ]
 

        ... rgl

 

Convertisseur Analogique/Digital 15-16 bits

ADS1115 - i2c

 

 SOMMAIRE:

01 -  Introduction - Présentation - Généralités

02 -  Registres

03 -  Mesure de température avec un Picaxe et capteur analogique TMP37 (+5°C à +100°C)

04 -  Mesure de température avec un Picaxe et capteur analogique TMP36 (-40°C à +125°C)

05 -  Mesure différentielle
06-   Download  Fichier Excel (Registres, contrôleur de code Config, Convertisseur ADC to mV, simulateur TMP36/37, complément à deux, ...)

      Introduction - Présentation - Généralités

Désirant faire quelques mesures de tension, pour par exemple contrôler le niveau d'une batterie, j'avais constaté que le convertisseur intégré aux Picaxes n'étaient pas particulièrement stables.
Après quelques recherches, je me suis alors décidé à tester un ADS1115.

Il s'agit d'un convertisseur 16 bits disposant d'un ampli à gain variable (PGA - Programmable Gain Amplifier) qui permet d'adapter les plages de mesure pour une plus grande précision sur l'ensemble de l'échelle de conversion.

L'ADS1115 permet de, soit mesurer 4 tensions distinctes en mode normal  (càd avec masse commune, dans ce cas la résolution se fait sur 15 bits), soit deux tensions différentielles à masse flottante.
Dans ce dernier cas de figure, où des valeurs négatiives peuvent être converties, le 16ème bit ne sert que de bit de signe et le codage se fait donc en mode "Complément à deux".
 

Il est piloté en mode i2C et dispose de quatre adresses possibles.

Sa précision constante de mesure est assurée par une tension de référence interne stabilisée.

L'ADS1115 s'alimente de 2 à 5,5Volts. 

Disponible en module compact et pratique, pour moins de 2 €uros, c'est un ensemble particulièrement attrayant et facile d'usage.

             

/
     Registres 

Ce convertisseur ADC dispose de 3 registres pour accéder et gérer toutes ses possibilités.

 - POINTER -
   Ce registre pointeur va permettre de sélectionner l'accès des commandes de lecture du registre de conversion ou de lecture et d'écriture vers le registre de configuration.

- CONVERSION -
  Ce registre n'est accessible qu'en mode Lecture.
  Il contient la valeur convertie en numérique d'une des tensions analogiques appliquées à ses entrées, conformément aux paramètres du registre de configuration.

- CONFIG -
 
Ce registre contient tous les paramètres de fonctionnement du convertisseur ADC ADS1115 (Modes, sélection des entrées, vitesses d'échantillonnage, Valeur Full Scale, ...)
   Le détail de ces registres est repris dans le tableau suivant.
  

 

     Mesure de température avec un capteur analogique TMP37

Pour tester ce convertisseur en mode normal, on pourrait se contenter de le connecter à une alimentation de labo.
Attention toutefois à ne jamais dépasser la tension d'alimentation + 0,3 volt  (Vcc + 0,3V) au risque de le détruire irrémédiablement !

Mais pour le Fun, j'ai utilisé un capteur de température TMP37.

Le TMP37 travaille dans une plage de 5°C à 100°C et délivre respectivement une tension de 100mV à 2 Volts, de façon linéaire et indépendamment de sa tension d'alimentation qui peut varier de 2,7 à 5,5 Volts !

La lecture du registre de conversion sera effectuée par un petit µC Picaxe 08M2.

Pour les calculs de conversion il faut analyser les courbes de réponse du TMP37.
Pour cela, j'utilise Excel et je rentre les valeurs suivant les spécifications du DataSheet du TMP37.

   

 J'introduis le rapport ADC /mV qui me permettra de déterminer Vin.
     Pour PGA = 2,  ADC/mV = 16.
    Ainsi, pour calculer et afficher la valeur de Vin il suffira, pour PGA=2, de diviser la valeur ADC par 16.

 De même, le rapport ADC /°C  me permettra de déterminer la température.
   
Pour PGA = 2,  ADC/°C = 320.
   Ainsi, pour calculer et afficher la valeur de la Température il suffira, pour PGA=2, de diviser la valeur ADC par 320.
   Mais comme le µC Picaxe ne calcule qu'en nombres entiers, il faudra user d'un petit artifice mathématique pour récupérer la première décimale. 

 De ces valeurs, on saura tirer la courbe de réponse et Excel calculera l'équation de la courbe de tendance.
 Cette équation permettra de connaître les calculs à implémenter dans le programme d'affichage des valeurs mV et °C.

 Voici la courbe (Droite !) de réponse du TMP37 du rapport ADC/mV. et on constate bien que pour trouver les mV, multiplier ADC par 0,0625 revient à le diviser par 16.

   

  Et si on fait de même pour le rapport ADC/°C, on voit que pour trouver °C, il faudra multiplier ADC par 0,003125, ce qui revient à le diviser par 320 (1/ 0,003125 = 320)

  

  Programme de test

' ---------------------------------------------

'  TEST ADC ADS1115 - 16bits - 4CH - i2C

'  TMP37 - Positive Temperature Sensor

'              5°C to 100°c

'           Rg.LEGAT - FEV.2020

' ---------------------------------------------

#Picaxe 08M2

#TERMINAL 4800

 

' Picaxe08M2 config

'----------------------

'C.1 Pin6 hi2c-SCL

'C.2 Pin5 hi2c-SDA

 

'ADS1115 Config

'----------------------

' Vcc to 5V

' VCC TMP37 = 3.3V !!!

' Vin to measure: Ain1

' i2cAddr.Pin to GND = %1001000 = 0x48

'(internal 10KR_Pull-up on SDA and SCL)

' 10KR_Pull-down to Vin (Ain1) or 0,1mK Capa

 

' Variables:

'------------

Symbol Temp_W0=w0 ' b0:b1 ' Reserved for calculation

Symbol Vin=w1     ' b2:b3 ' Input to read and convert

 

Symbol ADC=w2     ' b4:b5 ' Converted value

  Symbol adc.lsb=b4

  Symbol adc.msb=b5

 

Symbol CFG=w3     ' b6:b7 ' Configuration of ADS1115

  Symbol cfg.lsb=b6

  Symbol cfg.msb=b7

 

Symbol TempC=w4   'b8:b9

Symbol Entier=w5  'b10:b11

Symbol Decima=w6  'b12:b13

Symbol Coef=w7

 

' i2c Config

'---------------

'Slave Address is the i2c slave address [bit7-bit1] on 7 bits

'Always leave bit0 as 0 !

hi2csetup i2cmaster, %10010000, i2cfast_8, i2cbyte 'address with grounded address pin

 

' Calculation Coef TMP37

'--------------------------------------------------

'Coef = 8   ' 4,096v_Full_Scale PGA=001

 Coef = 16  ' 2,048v_Full_Scale PGA=010 (Default)

'Coef = 32  ' 1,024v_Full_Scale PGA=011

'Coef = 64  ' 0,512v_Full_Scale PGA=100

'Coef = 128 ' 0,256v_Full_Scale PGA=101/110/111

 

Sertxd ("------------------------------------------------------",cr,lf)

Sertxd ("      START ADS1115_TMP37.bas",cr,lf)

Sertxd ("   Reading Voltage and Temperature",cr,lf)

Sertxd ("        Rg.LEGAT Fev.2020",cr,lf)

Sertxd ("------------------------------------------------------",cr,lf)

Pause 500'For read Identification of the programm to Console

 

Init:

'Configuration of the CONFIG Register (Read Voltage)

'---------------------------------------------------------------------

hi2cout(%10010000) 'i2c Address '+0' for writing operation (Facultative ?)

 

' DIRECT MODE

'Hi2cout (%00000001,%11010100,%10000011)'Write to Reg.CONFIG, MSB, LSBxxxxxxxxxxxxx

'PGA = bits[11:9] =010 --> (2,048V Full Scale)&&&&&&&&&&&&&&

'MUX = bits[14:12]=101 --> (AINP = AIN1 and AINN = GND)

'MODE = bit[8]=0 --> (Continuous)

 

' DIFFERENTIAL MODE

Hi2cout (%00000001,%10000100,%10000011) 'Write to Reg.CONFIG, MSB, LSBxxxxxxxxxxxxx

'PGA = bits[11:9] =010 --> (2,048V Full Scale)&&&&&&&&&&&&&&

'MUX = bits[14:12]=000 --> (AINP = AIN0 and AIN1 = GND = Differential Mode)

'MODE = bit[8]=0 --> (Continuous)

 

hi2cout(%10010001) 'i2cAddress '+1' for all future readingoperations (facultative ?)

'---------------------------------------------------------------------

 

Gosub Read_CFG'Read Reg.CONFIG (Facultative)*************************

 

Main:

 Hi2cout (%00000000) 'Set Pointer to Reg.Conversion

 Pause 500

 

DO

 Hi2cin (adc.msb,adc.lsb) 'Read MSB,LSBfromreg.Conversion

 sertxd (" ADC =  ", #ADC,cr,lf) ' ADC = adc.msbadc.lsbW2=[b4:b5]

 Sertxd ("--->MSB : ",#adc.msb,"   LSB : ",#adc.lsb,"   = MilliVolts = ")

 

 Gosub Convert_mV

 sertxd(#Vin)

 

 Gosub Convert_Temp

 SerTxd("  TEMP= ", #Entier,".",#Decima,cr,lf) 'Affichage Temp sur la meme ligne

 

 Sertxd ("...........................................................",cr,lf)

LOOP

'===========================================================

'   Sub Routines

'===========================================================

Convert_mV:

 Vin=ADC/Coef  'Result in MilliVolt ! Coef = 16 pour PGA=2 (FS=2,048V)

return

 

Convert_Temp:

 TempC=ADC/32  ' y=0,003125x ; 0,03125 = 1/32 ; X=ADC, Y=Temp en Celsius 

 Entier=TempC/10

 w0=Entier*10

 Decima=TempC-w0

return

 

Read_CFG:

 Hi2cin (cfg.msb,cfg.lsb) ' Read Register CONFIG

 Pause500

 Sertxd ("         Reading CONFIG Register",cr,lf)

 Sertxd ("------------------------------------------------------",cr,lf)

 Sertxd (" cfg.msb = ",#cfg.msb,"               cfg.lsb = ",#cfg.lsb,cr,lf,cr,lf)

 

 b0=cfg.msb

 SerTxd( " cfg.msb = ", #bit7,"-", #bit6, #bit5, #bit4,"-", #bit3, #bit2, #bit1,"-", #bit0," " )

 

 b0=cfg.lsb

 SerTxd( "     cfg.lsb = ", #bit7, #bit6, #bit5,"-", #bit4,"-", #bit3,"-", #bit2,"-", #bit1, #bit0, CR, LF )

 Sertxd ("             MUX PGA MODE             DR  Comparators",cr,lf)

 Sertxd ("------------------------------------------------------",cr,lf)

 Sertxd ("         Reading CONVERSION Register",cr,lf)

 Sertxd ("------------------------------------------------------",cr,lf)

 Pause2000

Return
' ----------------------------------------------------------------------------------------------------------  

Résultats affichés à la console:

     

 

Pinout TMP36 et TMP37

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                         Ce relevé montre la stabilité des mesures       

 

     Mesure de température avec un capteur analogique TMP36

 Un autre capteur, à réponse linéaire, à tester, est le TMP36 qui travaille dans une gamme plus large de -40°C à +125°C.

 Malgré le fait qu'il permet de mesurer des températures négatives, le bit de signe (Bit16) ne sera jamais égal à 1 car le TMP36 délivre toujours une tension de sortie POSITIVE, variant de +100mV à +1,750V !

 Dans ce cas, l'étude des courbes de réponse du TMP36 seront très intéressantes car elles vont montrer qu'un OffSet apparait et qu'il devra être implémenté dans le calcul. 

    

   Du tableau des données, on voit que le rapport  ADC/mV reste constant et est identique au TMP37.

   La courbe (Droite) de réponse du TMP36 nous indique ici que le rapport ADC/ mV reste égal à 0,0625, ce qui revient à diviser ADC par 16 pour afficher Vin. (1/ 0,0625 = 16)

 

  Par contre, il n'en va pas de même pour le rapport ADC /°C qui varie à chaque degré !

   Et en effet, l'équation de la courbe (Droite), sera ici bien nécessaire et va nous révéler une valeur OffSet de 50 !

   Ainsi, pour afficher la température, il faudra effectuer le calcul suivant:   Y= °C= (ADC/160)-50

                      Pour info, on peut également obtenir la température ainsi:    °C = (Vin en mV - 500) /10
                      mais comme Vin a déjà fait l'objet d'un calcul, la précision sera moins bonne.

  

  

     Mesure différentielle

 Le mode mesure différentielle présente une meilleure immunité aux bruits électromagnétiques et autres parasites environnants.
 Dans cette configuration, la tension à mesurer ne présente pas de masse commune avec l'alimentation de l'ADC.

 Le mode différentiel est simplement obtenu par configuration adéquate du registre de Configuration.
 C'est d'ailleurs ce mode qui est défini par défaut.

 Dans le programme qui suit, nous allons mesurer la tension d'une pile de 1,5V, branchée, tantôt dans un sens, et puis dans l'autre, pour voir la polarité se modifier à l'affichage.

   Programme de test

' ---------------------------------------------
'  TEST ADC ADS1115 - 16bits - 4CH - i2C
'          Mode Differentiel
'         Rg.LEGAT - FEV.2020
' ---------------------------------------------

#Picaxe 08M2

#TERMINAL 4800

 

' Picaxe 08M2 config

'----------------------

'C.1 Pin6 hi2c-SCL

'C.2 Pin5 hi2c-SDA

 

'ADS1115 Config

'----------------------

' Vcc to 5V

 

' Vin to measure: Ain0 = +  Ain1 = -

' i2c Addr.Pin to GND = %1001000 = 0x48

'(internal 10KR_Pull-up on SDA and SCL)

 

' Variables:

'------------

Symbol Vin    =W1' b2:b3 ' Input to read and convert

 

Symbol ADC=W2' b4:b5 ' Converted value

   Symbol adc.lsb=b4

   Symbol adc.msb=b5

 

Symbol CFG=W3' b6:b7 ' Configuration of ADS1115

   Symbol cfg.lsb=b6

   Symbol cfg.msb=b7

 

Symbol Coef=W4

 

' i2c Config

'---------------

'Slave Address is the i2c slave address [bit7-bit1] on 7 bits

'Alwaysleave bit0 as 0 !

hi2csetup i2cmaster, %10010000, i2cfast_8, i2cbyte 'address with grounded address pin = 0x.48

 

' Calculation Coef TMP37

'--------------------------------------------------

'Coef = 8   ' 4,096v_Full_Scale PGA=001

 Coef = 16  ' 2,048v_Full_Scale PGA=010 (Default)

'Coef = 32  ' 1,024v_Full_Scale PGA=011

'Coef = 64  ' 0,512v_Full_Scale PGA=100

'Coef = 128 ' 0,256v_Full_Scale PGA=101/110/111

 

Sertxd ("------------------------------------------------------",cr,lf)

Sertxd ("      START ADS1115_Differentiel.bas",cr,lf)

Sertxd ("     Reading Voltage with floating GND",cr,lf)

Sertxd ("           Rg.LEGAT Fev.2020",cr,lf)

Sertxd ("------------------------------------------------------",cr,lf)

Pause 500 'For read Identification of the programm to Console

 

Init:

'Configuration of the CONFIG Register (Read Voltage)

'---------------------------------------------------------------------

hi2cout (%10010000) 'i2cAddress '+0' for writing operation (Facultative ?)

 

' DIRECT MODE

'Hi2cout (%00000001,%11010100,%10000011)'Write to Reg.CONFIG, MSB, LSBxxxxxxxxxxxxx

'PGA = bits[11:9] =010 --> (2,048V Full Scale)&&&&&&&&&&&&&&

'MUX = bits[14:12]=101 --> (AINP = AIN1 and AINN = GND)

'MODE = bit[8]=0 --> (Continuous)

 

' DIFFERENTIAL MODE

Hi2cout (%00000001,%10000100,%10000011) 'Write to Reg.CONFIG, MSB, LSBxxxxxxxxxxxxx

'PGA = bits[11:9] =010 --> (2,048V Full Scale)&&&&&&&&&&&&&&

'MUX = bits[14:12]=000 --> (AINP+ = AIN0 and AIN- = AIN1 = Differential Mode)

'MODE = bit[8]=0 --> (Continuous)

 

hi2cout (%10010001) 'i2cAddress '+1' for all future readingoperations (facultative ?)

'---------------------------------------------------------------------

 

Gosub Read_CFG 'Read Reg.CONFIG (Facultative)*************************

 

Main:

 Hi2cout (%00000000) 'Set Pointer to Reg.Conversion

 Pause5 00

 

DO

 Hi2cin (adc.msb,adc.lsb) 'Read MSB,LSBfromreg.Conversion

 sertxd (" ADC =  ", #ADC,cr,lf) ' ADC = adc.msb adc.lsb W2=[b4:b5]

 Sertxd ("--->MSB : ",#adc.msb,"   LSB : ",#adc.lsb,"   = MilliVolts = ")

 

 If adc.msb<$80 Then'$80 = %1000.0000 = 128 'Vin POSITIF

     Vin =ADC/Coef'Result in MilliVolt ! ADC/16 pour PGA = 2

     SerTxd( #Vin,cr,lf)

 

 Else ' Vin NEGATIF !

     ADC=-ADC 'Two's Complement code for negative values

     Vin =ADC/Coef 'Result in MilliVolt ! /16 pour PGA = 2

     Sertxd ("-",#Vin,cr,lf)',cr,lf)

 Endif

 

 Sertxd ("...........................................................",cr,lf)

 Pause 500

LOOP

 

'===========================================================

'   Sub Routines

'===========================================================

Read_CFG:

 

 Hi2cin (cfg.msb,cfg.lsb) ' Read Register CONFIG

 Pause500

 Sertxd ("         Reading CONFIG Register",cr,lf)

 Sertxd ("------------------------------------------------------",cr,lf)

 Sertxd (" cfg.msb = ",#cfg.msb,"               cfg.lsb = ",#cfg.lsb,cr,lf,cr,lf)

 

 b0=cfg.msb

 SerTxd( " cfg.msb = ", #bit7,"-", #bit6, #bit5, #bit4,"-", #bit3, #bit2, #bit1,"-", #bit0," " )

 

 b0=cfg.lsb

 SerTxd( "     cfg.lsb = ", #bit7, #bit6, #bit5,"-", #bit4,"-", #bit3,"-", #bit2,"-", #bit1, #bit0, CR, LF )

 Sertxd ("             MUX PGA MODE             DR  Comparators",cr,lf)

 Sertxd ("------------------------------------------------------",cr,lf)

 Sertxd ("         Reading CONVERSION Register",cr,lf)

 Sertxd ("------------------------------------------------------",cr,lf)

 Pause 2000

Return

'---------------------------------------------------------------------

 Résultats affichés à la console:

   

                   On peut remarquer la stabilité des mesures.

 

 

 

 

 http://extremetracking.com/open?login=rglalpmn

 
[ Electronique ]
Copyright © Roger LEGAT - 2008 - Tous Droits réservés - (Thds V2)