TMP36 sur Raspberry-Pi Pico
Bonjour à tous,
Aujourd'hui, nous allons nous pencher sur une mesure analogique relativement simple sur le principe mais qui tourne assez vite au cauchemar.
TMP36 : premier montage
Source: |
Ce montage est correct sur le principe et le programme relativement simple.
# Read the TMP36 analog temperature sensor # sensor wired to ADC0 (GP26) # from machine import ADC, Pin import time adc = ADC(Pin(26)) while True: value = adc.read_u16() mv = 3300.0 * value / 65535 temp = (mv-500)/10 print( 'Temp: %5.2f °C, Voltage: %4i mV' % (temp,mv) ) time.sleep( 0.100 )
Et les premiers résultats indiquent une température fluctuante autour de plusieurs 1/10 de degrés.
En soit, ce n'est pas mortel... mais pourquoi?
Raison de la fluctuation
Comme indiqué, le courant consommé par le capteur est de 50 µA. Cela signifie que le capteur presque rien.
Puisque le RP2040 ne consomme également presque rien, le régulateur 3V DC/DC fonctionne en mode économique (à plus basse fréquence de hachage), ce qui produit plus de bruit sur l'alimentation.
Il se fait que les capteurs analogiques sont très sensibles aux variations d'alimentation. Le bruits généré par le régulateur DC/DC sur le 3.3V perturbe donc le capteur analogique.
Le bruit présente un moyenne de 300 micro-volts en moyenne (avec un max de 500µV). Le signal en dent de scie est bien visible.
Par aiileurs, le port USB (sur lequel est connecté le Pico) est connu pour aussi transporter du bruit. En jetant un petit coup d'oeil ci-dessous, on peut remarquer qu'il y a relativement peu de bruit.
Solution 1: sortir le régulateur du mode économie
Comme indiqué, si le courant consommé est suffisant alors le régulateur sort du mode économie d'énergie.
En plaçant 5 résistances de 330 Ohms entre 3V3 et GND, le régulateur DC/DC augmente sa fréquence de hachage. On peut constater sur l'image ci-dessous que le rail 3.3V présente déjà une meilleure régulation (même si cela est toujours bruité).
Solution 2: utilise un condensateur
L'ajout d'un simple condensateur sur le rail 3.3V offre déjà une nette amélioration dans le signal.
Mais je ne suis pas encore vraiment satisfait.
J'ai encore ajouté un condensateur de 10nF (non polarisé) sur à l'entrée et voici ce que je fini par obtenir comme signal... je n'arrive pas à faire mieux.
Le retour d'information est déjà plus stable en en pratiquant une moyenne sur 10 lecture, on réduit la variation à 2mV en lecture.
from machine import ADC, Pin import time adc = ADC(Pin(26)) while True: value = 0 for i in range(10): value += adc.read_u16() value /= 10 mv = 3300.0 * value / 65535 temp = (mv-500)/10 print( 'Temp: %5.2f °C, Voltage: %4i mV' % (temp,mv) ) time.sleep(0.100 )
Note complémentaire / Savoir tricher
En lisant la documentation concernant le Raspberry-Pi, j'apprends que la référence de tension du convertisseur ADC (également disponible sur ADC_VREF) utilise un pont RC ... et le relevé de tension sur ADC_VREF est assez époustouflant.
Courbe bleue (en bas) = ADC_VREF |
La broche ADC_VREF sert de référence de tension. Il n'est donc pas question de l'utiliser pour fournir du courant à un périphérique externe.
Tricher un peu:
à 50µA de consommation, je me suis déjà permis de tester le TMP36 en l'alimentant via ADC_VREF. Cela crée une faible chute de tension dans la résistance R7 (même à 50 µA), ce qui fausse légèrement le résultat du TMP36 pour un gain en stabilité non négligeable.
Écrire un commentaire