Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal

mesure de resisitance d'une sonde PT100 avec un PIC 16F877A

Démarré par olibou, Avril 15, 2020, 05:26:34 PM

« précédent - suivant »

olibou

Bonjour,

J'essaie de mesurer une température à  partir d'une sonde PT100 (2 fils) avec un PIC 6F877A.
Comme la sonde varie en résistance en fonction de la température, j'ai pensé faire un pont diviseur de tension pour mesurer la variation de tension avec le convertisseur analogique/numérique. Mon problème, c'est que mes cours de math sont un peu loin et je ne sais pas comment extraire la valeur de ma résistance (R1) à  partir de la mesure de tension faite par le convertisseur A/N sur le pont diviseur.
Pour être concret, ma sonde (R1) varie entre 100 et 200 ohm environ, je pense mettre une résistance (R2) dans les mêmes valeurs (disons 100 ohm) sur mon pont diviseur. La tension obtenue (Vs) sera donc Vs=(R1/(R1+R2)*Vin
je connais Vs car lu sur le convertisseur A/N, je connais R2(100 ohm) et Vin (5v)... Est-il possible d'en déduire R1?

Amicalement,

Olivier

papyblue

Bonjour Olivier,

Il est bien sûr possible de trouver R1 puisque c'est la seule inconnue de l'équation.
En supposant que R1 est reliée à  la masse (ce qui n'est pas précisé) R1 vaut : R2 x(Vs/Vin-Vs).
Il vaut mieux pour une meilleure précision utiliser une plaquette de type MAX31865.

PB

Curiosus

#2
Bonjour olibou, et tout le forum,


CitationÉcrit par olibou :  J'essaie de mesurer une température à  partir d'une sonde PT100 (2 fils) avec un PIC16F877A.

Si tu n'a pas d'ampli, c'est mission impossible avec la sonde Pt100, et même avec le pont de Wheatstone

Sur ta sonde Pt100 il faut éviter de dépasser 2 mA., elle doit faire 100 ohms à   0 °C

Ton convertisseur analogique sur ton Pic16F877A c'est 1023 pas, supposons que tu utilises une tension de référence de 5 volts, ça te fait

5 volts /1023 pas = 0,004887 volts pour 1 pas

Maintenant si tu mets une résistance 100 fois plus forte ça te donne  10 kΩ

10000 Ω + 100 Ω = 10100 Ω

5 volts / 10100 Ω = 0,0004950

10000 Ω  X  0,0004950 = 4,950 volts

5 volts - 4,950 = 0,05 volts

Ton convertisseur analogique affichera

0,05 volts  / 0,004887 volts pour 1 pas = 10

Comme ta sonde PT100 a une variation très faible quand ll y a de la chaleur c'est impossible, même en m’étant  une résistance plus forte tu
aurais le même problème.

( 500°C = 280 Ω)  - ( 0° = 100 Ω)  = 180 Ω

Personnellement si c'est pour apprendre ok, mais si c'est pour un projet tu vas passer beaucoup de temps, crois moi sur parole.

Je suis de l'avis de papyblue, achète un MAX6675... ou en plus précis... mais plus chère un MAX31865.

 
A+



Yffig

#3
Bonjour Olibou,

Effectivement tu vas avoir du mal à  utiliser une sonde PT100 avec le convertisseur 10 bits du 877A.
Comme tu as dû acquérir des compétences sur ce µC et son ADC depuis que tu l'utilises (décembre 2019), je te recommande quelque chose de beaucoup plus simple si 0° à  100°C te conviennent(*):
Utilise un capteur LM35 en boitier TO92 ou TO220, de sensibilité 10mV/°C. Alors avec 5V et l'ADC 10 bits du PIC, tu obtiendras une précision1 de 0.5°C, que tu pourras améliorer à  0.1° en faisant la moyenne sur 4 ou 5 échantillons consécutifs.
(*) voire un peu plus selon modèle de LM35

1:Correction: Précision n'est pas le bon terme.. c'est Résolution. Pour la Précision il faudrait calibrer de 0°C (point triple de l'eau)..à  100°C (eau bouillante sous conditions de pression atmosphérique "normales") et obtenir un facteur d'échelle à  mettre dans ton code, si besoin.



Bonne journée.

Yffig

olibou

#4
Bonjour,

merci pour vos réponses!

J'avais bien pressenti que la très faible variation serait un problème... je m'étais dit qu'il y aurait certainement un moyen de régler ça avec un ampli op ou autre, dans un second temps.
Je ne l'ai pas précisé, mais vous l'avez compris, je suis novice et ce montage a bien-sûr un but d'apprentissage, mais j'ai aussi un bricolage en cours qui nécessite la mesure de températures dans des liquides sur une gamme de 0 à  100°C (brassage de bière). La LM35 n'est dont pas très approprié.

J'ai des sondes DS1820B de Dallas Semiconductor que j'ai réussi à  faire fonctionner avec un Arduino (bibliothèque fournie), mais j'aimerais réaliser mon application avec un PIC car je trouve que cela permet de vraiment mieux comprendre l'électronique.
J'ai bricolé des Arduinos assez facilement sans rien comprendre à  la manipulation de bits ni au fonctionnement d'un microcontrôleur, alors que le PIC m'a demandé des heures de lecture de datasheets et de test avant de faire quelques bidouillages de base, mais j'ai beaucoup plus progressé.

Par contre, je suis, à  mon niveau, incapable de faire fonctionner une sonde DS1820B avec un PIC. C'est pourquoi je me suis tourné vers la PT100 dont le fonctionnement m'a paru plus simple.

Si je peux vous mettre encore à  contribution... je me heurte à  un autre petit problème :
Ma sonde n'enregistre aucune variation de température et reste bloquée à  "-259.70°C", ce qui correspond à  une tension mesurée de 0V.
Apparemment, le PIC ne prends pas en compte les décimales dans les calculs, alors que je stocke les différentes valeurs dans une variable "float" (vs= tension de sortie de la PT100; resist=valeur de résistance de la sonde).

Voici mon code :
/*
* File:   PIC16F877A_Thermo.c



#include <xc.h>
#include<stdio.h>
#include<stdlib.h>
#include <pic16f877a.h>
#include "config.h"
#include "ADC_config.h"
#include "LCD_config.h"
#define _XTAL_FREQ 16000000

void main(void) {
int result=0;
float temperature=0;
float vs=0;
float resist=0;
char result_string[15];
ADC_config();
Lcd_Init();
__delay_ms(1000);
  Lcd_Clear();
  Lcd_Set_Cursor(1,1);
  TRISB=0;
  PORTB=0;
  CMCONbits.CM0=1;
  CMCONbits.CM1=1;
  CMCONbits.CM2=1;
   
  //message de demarrage-----------------------------------
        Lcd_Write_String("salut !");
       
        /*for (int n =0; n<16; n++){
            Lcd_Shift_Right();
            __delay_ms(300);
        }*/
        __delay_ms(1000);
        Lcd_Clear();
       
  //-------------------------------------------------------
   
       
       
    while(1){
       
     
     ADCON0bits.ADON=1;   
       
        if (ADCON0bits.GO_DONE==0){
        ADCON0bits.GO_DONE=1;
            while(ADCON0bits.GO_DONE==1){} // attend la fin de la conversion
            result=ADRESL+(ADRESH*256);
            vs=5*result/1023;//convertit la valeur lue en Volts
            resist=100*(vs/(5-vs));//calcul de la valeur de la résitance de la sonde à  partir de la tension
            temperature=(resist-100)/0.385055;//calcul de la température à  partir de la résitance de la sonde
        }
      if (temperature>25){
            PORTBbits.RB7=1;}
        if (temperature<=25 ) {
            PORTBbits.RB7=0;}
       
     //écrire le resultat sur écran LCD
        Lcd_Set_Cursor(1,1);
        Lcd_Write_String("Temperature : ");
        Lcd_Set_Cursor(2,1);
        sprintf(result_string, "%.2f", temperature);
        Lcd_Write_String(result_string);
        Lcd_Write_Char(223);
        Lcd_Write_String("C");
        __delay_ms(1000);
       

}
}


Encore merci!

papyblue

Bonjour,

J'aime bien la bière fraîche mais -259°C c'est trop ! ;)

PB

Yffig

#6
Re,
Je ne vois pas ce qui t'empêcherait de couler un LM35 dans un peu de résine pour isoler ton capteur d'un point de vue électrique (pas thermique, bien sûr , sachant qu'un boîtier LM35 ou DS1820. est déjà  noyé dans la résine..), à  part augmenter un peu l'inertie thermique, sauf peut être le risque de perdre un potentiel label "Agriculture Bio"...que tu envisagerais.

Sinon, utilise les solutions sonde Platine ou Thermocouple proposées par la communauté (*) (si c'est bon pour des réacteurs nucléaires, ça ne peut pas être mauvais pour ta santé  ;)

Par contre, les plans secrets de ton générateur cryogénique à  -259°C, je les veux bien pour réduire le Noise Factor de mes préamplis d'antenne... ;)

(*) ça ne sert à  rien de s'obstiner à  vouloir faire marcher une solution qui n'est pas "bonne", sinon le plaisir de la frustration...

A la tienne !

Yffig

Curiosus

#7
Bonjour olibou, et tout le forum,

CitationÉcrit par olibou : Par contre, je suis, à  mon niveau, incapable de faire fonctionner une sonde DS1820B avec un PIC.

Pour le pic je peux te donner un coup de main, mais pas en C, je pratique que ASM

Sur ton Pic, mettre une résistance de 10k entre MCLR et VDD, j'ai pas vu ça sur ton schéma.

Pour l'écran LCD, Ok... il est bien connecté, mais pour le reste, je comprends pas trop ce que tu veux faire avec ton potentiomètre, et ta résistance de 100 Ω (qui je suppose doit représenter ta PT100)
   
Ça ne doit pas varié beaucoup sur l'entré de ton convertisseur analogique.   

Pour ton projet la DS1820B est bien,  j'ai regardé vite fait la datasheet, c'est une communication de bit sur un fils.

• Mesure des températures de -55 ° C à  + 125 ° C (-67 ° F à  + 257 ° F).
• Précision de ± 0,5 ° C comprise entre -10 ° C + 85 ° C.
• Résolution programmable de 9 bits à  12 bits.
• Une seule broche pour la communication.
• Capteur de température intégré et EEPROM programmable non volatile

Obligation de mettre une résistance de 4,7k sur l'entrée du DS1820B

La résolution du capteur de température est de 9, 10, 11 ou 12 bits configurable par l'utilisateur, ce qui correspond respectivement à  des incréments de 0,5 ° C, 0.25 ° C, 0.125 ° C, et de 0,0625 ° C

La résolution par défaut au démarrage est de 12 bits.

Pour lancer une mesure de la température, le maître doit émettre un signal de commande de '44' H.

Les données thermiques résultant (du capteur) est stocké dans le registre de température de 2 octets dans la mémoire scratchpad puis le DS18B20 revient à  son état de repos.

Commande qui permet au maître de lire le contenu du scratchpad 'BE'H

Il y a une fonction alarme haut est bas sur cette sonde, mais bon pour l'instant faisant court.

::) Plus compliqué qu'il en à  l'air, malgré c'est trois pattes, celui qui a fait ça devait être alcoolier.   ;D

   A+




olibou

Merci Curiosus pour ta proposition d'aide sur la DS1820B, mais je serais incapable d'exploiter ton code en assembleur...
Je vais suivre vos conseils et m'orienter vers d'autres capteurs... pourquoi pas un LM35! Je risque d'avoir un peu de mal pour m'en faire livrer par les temps qui courent, mais je ne vais pas m'acharner sur ma PT100... Je vais m'en faire un joli collier!
Sinon, je retourne sur Arduino et je fais mon application avec la DS1820B.

A+
Olivier