1 Informatique Industrielle TP 5 – Microcontrôleur Capteur de Température DS182

1 Informatique Industrielle TP 5 – Microcontrôleur Capteur de Température DS1820 Thomas Quiniou et Albert Ranaivosoloarimanana Licence SPI-2 Année 2014 2 1. Objectifs Mettre en œuvre le capteur de T° DS1820 et afficher la valeur sur les afficheurs 7 segments. 2. Le capteur de température DS1820 Le capteur DS1820 est un capteur numérique qui permet la mesure de la température sur la plage de - 55 à +125°C avec un pas de 0.5°C. Il se place directement sur la platine de test Easypic7 selon le schéma ci-contre : Configuration : 1. positionner le capteur de T° sur l’emprunte TS1 (attention au sens) 2. vérifier que le jumper J11 est placé en position RE2, le déplacer si nécessaire. 3. valider les 4 afficheurs 7-segments (switch SW4) Le capteur de température DS1820 s'appuie sur le protocole one-wire pour communiquer avec le microcontrôleur et transmettre sa mesure. Comme son nom l'indique, un seul fil est nécessaire (même si plusieurs périphériques sont utilisés). La fiche technique du capteur décrit ses caractéristiques et son mode de fonctionnement. Vous pouvez la télécharger à l’adresse http://pages.univ-nc.nc/~quiniou. En raison de la simplicité d’utilisation et du large déploiement de ce capteur, les commandes pour le faire fonctionner et le contrôler ont été implémentées dans la librairie One_Wire de MikroC. Il y a au total 3 fonctions : • Ow_Reset permet d'initialiser le capteur – OW_Reset(@1 du port, n° broche) • Ow_Read permet la réception des données - OW_Read(@ du port, n° broche) • Ow_Write permet d’envoyer des commandes au capteur – OW_Write(@ du port, n° broche, code commande) Communication Le protocole de communication One_Wire permet d’utiliser plusieurs capteurs sur un même fil. Chaque capteur est alors identifié par un code sur 64-bits (ROM code). Etant donné que nous n’utilisons qu’un seul capteur ici, la procédure est simplifiée. 1 @ signifie adresse 3 Pour lire une température et l’afficher, il faut suivre les étapes suivantes : a) Envoi de la commande CONVERT_T (code Ox44) au capteur (mesure de la température) b) Envoi de la commande READ_SCRATCHPAD (code 0xBE) au capteur (placement de la température dans le buffer - ou mémoire tampon - du capteur) c) Lecture du buffer d) Affichage Remarque : avant de transmettre les commandes CONVERT_T et READ_ SCRATCHPAD, il faudra au préalable envoyer au capteur un pulse de reset (OW_Reset) puis la commande SKIP ROM (code 0xCC) pour adresser tous les capteurs sans avoir recours au code ROM d’identification (opération coûteuse). Décodage de la température A la lecture, le code renvoyé par le capteur est un code binaire sur 16 bits (les 8 premiers marquent le signe) : Avant d’afficher la température, il est donc indispensable de décoder la suite binaire. Pour cela, nous utilisons la relation donnée dans la fiche technique du capteur : Après lecture du code binaire, la variable de lecture contient donc une suite de 16 bits. Les 8 premiers (MSB) –mais 1 seul suffit- nous permettent de savoir si la température est positive ou négative. Si elle est négative, il faudra déterminer le complément à 2 des 8 derniers bits (LSB). Ceci étant fait, vous remarquerez que le dernier bit permet de déterminer la partie décimale. La résolution étant de 0.5°C, s’il est égal à 1, alors le 10ième de °C est égal à 5 et s’il est égal à 0, alors le 10ième de °C est égal à 0. Les 7 bits restants correspondent à la partie entière. 4 3. Afficheur 7-segments (fichier Display_utils.h) Nous allons afficher la température sur les 4 afficheurs 7-segments. Elle se mettra sous la forme [Centaine] [Dizaine] [Unité] . [Dixième]. Pour cela, nous ferons toujours appel à la procédure mask pour les afficheurs DIS0, 2 et 3, mais nous devons réécrire une procédure maskDP pour l'afficheur DIS1 car il nous faut afficher le point décimal (DP). En vous aidant de l'utilitaire "Seven Segment Editor" de mikroC, compléter le fichier d'en-tête suivant : // Fichier Display_utils.h unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0x …; case 1 : return 0x …; case 2 : return 0x …; case 3 : return 0x …; case 4 : return 0x …; case 5 : return 0x …; case 6 : return 0x …; case 7 : return 0x…; case 8 : return 0x…; case 9 : return 0x…; } } unsigned short maskDP(unsigned short num) { switch (num) { case 0 : return 0x…; case 1 : return 0x…; case 2 : return 0x…; case 3 : return 0x…; case 4 : return 0x…; case 5 : return 0x…; case 6 : return 0x…; case 7 : return 0x…; case 8 : return 0x…; case 9 : return 0x…; } } 5 4. Le programme principal Temperature.c Vous prendrez pour base le programme écrit lors de la séance précédente, DIS0123.c. La différence ici réside dans le fait que le nombre à afficher n'est plus un compteur, mais la valeur de T° issue du capteur ds1820. Compléter le programme suivant (en vous aidant de la documentation) : #include "Display_utils.h" // Déclaration des variables // temp : température sur 16 bits // tempe : partie entière // tempd : partie décimale // decalage : valeur du décalage permettant de récupérer uniquement la partie entière unsigned short shifter, portd_index, portd_array[4]; unsigned int digit, temp, tempe, tempd; const unsigned short decalage = 1; // Déclaration de l'interruption void interrupt(), cf. TP précédent // Reprendre code correspondant dans DIS0123.c // Programme principal void main(){ ANSELE = 0; // Configure PORTE pins as digital (capteur ds1820) TRISE.B2 = 1; // Configure RE2 pin as input (capteur ds1820) // + declaration des variables et registres (portA, portD, Timer0 etc.) while(1) { // Step a) Lecture de la valeur de la T° // Pensez à interdire l'interruption du Timer0 Ow_Reset(&PORTE, 2); Ow_Write(&PORTE, 2 , 0xCC); // On s'adresse à tous les périphériques one_wire Ow_Write(&PORTE, 2, 0x44); // Envoi de la commande CONVERT_T Delay_us(120); // attente mesure // Step b) Ow_Reset(&PORTE, 2); Ow_Write(&PORTE, 2, 0xCC); // On s'adresse à tous les périphériques one_wire Ow_Write(&PORTE, 2, 0xBE); // Envoi de la commande READ_SCRATCHPAD // Step c) temp = Ow_Read(&PORTE, 2); // Lecture des 8 bits de poids faibles temp = (Ow_Read(&PORTE, 2) << 8) + temp; // Lecture des 8 bits de poids forts // Pensez à autoriser l'interruption du Timer0 // Step d) // Mise en forme des données avant affichage lors de l'interruption 6 delay_ms(100); } } En gras, les parties que vous devez compléter. En particulier, l'algorithme correspondant au Step d) est donné ci-après : - Dans un premier temps, il faut déterminer le signe de la température (positif ou négatif) : test sur l'un des bits de poids fort de la variable temp - Si la température est négative, calculer le complément à 2 des 8 bits de poids faible - Récupérer dans la variable tempd le bit de poids faible (il correspond au 10ième de °C, 0 → .0°C, 1 → .5°C) - Récupérer dans la variable tempe la valeur entière (décalage sur la droite de la valeur decalage) - Assigner les valeurs portd_array[0], portd_array[1], portd_array[2], portd_array[3]. - Afficher la valeur obtenue sur le LCD. uploads/S4/ informatique-industrielle-thomas-quiniou-et-albert-ranaivosoloarimanana.pdf

  • 33
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager
  • Détails
  • Publié le Aoû 25, 2022
  • Catégorie Law / Droit
  • Langue French
  • Taille du fichier 0.1964MB