jeudi 7 septembre 2017

Mesurer une température avec une carte STM32 Nucleo (mbed)

On a parfois besoin de mesurer une température au moyen d'un microcontrôleur (contrôle d'un système de chauffage ou de climatisation, station météorologique, expérience scientifique, etc.).

Je vous présente aujourd'hui quelques façons différentes de mesurer une température avec une carte STM32 Nucleo:  nous utiliserons successivement le capteur de température interne du STM32, un capteur numérique DS18B20, un capteur numérique BMP180, et un capteur analogique LM35.

(Si vous préférez mesurer une température au moyen d'une carte Arduino, consultez plutôt cet article).

Méthode 1:  Le capteur de température interne du STM32 (méthode déconseillée!)

Le microcontrôleur STM32 comporte un capteur de température intégré pouvant mesurer des températures situées entre -40°C et +125°C avec une résolution de 1,5°C.  L'avantage principal de cette méthode (et peut-être même le seul avantage), c'est que vous n'avez aucun composant externe à brancher au Nucleo.

Cette option n'est pas applicable à tous les projets, pour différentes raisons:  vous mesurez la température à l'intérieur du microcontrôleur, qui peut être sensiblement plus élevée que la température environnante, il n'est pas toujours possible de placer la totalité de votre carte Nucleo là où vous désirez connaître la température (dans un liquide, par exemple...), la résolution de 1,5°C peut être insuffisante pour ce que vous désirez faire...

Mais l'inconvénient majeur, c'est que pour fournir la température en degrés Celsius, chaque STM32 doit être individuellement calibré.  En d'autres mots, un script qui permet à votre carte Nucleo de lire la température avec une précision raisonnable pourra donner des résultats catastrophique sur une autre carte Nucleo!

Puisque le capteur de température est une caractéristique de l'ADC (convertisseur analogique/numérique) du STM32, vous lisez sa valeur exactement comme vous liriez une entrée analogique conventionnelle.   La seule différence, c'est que vous utilisez la constante "ADC_TEMP" plutôt que le numéro d'une entrée analogique.

Là où les choses se compliquent, c'est que cette lecture sera un nombre proportionnel à la température, situé entre 0 et 1,0 (0 à 100% de 3,3 V), et non une température en degrés Celsius.  Il faut donc faire une conversion.  (Notez que plus la température est élevée, plus la tension mesurée est faible, ce qui est quelque peu contre-intuitif.)

Le tableau ci-dessous provient de la fiche technique du STM32F030R8 (j'ai utilisé la carte NUCLEO-F030R8).


On y constate que la tension mesurée par mon Nucleo lorsque la température est de 30°C  peut prendre n'importe quelle valeur entre 1,34 V et 1,52 V (ça varie d'un exemplaire à l'autre).  De plus, pour chaque variation de température de 1 °C, la tension mesurée varie typiquement de 4,0 mV à 4,6 mV.

Si je connais ceux deux valeurs avec une précision raisonnable, c'est relativement facile de convertir la tension mesurée en degrés Celsius:


Supposons que j'ai mesuré 0,445, ce qui correspond à 1,47 V (44,5% de 3,3 V).  Si les caractéristique de mon Nucleo correspondent à la colonne "typique", la tension à 30°C est de 1,43 V, et la pente moyenne est de 4,3 mV/°C, ce qui donne une température de 20,7°C.


...mais si vous mesurez la même valeur de 1,47 V avec un Nucleo dont la tension à 30°C est de 1,34 V et la pente moyenne de 4,0 mV/°C, ça représente une température de -2,5°C:


...et si vous mesurez toujours 1,47 V, mais avec un Nucleo dont la tension à 30°C est de 1,52 V et la pente moyenne de 4,6 mV/°C, la température est plutôt de 40,9°C:


Conclusion:  pas question d'utiliser une simple approximation tirée de la fiche technique!  Vous devez connaître les paramètres précis de votre carte Nucleo!

Notez que, lors de la fabrication du microcontrôleur, la tension mesurée à 30°C (TS_CAL1) est enregistrée en mémoire.  Certains modèles de STM32 (mais pas mon F030R8) comportent aussi la température à 110°C (TS_CAL2).  L'utilisation de ces valeurs permettrait une mesure beaucoup plus fiable.   Cette méthode est inapplicable dans le cas de mon Nucleo F030R8:  connaître uniquement la valeur précise de la tension à 30°C est insuffisante pour me permettre de faire la conversion.

Je me suis donc résigné à produire une courbe d'étalonnage.  Pour ce faire, j'ai enfermé mon Nucleo et un thermomètre dans un même récipient de plastique fermé hermétiquement, que j'ai placé quelques minutes au congélateur. J'ai ensuite compilé la mesure brute du Nucléo et la température du thermomètre pendant que le contenu du récipient reprenait progressivement la température normale de la pièce.

À partir du graphique, on peut trouver une valeur raisonnablement précise pour la pente moyenne et la tension à 30°C (ou procéder autrement afin de convertir les données brutes en Celsius).

Ceci étant dit, tout ça me semble inutilement compliqué lorsqu'on considère qu'on peut se procurer un capteur de température déjà calibré en °C, facile à utiliser et pas cher du tout.

Voici quand même un script mbed qui affiche la valeur brute mesurée, pour ensuite la convertir en volts, puis en degrés Celsius (en supposant que connaissez la valeur exacte de la tension à 30°C et de la pente moyenne (Avg_slope):




Tout est beaucoup plus simple avec les 3 méthodes suivantes...

Méthode 2: le capteur de température DS18B20

Difficile de trouver des inconvénients au capteur DS18B20 de Maxim, qui peut mesurer des températures entre -55°C et +125°C, avec une résolution de l'ordre d'un demi degré.  Les connexions sont simples:

Vcc du DS18B20:  sortie 3V3 de la carte Nucleo
Data du DS18B20:  entrée A0 de la carte Nucleo*
GND du DS18B20:  GND de la carte Nucleo

Mais attention:  une résistance de 4,7 k doit obligatoirement être branchée entre la pin Vcc et la pin Data du DS18B20.

*:  Le DS18B20 étant un capteur numérique, l'entrée A0 est ici utilisée comme entrée numérique plutôt que comme entrée analogique.  Vous pouvez utiliser n'importe quelle autre entrée du Nucleo en modifiant légèrement le script proposé ci-dessous.

Si votre DS18B20 se trouve à l'intérieur d'une sonde hermétiquement fermée, Vcc est le fil rouge, GND est le fil noir, et Data est l'autre fil.


Ensuite, dans le compilateur mbed, vous pouvez importer le programme d'exemple réalisés par Erik Olieman.  Pour ce faire, vous pouvez cliquer sur le bouton "import", sélectionner l'onglet "Programs" et faire une recherche pour "ds18b20".  Vous pouvez alors sélectionner "DS1820_HelloWorld" par Erik Olieman (c'était le premier choix de la liste quand je l'ai fait).


Le Nucleo transmet à l'ordinateur, par communication série,  la température mesurée:


(c'était une chaude journée d'été, sans climatisation...)

Méthode 3: le capteur de pression BMP180

Même si le capteur BMP180 sert surtout à mesurer la pression atmosphérique, il mesure également la température.  Tout est déjà expliqué dans cet article sur l'utilisation du BMP180 avec la carte Nucleo.

Méthode 4:  le capteur de température LM35

Le capteur LM35 est analogique:  sa tension de sortie est proportionnelle à la température en degrés Celsius (10 mV par degré Celsius).  (Dans cette configuration simple, toutefois, il ne peut pas mesurer de températures plus basses que 2°C).  Tout comme le DS18B20, le LM35 comporte 3 fils:

Vcc du LM35:  sortie 3V3 de la carte Nucleo
Vout du LM35:  entrée A0 de la carte Nucleo
GND du LM35:  GND de la carte Nucleo

Si le signal en provenance du LM35 est acheminé par un câble de quelques dizaines de centimètres ou plus, le bruit pourrait être un problème (forte oscillation du signal mesuré).  Un condensateur placé entre Vout et GND devrait pouvoir atténuer ces fluctuations.





Yves Pelletier   (TwitterFacebook)

Aucun commentaire:

Enregistrer un commentaire