convertisseur adc 16 bits limité

Salut à tous,

Je cherche à mesurer une tension assez élevée du genre 65 V mais avec une définition de l’ordre du millivolt, le tous le plus simplement du monde. Et quoi de mieux qu’un convertisseur 16 bits et un petit pont diviseur !

Normalement 16 bits c’est 65535 pas soit environ 1mV par pas et donc potentiellement 65 535 mV.

Je me suis acheté un adc adafruit ADS1115 de 16 bits.

Malheureusement l’exemple fournis limite les capacité des 16 bits…

Je règle le gain à 1

ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 0.125mV

et je convertis le nombre de pas de mon ADC en volt :

valeur = (4.096/32768)*adc0;

Ce que l’on constate c’est que le nombre de pas pour obtenir l’équivalent en volt n’est qu’à la moitié de 65535 soit 32767.
Du coup je suis loin d’obtenir ma résolution de 1 mV pour 65V, je n’ai que la moitié soit 2mV pour 65V.

Je ne travail qu’en valeur positive du type “signed float” de 0 à +65V.
Mais je vois que dans l’exemple, il s’agit d’une valeur +/- d’ou je pense la division des 65535 en deux.
Une partie pour la valeur positive et pour la valeur négative.

Mes questions sont les suivantes :
Comment faire pour travailler sur la plage entière des 65535 pas.
Et si je voulais travailler sur des valeurs négatives comment coder cela ?

merci d’avance de votre aide.

#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;
 float valeur=0;
 adc0 = ads.readADC_SingleEnded(0);
// adc1 = ads.readADC_SingleEnded(1);
// adc2 = ads.readADC_SingleEnded(2);
// adc3 = ads.readADC_SingleEnded(3);
 valeur = (4.096/32768)*adc0;
 Serial.print("AIN0 : ");  Serial.print(adc0);  Serial.print(" pas, ");
 Serial.print(valeur,7);  Serial.println(" volts");
// Serial.print("AIN1: "); Serial.println(adc1);
//  Serial.print("AIN2: "); Serial.println(adc2);
// Serial.print("AIN3: "); Serial.println(adc3);
//  Serial.println(" ");
  
 delay(700);
}

C’est sur 16 bits en complément à 2… Au max vous obtiendrez 0x7FFF et au min (dans les négatif) 0x8000

le ADS1115 offre 4 entrée analogiques et deux modes de calcul:

1/ soit vous prenez les 4 entrées individuelles et mesurez la tension entre le canal d’entrée analogique (A0-A3) et la masse analogique (GND).

2/ soit vous prenez les entrées différentielles qui mesurent la différence de tension entre deux canaux d’entrée analogiques. (A0 et A1 ou A2 et A3).

Dans le premier cas, comme le ADS1115 n’accepte pas de tension négative sur ses broches, vous ne mesurez uniquement que des tensions positives et donc sans le bit de signe, vous n’obtenez qu’une résolution efficace de 15 bits → d’où vos 0 à 32767

Dans le second cas, vous obtenez la capacité de mesurer les tensions négatives et c’est là que le 16ème bit vient en ligne de compte - le range de mesure est bien de -32768 à +32767 soit une résolution effective de 16 bits, d’où le marketing…

bref - faut acheter un ADC 24 bits si vous voulez un peu mieux…

à Noter:

Utiliser une mesure différentielle offre plus d’immunité contre le bruit électromagnétique (environnement électriquement bruyant gestion de petits signaux nécessitant un gain élevé, car le gain amplifiera le bruit ainsi que le signal) - donc en pratique mettre votre signal sur A0 et GND sur A1 et lire en différentiel, c’est mieux que de ne lire que sur A0 en entrée individuelle.

Attention on ne peut pas envoyer de tension négative sur les entrées, et pas dépasser son VDD (en vrai VDD + 0.3v mais ne pas tenter le diable)

Merci pour la rapidité et surtout la qualité de votre réponse ! A le marketing grrrr@#@##. Auriez-vous un conseil ou une référence pour un adc 24 bits, souvent plus adapté à des mesures de poids ?

Les 24 bits c'est un peu de la magie noire pour les faire fonctionner à pleine précision - il faut que tout soit super clean au niveau des masses, etc mais il y a quelques années on tirait au moins 16 bits de précisions sur un ADS1252 de texas (1 canal) ou ADS1253 (4 canaux) ou ADS1256 (8 canaux) par exemple

