Go Down

Topic: Soucis avec LM35 (Read 3961 times) previous topic - next topic

lgjean

Bonjour le Arduinautes

Tout d'abord j'ai fait une recherche sur mon problème, et j'ai bien trouvé un topic d'une personne (masterbalby) qui a eu le même soucis que moi, à savoir des écarts impressionnant de T°, chez moi ça saute de +/- 20°. J'ai essayé ce qui était proposé, voici le fil en question :
http://forum.arduino.cc/index.php?topic=33707.0

Le problème semble avoir été résolu puisque la personne n'a plus répondu (ou a laissé tombé).

Donc je relance le débat. J'utilise donc un LM35D en SO8 sur trois simple fil non blindé. Quand je mesure au voltmètre, la tension est très stable mais sur mon LCD c'est la grosse panique ! J'utilise le même code (tout en float, SensorVoltage = 5v) :

  SensorValue = analogRead(SensorPin); // lit la valeur du LM35
  CalcTemp = (SensorValue * SensorVoltage) / 1024.0; // convertir en T°
  CurrentTemp = CalcTemp * 100;
  delay(300);


  // Affichage des données du capteur
  byte current = CurrentTemp; // convertion de float -> byte
  lcd.print(current); // affiche la valeur lue

Une idée ? J'ai l'impression que l'ADC perds les pédales, un soucis d'impédence ou autre ?
Mettre les autres entrée analogique à la masse ??

Si vous avez des idées je suis preneur !

Merci à vous !

Jean

B@tto

A mon avis c'est plus un problème de cast que d'ADC. Quand je lis :

Code: [Select]

  // Affichage des données du capteur
  byte current = CurrentTemp; // convertion de float -> byte
  lcd.print(current); // affiche la valeur lue


Je me dis que ce genre de problème n'a pas était pris en compte xD il faut utiliser la fonction byte() pour faire une réelle conversion.

Il faut toujours prendre en compte le typage des variables, et ce, même à l'intérieur d'un calcul (valeur "temporaire" pas plus grand que le type de variable.

lcd.print(CurrentTemp) donne quoi ?
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

lgjean

#2
May 31, 2013, 10:24 am Last Edit: May 31, 2013, 10:25 am by lgjean Reason: 1
>> lcd.print(CurrentTemp) donne quoi ?
>

Je viens d'essayer, c'est pareil, sauf que j'ai une virgule bien entendu

Artouste


>> lcd.print(CurrentTemp) donne quoi ?
>

Je viens d'essayer, c'est pareil, sauf que j'ai une virgule bien entendu

bonjour
tu a lu ça ?
http://forum.arduino.cc/index.php?topic=168391.msg1253279#msg1253279

lgjean



>> lcd.print(CurrentTemp) donne quoi ?
>

Je viens d'essayer, c'est pareil, sauf que j'ai une virgule bien entendu

bonjour
tu a lu ça ?
http://forum.arduino.cc/index.php?topic=168391.msg1253279#msg1253279


Très instructif ! J'ai donc mis la masse de mon LCD directement sur la masse de l'alimentation (l'arrivée 9v) et la masse de mon capteur au plus près des entrée de l'ADC (tout seul donc). C'est pareil. J'ai essayé aussi de mettre la masse du capteur sur l'alimentation (masse en étoile ?) toujours pareil.

Sur le fil le gars écrit :
"La mesure peut aussi être perturbée par l'activité du micro-contoleur -> voir la datasheet Atmel du micro, c'est largement expliqué. Un micro-controleur universel, comme ceux qui équipent les cartes Arduino, ne peut pas donner la même précision qu'un circuit spécialisé qui ne fait qu'une chose mais la fait bien."

Ca veut dire qu'on arrive à la limite de précision de la carte ? J'ai vraiment besoin d'une précision au degré près et surtout très stable.
J'ai des MAX192 (que j'ai déjà utilisé avec succès sur uC 8051) je vais devoir passer par là ?
Je suppose qu'il n'y a pas de LIB sur la communication SPI, je sent qu' il va falloir que je ressorte mes vielles bibliothèques C  =(


Artouste



Très instructif ! J'ai donc mis la masse de mon LCD directement sur la masse de l'alimentation (l'arrivée 9v) et la masse de mon capteur au plus près des entrée de l'ADC (tout seul donc). C'est pareil. J'ai essayé aussi de mettre la masse du capteur sur l'alimentation (masse en étoile ?) toujours pareil.

Sur le fil le gars écrit :
"La mesure peut aussi être perturbée par l'activité du micro-contoleur -> voir la datasheet Atmel du micro, c'est largement expliqué. Un micro-controleur universel, comme ceux qui équipent les cartes Arduino, ne peut pas donner la même précision qu'un circuit spécialisé qui ne fait qu'une chose mais la fait bien."

Ca veut dire qu'on arrive à la limite de précision de la carte ? J'ai vraiment besoin d'une précision au degré près et surtout très stable.
J'ai des MAX192 (que j'ai déjà utilisé avec succès sur uC 8051) je vais devoir passer par là ?
Je suppose qu'il n'y a pas de LIB sur la communication SPI, je sent qu' il va falloir que je ressorte mes vielles bibliothèques C  =(



il y a une lib spi arduino
http://arduino.cc/en/Reference/SPI
mais sauf si tu a du stock c'est peut etre plus simple de passer par un capteur de T° "numerique" , il en existe en 1Wire,spi,I2c

68tjs

#6
May 31, 2013, 12:14 pm Last Edit: May 31, 2013, 12:47 pm by 68tjs Reason: 1
Quote
Sur le fil le gars écrit :

Le "gars" répond  :smiley-mr-green:

Remarque préalable :
Des utilisateurs arrivent a faire des mesures correctes donc c'est possible : il faut être précautionneux.
Les limites dont j'ai parlé c'est dans le cas où on veut faire un instrument de laboratoire.
Bien que je défende ce pauvre circuit affublé de tous les maux, il est vrai que sa mise en œuvre supporte mal les long fils qu'un DS18B20 supporte beaucoup mieux.

Commentaires :
Il y a des "choses" a connaître et ces "choses" ne se trouvent que dans la datasheet.
1) Dans le micro-controleur il n'y a QU'UN SEUL convertisseur analogique digital.
Ce convertisseur est précédé d'un multiplexeur 11 entrées : oui 11 pas 8 ni 6.
On trouve les 6 entrées analogiques disponibles sur une UNO avec un boîtier DIP , les 2 entrées supplémentaires qui ne sont sorties que dans le boîtier CMS (carte miniPro). On trouve aussi l'accès à un capteur de température interne à la puce, la masse : ben oui la masse, et ce qu'on appelle le "BandGap" qui sert à construire la référence interne. (page 251 de la spec de l'ATMega328). Donc cela fait du monde et il faut faire attention de ne pas perturber.
C'est "légèrement" plus complexe que ce que l'on trouve sur le site Arduino.

2) Les entrées analogiques peuvent aussi être dirigées vers un port numérique et deux des entrées analogiques sont de plus raccordées à l'électronique interne qui gère le port I2C. (page 5)

Donc quand on sait cela :
Pendant qu'on fait une conversion analogique/numérique on évite d'utiliser une ou plusieurs entrées comprises entre  A0 à A5 en entrées numériques . Si on y est obligé on utilise A4 ou A5 qui "par construction dans la puce" sont mieux isolées.


Câblage : utiliser des fils de masse de diamètre suffisant et souder les connections. Les "breadboard" en fakir -1 et les fils à connectique Dupont associés ne font pas des contacts sûrs et qui dit mauvais contact dit chute de tension de quelques mV soit au hasard quelques degrés


Le danger des bibliothèques toutes faites c'est que même pour des applications aussi triviales on perd le contact avec le matériel.
Un analogRead(Ax) renvoi un nombre compris entre 0 et 1024.
La valeur de la tension est obtenu en faisant une règle de trois :
Imaginons que le chiffre renvoyé soir 324
Vmesurée = (Vref/1024) * 324
Ce n'est pas plus compliqué que cela.

Tout de suite se pose la question du choix de Vref et du pas de mesure.
Par défaut Vref est égal à Vcc donc le pas de mesure est de 5mV soit 0,5 °C.
Il existe deux possibilités de changer cette référence : soit appliquer une tension sur la broche Aref soit utiliser la référence interne de 1,1 V.
A 100°C le LM35 délivre 1V donc la ref interne peut être utilisée.
La tension interne 1,1V peut être sélectionnée avec analogReference(INTERNAL) -> voir site arduino
Ce qui donne un pas d'environ 1 mV soit 0,1 °C c'est déjà mieux.
Attention cette tension selon le lot de fabrication peut varier de +/-0,1V. Il est facile d'étalonner le micro dont tu dispose : quand Vref est activée on retrouve cette tension sur la broche Aref, par exemple sur ma carte j'ai mesuré 1,08V.
Tu peux alors calibrer : Vmesure = (1,08V/1024) * mesure.
Attention de chez Attention quand Vref interne est activée il ne faut surtout pas appliquer de tension sur Aref sinon le micro est mort.

pouic13

Es que ton lm35 est monté seul de chez seul ou bien avec d'autres composants?

lgjean


Es que ton lm35 est monté seul de chez seul ou bien avec d'autres composants?


Le LM35 est sur A0, rien sur les autres entrées. Sinon il y a un afficheur LCD sur les PIN 2,3,4,5,11,12
Absolument rien d'autre.

68tjs

Je viens de tout relire et je crois que j'ai sauté des étapes indispensables :

Reprenons depuis le début :
- la mesure au voltmètre est stable
- l'affichage sur le LCD est incohérent

ET entre les deux ?
Ca vient de l'acquisition ou du "système LCD" ?
As-tu vérifié que l'acquisition est correcte ?

Un moyen simple:
1) tu vire la bibliothèque
2) Tu fais des acquisitions à intervalle régulier par exemple 1s  -> mesure=analogRead(A0);
3) Tu affiche dans le Serial Monitor le résultat des acquisitions. -> Serial.println(mesure);

Ce n'est même pas utile de convertir la mesure en degrés, un simple affichage du résultat renvoyé par analogRead(A0) suffit pour vérifier si la mesure est stable.

Une fois que tu as fais cela on avise selon les résultats trouvés.

lgjean

Alors j'ai tout viré dans le programme et sur la platine (hormis le capteur), reste plus que ça dans le programme :

// capteur LM35
unsigned int SensorPin = A0; // On déclare la pin du LM35 sur la broche A0
float mesure;

void setup()
{
Serial.begin(9600);
}


void loop()
{
mesure=analogRead(A0);
delay(1000);
Serial.println(mesure);

}



Résultat :

20.00
58.00
31.00
45.00
46.00
47.00
46.00
52.00
47.00
47.00
44.00
44.00
45.00
19.00
77.00
33.00
44.00
44.00
47.00
47.00
46.00
50.00
44.00
43.00
78.00
51.00
60.00
47.00
47.00
47.00
51.00
51.00
42.00
49.00
20.00
4.00
46.00
47.00
47.00
40.00
45.00
48.00
45.00
48.00
45.00
47.00
47.00


Au voltmètre j'ai 246,5 mV très stable pratiquement aucune variation, juste rarement un chiffre après la virgule

pouic13

as-tu essayé de rajouter une résistance de pull down de 10K entre t'as pin A0 et t'as masse?

lgjean

Avec la 10k :
49.00
49.00
50.00
49.00
49.00
50.00
50.00
50.00
50.00
48.00
43.00
48.00
49.00
48.00
49.00
49.00
50.00
49.00
51.00
47.00
48.00
50.00
48.00
48.00
48.00
47.00
51.00
47.00
48.00
49.00
42.00
0.00
47.00
45.00
44.00
47.00
47.00
47.00
49.00
38.00
38.00

pouic13

on dirait que t'as un problème de connectique.

C'est un module que tu as acheté ou c'est toi qui as soudé ton composant?

Regarde aussi que tu es les mêmes valeurs sur les autres pin analogique.


lgjean

C'est un SO8 que j'ai soudé et enduit au pistolet à colle. De ce coté ça ne bouge pas.

J'ai un poil de jeu sur mes SIL coté Arduino, je vais voir ça.

Sinon je vais appliquer une faible tension sur une entrée pour voir.

Merci pour ces pistes en tout cas !

Go Up