Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Commentez, partagez et proposez des Tutos en langage C !
Capteur de température analogique : MCP9701 A
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » sam. 15 juil. 2017 10:12

Bonjour à tous,


Je vous propose de voir ici un capteur de température analogique : le MCP9701A !


Configuration :
EasyPIC7.jpg

- Capteur de température :MCP9701A

- Carte de développement : Plaque EasyPIC V7
- Compilateur : Mikro prog suite fo PIC V 2.51
- IDE : MikroC Pro for PIC Version 7.1.0
- PIC : PIC18F46K22


Pré-requis :

- Savoir afficher des infos sur un LCD ( tuto à venir).
- Utiliser le convertisseur analogique/numérique de son PIC : Lien vers tuto

Le but :

Le but sera ici d'apprendre à utiliser un capteur de température analogique et de le "faire parler".

En vue par exemple, de faire un thermomètre en affichant la température sur un écran LCD, une surveillance de température pour la charge de batterie, une régulation en température d'un aquarium etc .... Tout ce qui touche à la chaleur en gros.
On peut envisager de très nombreuses applications.


1/ Préambule:

Ce genre de capteur n'est pas ce qui ce fait de plus précis, mais ils sont plutôt fiables.
Il en existe de nombreux types dans cette catégorie, et leurs fonctionnements est toujours quasiment identique. On peut citer parmi les plus connus en analogique : Le LM35 et ses dérivés , MAX66xx et ses dérivés ... etc..
Pour la précision, rien ne nous empêchera de les "étalonner" en tronquant légèrement les valeurs de conversions. A condition de posséder une référence assez précise cela va de soi.

Les points clés à regarder sont :

  • La tension d'alimentation suivant votre montage. Dans ce Tutoriel la tension d'alimentation sera de 5V. Ce qui rentre dans les caractéristiques du MCP9701A
  • La plage de température désirée. ici avec le MCP 9701 A elle s'étend de -40°C à +125°C
  • La précision souhaitée . Le MCP 9701A à une précision de plus ou moins 2 degrés.

2/ Le capteur MCP9701A :
Courbe de temperature.jpg

Essayons de décortiquer la Data-Sheet (DS ) de ce capteur.

idea ! Ce capteur est du genre Linéaire .
Cela signifie que sa courbe de réponse est une droite (ou presque). La sortie analogique du capteur est proportionnelle à la température. Il suffit donc de mesurer la tension en sortie du capteur pour en déduire la température (après quelques calculs quand même !) :langue: .
Cela simplifie grandement les calculs et la compréhension.

La Data-Sheet nous dit également qu'a 0°C le capteur sort 400mV (Fig 2.10 page 5). Cela nous permet d'avoir des températures négatives si on est en dessous de 400mV . :wink: Cette information est importante pour bien comprendre la conversion, car il va s'agir ici d'un Offset.

Une autre info importante c'est le coefficient de la fameuse droite. En page 2 de la DS on voit 19.5mV/°C . Il faut comprendre ici que pour un degré supplémentaire mesuré par le capteur, celui-ci va augmenter la tension de sortie de 19.5mV.
Donc si a 0°C on à 400mV , si vous me suivez : à 1°C on aura 400 + 19.5 = 419.5mV .


3/ Le fonctionnement :

Maintenant que nous avons fait le tour des critères , rentrons dans le vif du sujet .

Attention!! Si la conversion analogique ne vous dit rien , je vous invite à lire ce tutoriel avant toute chose.

Pour résumé :
Notre capteur MCP9701A nous envoie une tension en fonction de la température.

Notre PIC utilisera le convertisseur analogique/numérique classique donc sur 10 bits. Donc la tension lue prendra une valeur entre 0 et 1024.
Comme on fait les choses simplement ici, les références de l'ADC seront entre 0V et 5V.
cela nous fait une résolution de 5 / 1024 = 0.00488 V/bit soit 4.88mV/bit.

il va nous falloir convertir cette valeur stockée, en degré Celsius pour connaitre la température et ensuite pouvoir l'affichée.

EN page 8 de la Data-Sheet On retrouve la formule qui va bien.
Formule.jpg


Ce qui nous donne : T°C amb = (Vout/Coef) - Tension à 0°C

Avant de pouvoir calculé la température ambiante, il nous faut déterminer Vout. Car Vout est une tension et nous on à l'image de la tension représentée par une valeur numérique entre 0 et 1024. Pour retrouver la valeur de notre tension il va falloir convertir cette valeur numérique en la multipliant par la résolution de notre PIC .
Si notre PIC nous renvoie 1024 comme valeur lue sur la broche RE1, j'aurais donc 1024 * 4.88 = 5000mV soit 5V qui arrive sur la broche.

Notre formule se transforme en :
T°Camb = ( (VNumx4.88) - Tension à 0°C ) / Coefficient

Et voila !

Concrètement voila ce que cela donne en Programme . Je suis allé au plus simple. Aucune fioriture, aucune amélioration , brut de décoffrage mais simple et efficace. :-D

Code : Tout sélectionner

/*
 * Tutoriel pour FantasPic.fr
   Mesure de température avec un capteur MCP 9701A

 * Description:
      Affichage de la temperature issu d'un MCP9701 sur le LCD
      
 *  configuration:
     MCU:             PIC18F46K22
                      http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
                      
     Carte:           Easypic7
                      http://www.mikroe.com/easypic/
     
     Oscillateur:      HS-PLL 32.0000 MHz, 8.0000 MHz Crystal
     
     Capteur de T°c:  MCP 9701
                      http://ww1.microchip.com/downloads/en/DeviceDoc/20001942G.pdf
                      
     Compilateur:     mikroC PRO for PIC 7.1.0
                      http://www.mikroe.com/mikroc/pic/
*/

// Connexion du module LCD
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;

sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
// Fin de connexion du module LCD

float temperature;     // Création d'une variable flottante pour stocker la température
char text[15];         // Création d'une chaine de caractère pour stocker le texte à afficher

/*#################################################################################################
##############################     PROGRAMME PRINCIPAL     ########################################
#################################################################################################*/
void main() {

  // Configuration des I/O           -----------------------------------------------
  ANSELB = 0;                        // Configure le PORTB en digital pour le LCD
  ANSELE = 0b00000010;               // Place la broche RE1 en Analogique pour la lecture de la tension issu du capteur
  TRISE  = 0b00000010;               // Configure RE1 en entrée
  
  
  ADC_Init
();                        // Initialisation de l'ADC
  
  Lcd_Init
();                        // Initialisation du LCD
  Lcd_Cmd(_LCD_CLEAR);               // On efface l'écran
  Lcd_Cmd(_LCD_CURSOR_OFF);          // On arrête le clignotement du curseur

  Lcd_Out(1, 1, "temp =       C");   // Texte de fond
  Lcd_Chr(1,13,178);                 // Rajoute le petit signe "°"

//----------------     BOUCLE INFINIE ----------------------------
  while(1) {
    temperature = ADC_Get_Sample(6);     // On lit et stocke la valeur analogique lue sure RE1
                                         // RE1 correspond à AN6 d’après la DS

    temperature = temperature * 4.88 ;   // Conversion de la valeur lue en Millivolts
    temperature = temperature - 400 ;    // je retire l'offset pour zéro degré.
    temperature = temperature / 19.5;    // Et enfin je divise par la résolution donnée dans la DS

    FloatToStr(temperature, text);       // On convertit le Flottant en string pour l'afficher
    text[4] = 0;                         // On coupe la chaine de caractère à 4 valeurs
                                         // Cela revient à arrondir à un chiffre après la virgule
    
    Lcd_Out
(1,8,text);                   // J'affiche la température sur mon LCD
    Delay_ms(1000);                      // Je fais une pause

  }


4/ Les améliorations:

Bien entendu, ce tutoriel est plutôt succinct , c'est voulu !
Ce capteur est plutôt facile d'emploi, pas besoin de grandes proses. Toutefois plusieurs améliorations substantiels peuvent être faites.
Comme par exemple , faire une moyenne des mesures , ou encore diminuer la tension de référence pour améliorer la lecture ADC, mais le Forum est là pour toutes vos questions ! :wink:



5/ Le schéma :
schema.png



6/ Vidéo de démonstration :
http://www.dailymotion.com/video/x5tmed8


Attention!! Comme d'habitude, pour apportés des corrections, astuces, des commentaires encourageant etc .... à la suite de ce post, sinon on vous attends sur le Forum.
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Capteur de température MCP9701 A
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2585
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » dim. 16 juil. 2017 01:38

Bonjour Jérémy, et bonjour a tous,

:bravo: magnifique tutoriel, très bien documenté, présentation agréable, explication très bien faite, bon venom
va pouvoir utiliser ta source, l'avantage du LCD c'est qu'il n'y a pas besoin de le rafraichir, il garde son état temps qu'on réécrit
pas, ça laisse le temps de faire faire autre chose au microcontrôleur.

Les afficheurs sont plus problématique, il faut les rafraichir tout le temps, quand on fait une conception, il faut y pensée ça
peut évité d'avoir des problèmes. :wink:

A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Capteur de température MCP9701 A
venom
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 953
Âge : 38
Enregistré en : avril 2016
Localisation : Klyntar
Contact :

#3 Message par venom » dim. 16 juil. 2017 21:17

Bonjour,

Merci Jérémy pour cet excellent tuto :bravo: qui j’espère va m'aidé pour mon projet. Je ne sais pas si c'est moi qui ta inspiré. Mais en tout cas ça tombe a pic. :sifflotte:

Merci pour ton savoir et partage. Ainsi qu'aux autres






@++
Mon site web
Mon discord : venom#4888

Capteur de température analogique : MCP9701 A
chacha
Membre
Membre
Messages : 1
Enregistré en : mars 2017

#4 Message par chacha » dim. 11 août 2019 19:40

Bonjour s'il te plait comment trouver tu le coefficient =19.5 au niveau de la conversion

Capteur de température analogique : MCP9701 A
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » dim. 11 août 2019 23:23

chacha a écrit :Source du message Bonjour s'il te plait comment trouver tu le coefficient =19.5 au niveau de la conversion

Bonsoir chacha, C'est écrit dans le tuto. On trouve ce coefficient en page 2 de la DS. Dans le tablerau "DC electrical charactéristics" Temperature coefficiant 19.5mV/°C
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités