🛠 Lire l'ADC 12 bits et le capteur de température interne du RP2350
Objetivos
El RP2350 incorpora un ADC SAR de 12 bits, 500 kSPS, 4 canales en RP2350A / 8 en RP2350B, más un canal de temperatura interna — pero ningún DAC (hoja de datos RP2350). Los ejemplos oficiales del SDK ubican los canales ADC0..3 en GP26..GP28. Este tutorial: leer una tensión externa con un potenciómetro, leer la temperatura del núcleo y manipular correctamente la escala de 12 bits (0..4095) del ADC del RP2350.
Material
- 1 × placa RP2350 genérica + MicroPython rp2 (firmware RP2350)
- 1 × potenciómetro de 10 kΩ: patilla 1 → 3V3, patilla 3 → GND, cursor → GP26
- 3 × cables; no se necesita ninguna resistencia (el ADC se conforma con la fuente)
- Para la temperatura: simplemente tu dedo sobre el chip 😉
Código completo
# 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)
Verificación esperada
Gira el potenciómetro: el valor bruto sigue 0 → 4095 y la tensión 0 → 3,3 V de forma lineal. Coloca el dedo sobre el RP2350: la temperatura del núcleo sube unos grados en pocos segundos y luego vuelve a bajar. La fórmula 27.0 - (v - 0.706) / 0.001721 es la de la familia RP2 (tensión del sensor 0,706 V a 27 °C, pendiente 1,721 mV/°C) — da la temperatura del núcleo (diodo interno), no la temperatura ambiente: 30–35 °C en mano es normal.
Errores frecuentes
- Confundir
read(bruto, 0..4095 en este chip de 12 bits) yread_u16(reescalado a 16 bits por MicroPython): elige UNA escala y divide por la escala completa correcta — un factor de error de 16 no siempre se nota. - Medir el canal de temperatura como una entrada normal: el canal interno no es lineal en tensión de entrada, usa la fórmula dedicada.
- ADC0 en un pin distinto de GP26: los canales ADC están fijados en los pines analógicos (GP26..GP28 según los ejemplos del SDK), a diferencia de UART/SPI/I2C que se enrutan a cualquier parte.
- Alimentación IO a 1,8 V: la escala completa del ADC sigue la alimentación IO — si tu montaje está a 1,8 V IOVDD, ajusta
REF. - Fuente con demasiada impedancia (> 10 kΩ): el muestreador interno se descarga, los valores se vuelven imprecisos — los 10 kΩ del potenciómetro son el límite superior razonable.
- Esperar una salida analógica: el RP2350 no tiene DAC; para una tensión variable, usa PWM + filtro RC (los 8/12 canales PWM del RP2350 sirven).
- Apuntar a los canales 4..7 en una placa RP2350A: los 8 canales solo existen en el silicio de 48 GPIO (RP2350B) — verifica la variante del chip, no solo el formato del módulo.
- Entradas dejadas flotantes: en los chips A2, una entrada flotante puede subir hacia 2,2 V debido a la fuga del Bank 0 (errata E9) — conecta o configura tus pines no utilizados.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython