🛠 Lire un potentiomètre avec l'ADC 12 bits
Objectifs
Configurer et lire une entrée analogique : le GD32F103C8 embarque des ADC SAR 12 bits jusqu'à 1 MSPS (attention : ADC2 est absente des variantes C4/C6/C8/CB) et l'horloge ADC ne doit jamais dépasser 14 MHz. Avec le core CommunityGD32Cores, analogRead renvoie nativement une valeur 12 bits (0-4095), plus précis que le 10 bits d'un Arduino classique. Vous allez convertir la position d'un potentiomètre en millivolts.
Matériel
- Carte GD32F103C8T6 / CBT6 compatible Blue Pill
- Potentiomètre 10 kΩ : une extrémité à 3,3 V, l'autre à la masse, curseur à la broche de mesure
- Broche de mesure : PA1 (entrée analogique de type ADC0/ADC1_IN1) >
- Convertisseur USB-série 3,3 V sur USART0 (PA9/PA10) pour la console, comme au tutoriel console
- Jamais plus de 3,3 V sur une broche d'entrée analogique (VDD max 3,6 V)
Code complet
// adc_pot.ino — GD32F103C8, core CommunityGD32Cores
const uint8_t POT_PIN = PA1; // entrée analogique (canal IN1) >
void setup {
Serial.begin(115200);
pinMode(POT_PIN, INPUT);
}
void loop {
uint16_t brut = analogRead(POT_PIN); // 12 bits : 0..4095
uint16_t mv = (uint32_t)brut * 3300UL / 4096UL;
Serial.print("ADC = ");
Serial.print(brut);
Serial.print(" -> ");
Serial.print(mv);
Serial.println(" mV");
delay(100);
}
Vérification attendue
En tournant le potentiomètre, la valeur suit la position de 0 environ (curseur côté masse) à 4095 / environ 3300 mV (curseur côté 3,3 V). Au repos, doigt sur le curseur, la valeur peut bouger : c'est normal, une entrée non pilotée capte le bruit. La conversion est stable quand vous lâchez le bouton.
Erreurs fréquentes
- Valeur qui danse de ±50 : source trop impédante (potentiomètre 100 kΩ) ou masse de mesure flottante ; 10 kΩ est un bon compromis, et une petite capacité 100 nF curseur-masse filtre.
- Attendre 0-1023 : le core GD32 est en 12 bits ; un code porté depuis Arduino AVR divisant par 1023 donne des millivolts faux d'un facteur 4.
- Dépasser 3,3 V : alimenter le potentiomètre en 5 V envoie 5 V sur l'entrée, hors des 2,6-3,6 V spécifiés ; risque de verrouillage/dommage.
- Chercher ADC2 : elle est absente des C4/C6/C8/CB ; tout code ST qui échantillonne sur ADC2 ne fonctionnera pas sur votre C8T6.
- Horloge ADC > 14 MHz : en SPL, si vous configurez l'ADC vous-même, choisissez un diviseur d'APB2 adapté (la datasheet borne l'horloge ADC à 14 MHz), sinon conversions fausses ou instables.
- Sonde de température interne : le canal ADC_IN16 est le capteur de température interne ; ne le reliez pas à une broche externe. >
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinopotentiometre.inoArduinopont-uart.inoArduinooled-i2c.inoArduino