respiration.ino
El core STM32F1 enruta analogWrite a los timers materiales: PA1 es el canal 2 de TIM2 y la frecuencia se fija por pin. El LED respira con un PWM de 20 kHz que ni los condensadores oyen.
Hardware necesario
Una placa de desarrollo GD32F103C8T6 (Cortex-M3 a 108 MHz, compatible pin a pin con Blue Pill), alimentada a 3,3 V/5 V, con un adaptador ST-Link o serie. 1 LED + resistencia de 330 Ω en PA1.
Cableado
Ánodo del LED en PA1 por 330 Ω a GND. PA1 debe quedar libre en el arranque (sin strap), lo que lo hace buena patilla de salida.
Funcionamiento
analogWrite configura el canal de TIM2 en modo PWM y escribe la comparación; el bucle solo rampa la consigna. 108 MHz de base de tiempos = resolución de fase holgada. Con Arduino: instale el core « STM32F1 » (Roger Clark, gestor de placas) y elija la placa « GD32F103C »; el LED de usuario es PC13 (activo en LOW). En C: biblioteca de firmware GD32F10x + ST-Link.
Para ir más lejos
Tres canales TIM2 (PA0/1/2) para un LED RGB, o salida a un MOSFET para una lámpara variable.
respiration.ino
// Respiration sur PA1 (TIM2CH2) — analogWrite du core STM32F1.
const int LED = PA1;
const int FREQ = 20000; // 20 kHz : inaudible pour les composants
int niveau = 0;
int sens = 2;
void setup() {
pinMode(LED, OUTPUT);
analogWriteFrequency(LED, FREQ); // core STM32F1 : frequence par broche
Serial.begin(115200);
}
void loop() {
niveau += sens;
if (niveau >= 255 || niveau <= 0) sens = -sens;
analogWrite(LED, niveau);
delay(5); // rampe complete ~ 0,64 s
}