🛠 Lire un potentiomètre avec l'ADC 12 bits
Objectifs
Utiliser le convertisseur analogique-numérique de la Pico : un SAR 12 bits, 4 canaux sortis à 500 ksps (GP26 = ADC0, GP27 = ADC1, GP28 = ADC2 ; ADC3 = VSYS/3 et ADC4 = sonde de température internes). Tu liras un potentiomètre et afficheras les valeurs sur la console série USB. Attention : la Pico n'a pas de DAC — l'ADC est la seule voie analogique, en lecture seulement.
Matériel
- 1 × Raspberry Pi Pico
- 1 × potentiomètre (10 kΩ par exemple)
- Câbles : une extrémité du potentiomètre sur 3V3, l'autre sur GND, le curseur (broche du milieu) sur GP26
- Console série 115200 bauds (PuTTY,
picocom, etc.) sur le port USB de la Pico
Code complet
// adc_pot.c — ADC0 (GP26), moyenne sur 16 échantillons
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/adc.h"
int main(void) {
stdio_init_all; // console sur USB (stdio_usb)
adc_init;
adc_gpio_init(26); // GP26 en mode ADC
adc_select_input(0); // canal ADC0
while (true) {
uint32_t sum = 0;
for (int i = 0; i < 16; i++) sum += adc_read;
uint16_t raw = sum / 16;
float mv = raw * 3300.0f / 4095.0f;
printf("raw=%u ~%.0f mV\n", raw, mv);
sleep_ms(200);
}
}
Vérification attendue
En tournant le potentiomètre, les valeurs défilent de ~0 à ~4095 (12 bits) et la tension calculée suit 0 → 3,3 V. Les valeurs peuvent être légèrement bruitées : c'est normal, l'ADC de la Pico utilise sa propre alimentation 3,3 V filtrée comme référence, avec un offset inhérent d'environ 30 mV documenté dans la datasheet.
Erreurs fréquentes
- Oubli de
adc_gpio_init(26): la broche reste en GPIO, la lecture est fausse ou nulle. - Mauvais canal :
adc_select_input(3)lit VSYS/3,4la température — pas ton potentiomètre ! - Mesurer plus de 3,3 V : l'ADC ne supporte pas plus que son alimentation ; et GP26-GP29 ont une diode vers IOVDD (au-delà de ~3,6 V ça conduit, et alimenter une broche carte éteinte alimente tout le rail 3V3).
- Attendre de la précision : pour le bruit, moyenne plusieurs échantillons ; pour la justesse, soustraire l'offset (lecture d'un canal à la masse) ou forcer le régulateur en mode PWM (GPIO23).
stdio_init_allen UART sur d'anciens exemples : branche-toi sur le bon port (USB pour stdio_usb).
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython