🛠 Graduer une LED avec le PWM d'un timer
Objetivos
Utilizar la salida PWM (MDP en francés) de uno de los temporizadores de 16 bits del GD32F103 para variar progresivamente la luminosidad de un LED. El GD32F103C8 dispone de hasta 10 temporizadores generales de 16 bits, 2 temporizadores avanzados y 2 temporizadores básicos; el núcleo Arduino comunitario mapea analogWrite sobre los canales de los temporizadores. Comprenderás el principio del ciclo de trabajo y la restricción de reloj APB1 (máx. 54 MHz) / APB2 (máx. 108 MHz).
Material
- Tarjeta GD32F103C8T6 / CBT6 compatible Blue Pill
- LED externo + resistencia de 330 ohmios entre el pin de salida y masa (no depender del LED PC13 integrado, poco adecuado para PWM visible)
- Pin de salida del temporizador: PA6 (canal de temporizador tipo TIM3_CH1 en este encapsulado) >
- Alimentación 3,3 V
Código completo
// 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);
}
}
Verificación esperada
El LED externo sube y baja de luminosidad de forma continua (respiración), sin saltos bruscos. Con un analizador lógico o un osciloscopio, se observa una señal rectangular de frecuencia constante cuyo ciclo de trabajo sigue la rampa 0-255. El LED integrado PC13, en cambio, no parpadea: no está en este canal.
Errores frecuentes
analogWritesin efecto: el pin elegido no está mapeado sobre un canal de temporizador en el núcleo; cruzapins_arduino.hdel núcleo CommunityGD32Cores con la tabla AF de la hoja de datos. >- LED apenas visible o quemado: resistencia ausente (sobretensión en el pin) o demasiado alta (LED apagado); 330 a 1 kΩ hacia masa es un buen rango a 3,3 V.
- Confusión 0-255 / 0-4095:
analogWriteespera 0-255 aunque el ADC del núcleo GD32 sea de 12 bits; no es la misma escala queanalogRead. - Frecuencia PWM demasiado baja/alta: la frecuencia por defecto del núcleo puede ser audible o causar parpadeo; si tu núcleo lo expone, ajusta la frecuencia del canal, teniendo en cuenta la cadena de reloj (APB1 ≤ 54 MHz, APB2 ≤ 108 MHz).
- 108 MHz mal configurados: el GD32 sale del reset usando IRC8M como el STM32 usa HSI; pasar a 108 MHz requiere un PLL correcto desde el cristal HXTAL de 8 MHz, y algunos cristales de clones son marginales a esta frecuencia. >
- Olvido de HSE_STARTUP_TIMEOUT: para un proyecto portado desde código ST, AN001 impone 0xFFFF bajo pena de bloqueo al arrancar (el PWM nunca iniciará).
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinopotentiometre.inoArduinopont-uart.inoArduinooled-i2c.inoArduino