on trouve des boards avec le ADS1256 pour 18-20 euros environ mais jamais essayé celle là (une librairie possible à tester ici)

Il y a aussi les ADS1232 (2 entrées différentielles) et ADS1234 (avec 4 entrées différentielles) qui existent sous forme de petites cartes pour moins cher et les HX711 mais oui c'est plus pour les balances dans les applications typiques

Pour information, l'Arduino DUE a un contrôleur ADC qui peut multiplexer jusqu'à 13 entrées analogiques de 0V à 3.3V et convertit sur 12 bits, ce qui fait 4096 pas pour 3.3 V soit 0.8 mv par pas (pas si mal).

Pour réduire le bruit, il est possible de mesurer des tensions différentielles (A1 - A0=Grnd par exemple), mais dans ce cas le gain est de 0.5.

La carte coûte 25 euros.

Merci encore J-M-L pour les infos, la carte 24 bits que tu as mis en liens est effectivement bien conçus : filtrage RC en entrée et très faible niveau de bruit de l'ADC... à tester!

Salut ard_mewbie, j'ai déjà un Arduino Due, c'est vrai que c'est une bonne carte et que 12 bits convient dans pas mal de cas en plus il y a même un DAC !

Mais la, je travail dans de la mesure de précision avec des fortes amplitudes, alors je vais faire appel à un marabout envoûteur de 24bits, un bon plan de masse et un câble en différentiel et ça devrait le faire :-)

J-M-L: Les 24 bits c'est un peu de la magie noire pour les faire fonctionner à pleine précision - il faut que tout soit super clean au niveau des masses.

Bonjour Un compromis entre 16 et 24 bits , utiliser un MCP3424 B@tto a pondu une librairie pour MCP3424

il existe une carte d'evaluation chez Microchip

cb28: Mais la, je travaille dans de la mesure de précision avec des fortes amplitudes, alors je vais faire appel à un marabout envoûteur de 24bits, un bon plan de masse et un câble en différentiel et ça devrait le faire :-)

oui mais comme vous n'avez pas forcément besoin des 24 bits - partir sur un 24 bits et ne tenir compte que de 16/18 bits sur les 23 (en positif) dispo c'est moins compliqué d'un point de vue design

Chacun son métier et dans le cas présent faire une carte propre pour mesurer avec les performances demandées est un sacré défi sauf à avoir une bonne expérience en la matière et des moyens humains, techniques et financiers. Laissons les pieds au niveau du sol : avoir une précision de 1 mV sur 65 V représente 15 ppm.

Je serais très surpris que les performances soient obtenues sans faire 3 ou 4 tours (au minimum) de circuit imprimé. Cerise sur le gâteau il va falloir valider les prototypes. Il y a une grosse différence entre obtenir une mesure qui affiche le mV et être certain que le mV affiché est vrai. Pour le contrôle il faudra des vrais étalons et les payer ou les louer.

Je ne connais pas le projet mais pour moi : - exiger une performance pareille c'est le résultat d'une mauvaise conception du projet. Il faudrait reprendre le projet à ses débuts pour mieux répartir les contraintes et alléger celle ci. - ou c'est juste pour détecter avec précision un sens de variation, mais dans ce cas la valeur absolue importe peu.

Il existe des gens dont c'est le métier : les fabricants d'appareils de mesure. Si j'étais à ta place avant de me lancer dans cette aventure qui va avoir un prix en heures de développeur et coût matière je consulterai du coté des fabricants de voltmètres programmables. Ce type d'appareil est maintenant commun et tu aurais un certificat de calibration.

68tjs: Chacun son métier et dans le cas présent faire une carte propre pour mesurer avec les performances demandées est un sacré défi sauf à avoir une bonne expérience en la matière et des moyens humains, techniques et financiers. .....................................

Je ne connais pas le projet mais pour moi : - exiger une performance pareille c'est le résultat d'une mauvaise conception du projet. Il faudrait reprendre le projet à ses débuts pour mieux répartir les contraintes et alléger celle ci. - ou c'est juste pour détecter avec précision un sens de variation, mais dans ce cas la valeur absolue importe peu.

Il existe des gens dont c'est le métier .......................

Bonjour,

Je souscris complètement.

Serge .D