🛠 Lire un potentiomètre avec l'ADC 12 bits
Objectifs
Utiliser le convertisseur analogique-numérique SAR 12 bits / 500 kSPS du RP2350 pour lire un potentiomètre, convertir la valeur en tension, et comprendre les particularités de la référence ADC sur Pico 2 (rail SMPS 3,3 V filtré, offset inhérent d'environ 30 mV).
Matériel
- 1 × Raspberry Pi Pico 2
- 1 × potentiomètre 10 kΩ (ou 4,7 kΩ)
- Pico SDK ≥ 2.0.0, terminal série 115200 bauds sur UART0 (GP0/GP1)
- Branchement : potentiomètre entre 3V3 et GND, curseur sur GP26
Code complet
/* 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);
}
}
Vérification attendue
En tournant le curseur, la valeur brute suit 0 → 4095 et la tension affichée 0 → ~3,3 V. En butée basse, on peut lire quelques dizaines de mV au lieu de 0 : c'est l'offset documenté (~30 mV) lié à la consommation propre de l'ADC (~150 µA) sur la référence filtrée 200 Ω/2,2 µF.
Erreurs fréquentes
- Oublier
adc_gpio_init: la broche reste dans sa fonction par défaut et la lecture est fausse ou nulle. - Attendre une précision absolue : la référence est le rail SMPS ; pour de la mesure fine, imposer le mode PWM via GP23, faire une remise à zéro sur un canal relié au GND, ou ajouter une référence externe LM4040 sur ADC_VREF.
- Attention GP26–GP29 : diode de découplage vers le rail 3V3, ne jamais dépasser 3,3 V + ~300 mV ni injecter une tension carte éteinte (rétro-alimentation du rail).
- Confondre l'échelle 12 bits (4095) du SDK C avec l'échelle 16 bits (65535) de MicroPython.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython