Mesures Analogiques ...

Salut à tous,

Je suis devant un petit problème que j'ai du mal à comprendre ...

J'ai réalisé un petit montage qui me permet de récupérer les températures moteurs et variateurs ainsi que la tension de la batterie d'un modèle réduit de bateau. Ces informations sont ensuite envoyées via un XBEE sur mon smartphone.

Ci joint, le schéma du montage.
En clair, j'ai des capteurs de température LM35DZ que je branche sur les ports A0, A1, A2, A3
La tension des batteries étant de 45V environ, je la réduit grâce à un pont diviseur de tension. Ne vous focalisez pas sur le calcul de la tension dans le code, je ne suis pas encore arrivé à ce stade, il doit pas être juste.
Ces ponts sont branchés sur A4 et A5.

Mon problème, tant que je ne branche pas le 45V sur ma carte, la valeur des températures est bonne.
Si je le branche alors la température sur le port A0 change ... elle passe de 20° à 40, retombe à 30 puis 20 etc ...
Si je débranche le 45V je me retrouve avec une tension de 0,6V sur le bornier qui récupère le 45V !!! Je ne comprend pas pourquoi. La température mesurée sur A1 elle ne bouge pas et est bonne. J'ai modifié le code pour brancher le capteur de A0 sur A2 et ... même problème ...

N’étant pas électronicien, je ne suis pas sur que mon montage soit bon, même si il est assez simple !

Pouvez vous, s'il vous plait jeter un coup d’œil et me dire si ce que j'ai fait est déconnant ou pas ?

voici le code :

//Déclaration et initialisation des variables
  float mesure1=0;        //Variable pour le stockage mesure retournée par le capteur de temperature
  float mesure2=0;
  float mesure3=0;        //Variable pour le stockage mesure retournée par le capteur de tension
  
  int portana0 = 0;      //Numéro du port analogique sur lequel la température est mesurée
  int portana1 = 1;
  int portana4 = 5;

  
  int temp1=0;          //Variable pour le stockage de la température (Sans décimales)
  int temp2=0;
  int voltage1=0;
  
//Traitements initialisation
  void setup()
  {
    analogReference(INTERNAL); //Permet de fixer la temperature de refernce à 1,1 volt
    Serial1.begin(9600);        //initialisation de la liaison série à 9 600 bauds
  }

//Traitements itératifs
  void loop()
  {
    mesure1 = analogRead(portana0);    //Lecture de la valeur fournie par le capteur de température 1
    mesure1 = mesure1 * 2.56 / 1024;   //Conversion en tension (en volt)
    mesure1 = mesure1 * 100;           //Conversion en température (en degré Celsius)
    
    mesure2 = analogRead(portana1);    //Lecture de la valeur fournie par le capteur de température 2
    mesure2 = mesure2 * 2.56 / 1024;   //Conversion en tension (en volt)
    mesure2 = mesure2 * 100;           //Conversion en température (en degré Celsius)
    
    mesure3 = analogRead(portana4);    //Lecture de la valeur fournie par le capteur de température 1
    mesure3 = mesure3 * 2.56 / 1024;   //Conversion en tension (en volt)
    mesure3 = mesure3 * 7.58;          //Non Conversion de la tension en tension ;D, coef de 7.58 pour recuperer la tension du pack depuis celle du pont diviseur.
    mesure3 = mesure3 * 10;            //Pour garder sur le smartphone la décimale et augmenter la précision de la tension de chaque element.

 
    temp1 = (int) mesure1;             // Suppression des décimales de la valeur de la temperature
    temp2 = (int) mesure2;             // Suppression des décimales de la valeur de la temperature 
    voltage1 = (int) mesure3;          // Suppression des décimales de la valeur de la temperature
    
    //Envoi de la tension et des températures au PC par la liaison série pour affichage dans la console        
    Serial1.print("T1"); 
    if (temp1 < 100)
      Serial1.print("0");
    if (temp1 < 10)
      Serial1.print("0");      
    Serial1.print (temp1); 
    
      
    Serial1.print("T2"); 
    if (temp2 < 100)
      Serial1.print("0");
    if (temp2 < 10)
      Serial1.print("0");      
    Serial1.print (temp2); 
 
 
    Serial1.print("V1");
    if (voltage1 < 100)
      Serial1.print("0");
    if (voltage1 < 10)
      Serial1.print("0");
    Serial1.print (voltage1);
    


    //Attente de 2 secondes avant de faire une nouvelle mesure
    delay(2000);                    
  }

En vous remerciant,

JC

loops:
N’étant pas électronicien, je ne suis pas sur que mon montage soit bon, même si il est assez simple !

Bonjour, et bienvenue dans les subtilités de l'électronique.
Première chose à apprendre : un fil de cuivre c'est résistif. Oh la résistance est toute, toute, petiote mais elle est bien là.
Dans la grande majorité des cas on s'en fiche et on la considère allégement égale à 0.
Sauf que là pas de chance tu es dans un rare cas où cela intervient.

Le LM35 délivre 10 mV par degrès. 10 mV c'est tout petit aussi il faut faire attention à ne pas polluer la liaison entre le LM35 et la carte Arduino.

Recommence ton câblage en étant certain que la masse (0V) du LM35 ne sert qu'au LM35, rien qu'à lui.
D'une manière générale quand on utilise de la puissance il faut relier les masses en étoile.

  • Le centre de l'étoile c'est la carte arduino.
  • Les rayons sont les connexions de masse -> un rayon par composant.

Il ne faut jamais passer en relais d'un composant à un autre pour rejoindre la carte Arduino.
Toujours tout ramener au centre de l'étoile.

Calcul des résistances du pont diviseur sur le 45 V -> si tu n'en as pas déjà achète vite fait un multimètre dans la première grande surface de bricolage (à moins de 10 € ils sont largement suffisant) et vérifie les tensions avant de brancher : dis toi bien que les plus expérimentés d'entre nous ne pratiquent pas autrement, une ânerie de câblage est tellement vite arrivée.

Edit : et torsade les fils du Lm35 pour éviter de capter plein de saloperies.

Merci pour cette réponse !!!

Il ne faut jamais passer en relais d'un composant à un autre pour rejoindre la carte Arduino.
Toujours tout ramener au centre de l'étoile.

Quant tu dis ça, tu parles du câblage uniquement ou aussi des pistes sur la carte qui supporte l'Arduino et le XBEE ?

Calcul des résistances du pont diviseur sur le 45 V -> si tu n'en as pas déjà achète vite fait un multimètre dans la première grande surface de bricolage (à moins de 10 € ils sont largement suffisant) et vérifie les tensions avant de brancher : dis toi bien que les plus expérimentés d'entre nous ne pratiquent pas autrement, une ânerie de câblage est tellement vite arrivée.

Pas de soucis de ce coté la, ca a été contrôlé avant de monter l'Arduino ! ;D

Edit : et torsade les fils du Lm35 pour éviter de capter plein de saloperies.

Je vais suivre ce conseil, les câbles qui relient l'Arduino aux capteurs sont des câbles "triples" qui servent aux rallonges de servos ... Ils passent près du moteur brushless et du controleur qui consomme environs 200A dans les pire moments ... je pense que les parasites doivent être présent !

screenshot9.rotated.png

Je suis en train de me demander si ce choix de capteur de température est judicieux ... Vu l’environnement ...

loops:
La tension des batteries étant de 45V environ, je la réduit grâce à un pont diviseur de tension.

Un hacheur avec régulateur fait ça proprement et quasiment sans pertes.

Non :grinning: les ponts c'est pour mesurer la tension de batterie avec les entrées A4 et A5

Merci Christian pour ton info. Mais ... ça va compliquer mon montage et en plus, pour le moment, je ne sais pas comment ça fonctionne.
Le Bateau est alimenté par des batteries Li-Po. J'ai 9 éléments en série. Soit 9 X 4.2V pour la tension max.
Mon but est de mesurer la tension globale du pack pour pouvoir avoir, sur la berge, une idée de ce qu'il reste de disponible en autonomie.
Dans le code sur le smartphone je divise par 9 la tension globale du pack pour avoir la tension d'un élément, ce qui me parle plus. Pour ne pas abîmer les accus, je sais que je ne dois pas descendre en dessous de 3.2V par élément.
La consommation du bateau allant jusque 200A, la perte dans le pont diviseur est très largement négligeable.

J'ai une autre question, s'il vous plait, ne riez pas !

Les paramètres utilisables avec l'instruction analogReference(INTERNAL) sont les suivants :

  • DEFAULT : La tension de référence est de 5 volts
  • INTERNAL : La tension de référence est de 1.1 volts
  • EXTERNAL : La tension de référence est celle appliquée sur la patte AREF de l'Arduino

La tension de référence est elle la tension max que l'on peut mesurer ?

loops:
J'ai une autre question, s'il vous plait, ne riez pas !

La tension de référence est elle la tension max que l'on peut mesurer ?

bonsoir
la tension de reference ne doit pas depasser 5V (voir les max ratings)
tu peux mettre ce que tu veux comme référence de tension externe entre 0 et 5V
il existe une ref interne de 1.1V
par defaut c'est la tension d'alim de l'ATmega qui est utilisée (en theorie 5V mais ce n'est pas propre)

dans tous les cas la résolution est Vref/1024

Justement, j'ai choisi en référence la valeur INTERNAL qui donne une tension de référence de 1.1 V.
Les deux LM35DZ donnent une tension max de 1V mais la mesure de tension des batteries va monter jusque presque 5V ...

Du coup, puis-je mesurer un 5V avec un analogReference(INTERNAL); à 1.1V ?

loops:
Justement, j'ai choisi en référence la valeur INTERNAL qui donne une tension de référence de 1.1 V.
Les deux LM35DZ donnent une tension max de 1V mais la mesure de tension des batteries va monter jusque presque 5V ...

Du coup, puis-je mesurer un 5V avec un analogReference(INTERNAL); à 1.1V ?

non, ce ne sera pas destructeur , mais tout ce qui sera au dessus de 1.1V renverra 1023

OK merci !
Je dois du coup corriger ca ... Même si ce n'est peut être pas la cause de mon problème ...

loops:
OK merci !
Je dois du coup corriger ca ... Même si ce n'est peut être pas la cause de mon problème ...

dans l'absolue theorie , le mieux est de faire coller une amplitude max sur une AREF externe juste un peu au dessus du max.
J'avais fait des essais avec un DAC 12 bits (avec sa propre Vref) comme Aref , c’était vraiment pour voir :grin: , la gestion des AREF fonction des capteurs était quand meme un peu usine à gaz 8)

La tension de référence est elle la tension max que l'on peut mesurer ?

Petite subtilité de la référence à 1,1 V.
Dans la datasheet elle est donnée à 1,1 V +/- 10 %.
Pour mesurer une température avec un LM35 ce n'est pas terrible mais ce n'est pas pas perdu pour autant.

La datasheet dit aussi que quand la ref interne est sélectionnée on retrouve sa tension sur la broche Aref.
Avec un voltmètre il est possible de mesurer sa valeur exacte pour le micro et en tenir compte dans le programme.

Attention la datasheet dit aussi (elle est très bavarde) qu'avec la référence interne sélectionnée si on applique une tension sur Aref on tue le micro.
Donc pas question de commuter entre Vref_interne et 3,3V sur Aref. de choisir V-ref_int alors que du 3,3V est présent sur Aref.
Par contre une commutation entre Vref_defaut (5V) et Vref_interne est parfaitement possible.

Encore une chose que dit la datasheet : la première mesure effectuée après un changement "matériel" à l'intérieur de la partie ADC du micro est fausse.
Un changement "matériel" à l'intérieur de la partie ADC du micro c'est :

  • un changement de référence
  • un changement d'entrée

Donc chaque fois que tu changes d'entrée A0, A1, A2, A3 etc il faut à chaque fois faire deux acquisitions et toujours jeter la première.

Donc chaque fois que tu changes d'entrée A0, A1, A2, A3 etc il faut à chaque fois faire deux acquisitions et toujours jeter la première.

C'est bon a savoir !!! Merci !

Petite subtilité de la référence à 1,1 V.
Dans la datasheet elle est donnée à 1,1 V +/- 10 %.
Pour mesurer une température avec un LM35 ce n'est pas terrible mais ce n'est pas pas perdu pour autant.

Tu penses qu'il vaut mieux le faire avec une vref à 5V ?

Mon besoin, en rapport avec la précision : Une température normale n'exèdera pas 50° Un moteur lâchera en approchant les 100°
Je ne suis donc pas à 1 ou 2 ° près sur les mesures !

Tu penses qu'il vaut mieux le faire avec une vref à 5V ?

Oh moi je ne pense rien :grin:
Je te donne des informations après tu vois d'après tes besoins.
Si effectivement la précision avec Vref à VDD te conviens moins il y aura de manipulation, plus le programme sera simple et plus il aura de chance de fonctionner proprement. Un viel adage dit "le mieux est l'ennemi du bien "

Un point que j'ai oublié pour les LM35 : la longueur des fils de connexion.
C'est un défaut général des circuits CMOS, le LM35 en fait parti, ils ne supportent absolument pas d'être raccordé à des lignes capacitives, ce n'est pas spécifique au LM35 c'est général. Une grande longueur de fil présente un effet capacitif.
Quand on véhicule des signaux de 5V d'amplitude le défaut existe mais ne se manifeste pas, par contre là tu titille le mV et c'est sensible.

Une solution est donnée dans la datasheet du LM35 : il faut mettre une résistance en série directement sur la sortie du LM35. Le fabricant préconise 2,2Kohms, perso j'ai obtenu de meilleurs résultats avec 4,7 kohms mais la valeur n'est pas critique, 10 k par contre c'est trop fort..

PS : j'espère que tu as compris la leçon : lire les datasheets.
Tous les conseils que je peux donner je les ai découvert suite à la lecture des datasheets.

Merci beaucoup pour ces infos ...
Comme souvent, on en vient au même constat ... RTFM !!! ;D

Merci encore, je vais essayer tout ça ! ;D