Sections > Vos projets et Montages d'Électronique

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

(1/2) > >>

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:
Bonjour olibou, et tout le forum,



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

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:
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:
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 :

--- 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);
       
 
}
}

--- Fin du code ---

Encore merci!

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique