Sections > Vos projets et Montages d'Électronique
mesure de resisitance d'une sonde PT100 avec un PIC 16F877A
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
[#] Page suivante
Utiliser la version classique