实现呼吸灯渐变的核心是周期性地改变PWM占空比,且变化要平滑。常用方法是使用定时器中断,每隔固定时间(如10ms)更新一次占空比,步进值(如+1或-1)控制渐变速度。例如STM32中:
```c
void TIM_IRQHandler(void) {
static uint16_t duty = 0, dir = 1;
TIM_ClearITPendingBit(TIMx, TIM_IT_Update);
duty += dir;
if (duty >= 1000) dir = -1; // 周期1000,峰值1000
if (duty == 0) dir = 1;
TIM_SetCompare1(TIMx, duty);
}
```
注意:占空比分辨率要足够(如16位定时器),避免可见跳变。更平滑的做法是使用正弦表或指数曲线映射占空比,模拟人眼感知的非线性。另外,若MCU资源紧张,可用硬件PWM+定时器DMA或PWM输出比较通道自动更新,减少CPU开销。调试时先用示波器观察PWM波形,确认频率(建议1kHz以上)和渐变周期(1-3秒)符合预期。
mcuku 阿沐 · 2026-08-17