🛠 Lire un potentiomètre avec l'ADC 12 bits
Objetivos
Utilizar el convertidor analógico-digital SAR de 12 bits / 500 kSPS del RP2350 para leer un potenciómetro, convertir el valor en tensión y comprender las particularidades de la referencia ADC en Pico 2 (rail SMPS de 3,3 V filtrado, offset inherente de aproximadamente 30 mV).
Material
- 1 × Raspberry Pi Pico 2
- 1 × potenciómetro de 10 kΩ (o 4,7 kΩ)
- Pico SDK ≥ 2.0.0, terminal serie a 115200 baudios en UART0 (GP0/GP1)
- Conexión: potenciómetro entre 3V3 y GND, cursor en GP26
Código completo
/* adc_pot.c — lecture potentiomètre sur GP26, affichage tension */
#include "pico/stdlib.h"
#include "hardware/adc.h"
#include <stdio.h>
#define POT_ADC_PIN 26
#define SMPS_MODE_PIN 23 /* GP23 haut = mode PWM SMPS, ripple réduit */
int main(void) {
stdio_init_all;
/* Améliore la stabilité de la référence ADC (conseil datasheet §5.3) */
gpio_set_function(SMPS_MODE_PIN, GPIO_FUNC_SIO);
gpio_set_dir(SMPS_MODE_PIN, GPIO_OUT);
gpio_put(SMPS_MODE_PIN, 1);
adc_init;
adc_gpio_init(POT_ADC_PIN);
while (true) {
adc_select_input(0); /* canal ADC0 (GP26) */
uint16_t raw = adc_read; /* 0..4095 (12 bits) */
float v = raw * 3.3f / 4096.0f;
printf("raw=%4u U=%.3f V\n", raw, v);
sleep_ms(200);
}
}
Verificación esperada
Al girar el cursor, el valor bruto sigue 0 → 4095 y la tensión mostrada 0 → ~3,3 V. En el extremo inferior, se pueden leer unas decenas de mV en lugar de 0: es el offset documentado (~30 mV) relacionado con el consumo propio del ADC (~150 µA) sobre la referencia filtrada de 200 Ω/2,2 µF.
Errores frecuentes
- Olvidar
adc_gpio_init: el pin permanece en su función por defecto y la lectura es incorrecta o nula. - Esperar una precisión absoluta: la referencia es el rail SMPS; para una medición fina, imponer el modo PWM mediante GP23, realizar un reinicio (reset) en un canal conectado a GND, o añadir una referencia externa LM4040 en ADC_VREF.
- Atención GP26–GP29: diodo de desacoplo hacia el rail 3V3, nunca superar 3,3 V + ~300 mV ni inyectar una tensión con la tarjeta apagada (retroalimentación del rail).
- Confundir la escala de 12 bits (4095) del SDK C con la escala de 16 bits (65535) de MicroPython.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython