🛠 Graduer une LED avec le PWM d'un timer
Objectifs
Utiliser la sortie PWM (MDP en français) d'un des timers 16 bits du GD32F103 pour faire varier progressivement la luminosité d'une LED. Le GD32F103C8 dispose jusqu'à 10 timers généraux 16 bits, 2 timers avancés et 2 timers basiques ; le core Arduino communautaire mappe analogWrite sur les canaux des timers. Vous comprendrez le principe du rapport cyclique et la contrainte d'horloge APB1 (54 MHz max) / APB2 (108 MHz max).
Matériel
- Carte GD32F103C8T6 / CBT6 compatible Blue Pill
- LED externe + résistance de 330 ohms entre la broche de sortie et la masse (ne pas dépendre de la LED PC13 embarquée, peu adaptée au PWM visible)
- Broche de sortie timer : PA6 (canal timer de type TIM3_CH1 sur ce boîtier) >
- Alimentation 3,3 V
Code complet
// pwm_led.ino — GD32F103C8, core CommunityGD32Cores
const uint8_t PWM_PIN = PA6; // sortie timer (cf. tableau AF du core) >
void setup {
pinMode(PWM_PIN, OUTPUT);
Serial.begin(115200);
}
void loop {
for (int p = 0; p <= 255; p += 4) { // rampe montante
analogWrite(PWM_PIN, p);
Serial.println(p);
delay(15);
}
for (int p = 255; p >= 0; p -= 4) { // rampe descendante
analogWrite(PWM_PIN, p);
delay(15);
}
}
Vérification attendue
La LED externe monte puis descend en luminosité de façon continue (respiration), sans paliers brutaux. Au contrôleur logique ou à l'oscilloscope, on voit un créneau de fréquence constante dont le rapport cyclique suit la rampe 0-255. La LED embarquée PC13, elle, ne clignote pas : elle n'est pas sur ce canal.
Erreurs fréquentes
- analogWrite sans effet : la broche choisie n'est pas mappée sur un canal timer dans le core ; croisez pins_arduino.h du core CommunityGD32Cores avec la table AF de la datasheet. >
- LED à peine visible ou cramée : résistance absente (surtension de broche) ou trop forte (LED éteinte) ; 330 à 1 kΩ vers la masse est une bonne plage en 3,3 V.
- Confusion 0-255 / 0-4095 : analogWrite attend 0-255 même si l'ADC du GD32 core est en 12 bits ; ce n'est pas la même échelle que analogRead.
- Fréquence PWM trop basse/haute : la fréquence par défaut du core peut être audible ou faire papilloter ; si votre core l'expose, réglez la fréquence du canal, en gardant à l'esprit la chaîne d'horloge (APB1 ≤ 54 MHz, APB2 ≤ 108 MHz).
- 108 MHz mal configurés : le GD32 sort de reset sur IRC8M comme le STM32 sur HSI ; passer à 108 MHz demande un PLL correct depuis le quartz HXTAL 8 MHz, et certains quartz de clones sont marginaux à cette fréquence. >
- Oubli du HSE_STARTUP_TIMEOUT : pour un projet porté depuis du code ST, AN001 impose 0xFFFF sous peine de blocage au démarrage (le PWM ne démarrera jamais).
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinopotentiometre.inoArduinopont-uart.inoArduinooled-i2c.inoArduino