pages

8 mars 2016

DS18B20 pour mesurer le température

Le circuit DS18B20 est très souvent utilisé pour mesurer la température.

Mesure température avec le circuit DS18B20



DS18B20 : Présentation


Ce circuit de chez "Maxim" est disponible pour un prix très bas et offre de bonnes caractéristiques dans un boitier TO92 avec trois pattes.
On peut récupérer le datasheet de ce circuit sur le net par ex ICI

Certaine figures sont extraites de ce datasheet et sont la propriété de la société Maxim.

Ces principales caractéristiques sont :
  • interface 1 wire,
  • plage de fonctionnement : -55°C à +125°C,
  • résolution programmable de 9 à 12 bits soit de 0.5°C à 0.0625°C,
  • alarmes programmables
  • mémoire EEPROM et mémoire SRAM (Scratchpad)
Il ne nécessite donc qu'une connexion pour s'interfacer avec un microcontrôleur plus deux connexions d'alimentation (+5V et 0V). Il est également possible de réduire ce nombre à 2 connexions, ce mode de fonctionnement (mode "parasite") ne sera pas traité ici.
Chaque circuit est identifiable par un code de 64 bits ce qui permet de mettre plusieurs circuits sur le même bus.

Ce code est :

ds18b20 code


Les différents registres des mémoires SRAM et EEPROM sont :

ds18b20 registres

Les bytes 0 et 1 du "Scratchpad" représente les valeurs basse et haute de la température mesurée.

ds18b20 registre résultat

Les bits notés "S" indiquent  à 0 une température positive et  à 1 une température négative, donc le test de ces bits permet de différencier une température positive et négative.
Dans le cas d'une température négative il est nécessaire d'effectuer :
  • une inversion de  chaque bit du MS byte (NON ou NOT) en utilisant l'opérateur ~
  • une inversion de  chaque bit du LS byte (NON ou NOT) en utilisant l'opérateur ~ et d'ajouter 1
Après ces opérations les valeurs obtenues sont comparables à une valeur positive, un petit exemple :

pour une température de - 26,0625 °C :

     MS_temp = 11111110 et   LS_temp =       01101111
  ~MS_temp = 00000001 et ~LS_temp + 1 = 10010001

la variable 16 bits obtenues est : valtemp = 0000000110010001 soit 191 en hex ou 401 en décimal et en divisant par 16 nous obtenons la valeur de 26,0625.
Voir page 4 du datasheet pour d'autres exemples.

Pour le mode 12 bits tous les bits sont significatifs, mode 11 bits le bit 0 n'est pas significatif, mode 10 bits les bits 0 et 1 ne sont pas significatifs et dans le mode 9 bits les bits 0 à 2 ne sont pas significatifs.

MPLAB X et XC8 : Les fonctions en C 


Pour utiliser ce circuit nous serons amenés à écrire trois fonctions :
  • Reset_ds18b20 : nécessaire avant chaque communication 
  • Read_ds18b20 : lit le contenu de la SRAM
  • Ecr_ds18b20 : écrit une valeur.
La fonction Reset_ds18b20() reproduit le timing donné dans le datasheet soit :

ds18b20 fonction reset

Le microcontrôleur impose un niveau zéro pendant 480µS puis relâche le bus et attend 70µS avant de lire le niveau présent sur le bus :
  • si niveau VDD il n'y a pas de circuit sur le bus
  • si niveau 0V le circuit DS18B20 est présent
La fonction retourne donc 1 (présent) ou 0 (absent) suivant le résultat obtenu.

La fonction Read_ds18b20() lit les valeurs contenu dans le "Scratchpad", après un reset les valeurs sont lues de l'adresse 0 à l'adresse 8.
Pour cela le microcontrôleur impose un niveau zéro pendant 6µS puis attend 9µS avant de lire le niveau 0 ou 1 sur le bus, cette opération est effectuée 8 fois.

La fonction Ecr_ds18b20 (unsigned char data) écrit dans le "Scratchpad" la valeur de data, après un reset les valeurs sont écrites de l'adresse 2 à l'adresse 4.
Pour cela le microcontrôleur impose un niveau zéro pendant un temps de 60µS pour écrire un 0 ou pendant un temps de 6µS pour un niveau 1.

Diagramme des temps : 

ds18b20 diagramme temps


DS18B20 : Commandes


Pour gérer le circuit il existe deux types de commandes :
  1. "Rom commands" pour la recherche, la lecture, ...... des circuits présents sur le bus.
  2. "Function commands" pour déclencher la conversion, pour la lecture ou l'écriture dans le "Scratchpad" ou pour modifier le mode de fonctionnement.
Les "Rom commands" ne seront pas décrites car elles sont peu usitées sauf la commande "CC" qui permet d'adresser tous les circuits sur le bus sans spécifier l'adresse sur 64 bits, nous décrirons seulement les "Function commands" (valeur en hexadécimal) :
  • 44 : déclenche la conversion,
  • BE : pour lire le "Scratchpad",
  • 4E : pour écrire dans le "Scratchpad",
  • 48 : pour copier le "Scratchpad" dans la mémoire EEPROM,
  • B8 : pour copier la mémoire EEPROM dans le "Scratchpad".

Séquence de quelques possibilités :
  • Test présence circuit : "Reset_ds18b20", test si 1 = présent si 0 = absent,
  • Lecture rom 64 bits : "Reset_ds18b20", commande 0x33, lecture 8 octets de la Rom,
  • Déclenchement et lecture température : "Reset_ds18b20",commande 0xCC, commande 0x44, attente fin conversion, "Reset_ds18b20", commande 0xCC, commande 0xBE, lecture poids faible, lecture poids fort.
  • Écriture dans le "Scratchpad" : "Reset_ds18b20", commande 0xCC, commande 0x4E, écriture des trois byte (TH, TL et configuration),
  • Copie du "Scratchpad" dans l'EEPROM : "Reset_ds18b20", commande 0xCC, commande 0x48,
  • Copie de l'EEPROM dans le "Scratchpad": "Reset_ds18b20", commande 0xCC, commande 0xB8,
  • Lecture du "Scratchpad" : "Reset_ds18b20", commande 0xCC, commande 0xBE, lecture des neuf byte.
Nous retrouvons dans le programme ci dessous ces différentes possibilités.



Aucun commentaire:

Enregistrer un commentaire