🛠 Lire l'ADC 12 bits et le capteur de température interne du RP2350
Objectifs
Le RP2350 embarque un ADC SAR 12 bits, 500 kSPS, 4 canaux sur RP2350A / 8 sur RP2350B, plus un canal température interne — mais aucun DAC (datasheet RP2350). Les exemples officiels du SDK situent les canaux ADC0..3 sur GP26..GP28. Ce tuto : lire une tension externe avec un potentiomètre, lire la température du cœur, et manipuler proprement l'échelle 12 bits (0..4095) de l'ADC du RP2350.
Matériel
- 1 × carte RP2350 générique + MicroPython rp2 (firmware RP2350)
- 1 × potentiomètre 10 kΩ : broche 1 → 3V3, broche 3 → GND, curseur → GP26
- 3 × câbles ; aucune résistance nécessaire (l'ADC se contente de la source)
- Pour la température : juste ton doigt sur la puce 😉
Code complet
# adc_temp.py — ADC0 (GP26) + canal température interne
from machine import ADC, Pin
import time
# Canal 4 = capteur thermique interne (comme sur RP2040)
sense = ADC(4)
# ADC0 : sur le port rp2, ADC(0) cible l'entrée analogique ADC0 = GP26
pot = ADC(0)
REF = 3.3 # pleine échelle = alimentation IO, ici 3,3 V
FULL = 4095 # l'ADC du RP2350 est nativement 12 bits
def tension(adc):
return adc.read * REF / FULL # read = valeur brute 12 bits
def temperature:
v = tension(sense)
# formule datasheet famille RP2 : 0,706 V à 27 °C, pente -1,721 mV/°C
return 27.0 - (v - 0.706) / 0.001721
while True:
print('pot: %4d %.3f V coeur: %.1f C'
% (pot.read, tension(pot), temperature))
time.sleep_ms(500)
Vérification attendue
Fais tourner le potentiomètre : la valeur brute suit 0 → 4095 et la tension 0 → 3,3 V de façon linéaire. Pose le doigt sur le RP2350 : la température du cœur monte de quelques degrés en quelques secondes, puis redescend. La formule 27.0 - (v - 0.706) / 0.001721 est celle de la famille RP2 (tension du capteur 0,706 V à 27 °C, pente 1,721 mV/°C) — elle donne la température du cœur (diode interne), pas la température ambiante : 30–35 °C en main est normal.
Erreurs fréquentes
- Confondre
read(brut, 0..4095 sur cette puce 12 bits) etread_u16(re-mis à l'échelle 16 bits par MicroPython) : choisis UNE échelle et divise par la bonne pleine échelle — un facteur 16 d'erreur ne se voit pas toujours. - Mesurer le canal température comme une entrée normale : le canal interne n'est pas linéaire en tension d'entrée, utilise la formule dédiée.
- ADC0 sur une autre broche que GP26 : les canaux ADC sont fixés sur les broches analogiques (GP26..GP28 d'après les exemples SDK), contrairement à l'UART/SPI/I2C qui se routent partout.
- Alimentation IO en 1,8 V : la pleine échelle ADC suit l'alimentation IO — si ton montage est en 1,8 V IOVDD, ajuste
REF. - Source trop impédante (> 10 kΩ) : l'échantillonneur interne se décharge, les valeurs deviennent floues — le 10 kΩ du potentiomètre est la limite haute raisonnable.
- Attendre une sortie analogique : le RP2350 n'a pas de DAC ; pour une tension variable, sors un PWM + filtre RC (les 8/12 tranches PWM du RP2350 font l'affaire).
- Viser les canaux 4..7 sur une carte RP2350A : les 8 canaux n'existent que sur le silicium 48 GPIO (RP2350B) — vérifie la variante de puce, pas seulement le format du module.
- Entrées laissées flottantes : sur les puces A2, une entrée qui flotte peut remonter vers 2,2 V à cause de la fuite du Bank 0 (errata E9) — branche ou configure tes broches inutilisées.
Autres tutoriels pour cette carte
- Flasher MicroPython sur une carte RP2350 générique et faire clignoter la première LED
- Console série sur RP2350 : USB CDC natif et UART0 de secours
- Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)
- Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
- Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
- Secure boot et TrustZone-M sur RP2350 : signer son firmware sans se faire avoir
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython