要让LED呼吸效果更顺滑,核心是**控制PWM占空比的更新频率和步进方式**。首先,使用较高频率的PWM(如1kHz以上)避免闪烁,但更新占空比的频率(即呼吸周期内的刷新率)建议在50-100Hz,这样人眼感知为连续渐变。其次,**不要线性递增/递减占空比**,因为人眼对亮度感知是对数的,线性变化会显得前段突变、后段迟钝。应使用指数或正弦曲线映射:例如 `duty = (sin(phase) + 1) / 2 * max_duty`,其中phase随时间线性增加。代码示例(假设8位PWM):
```c
uint8_t phase = 0;
while(1) {
float rad = phase * 2 * 3.14159 / 255.0;
uint8_t duty = (uint8_t)((sin(rad) + 1) / 2 * 255);
set_pwm(duty);
phase++;
delay_ms(10); // 约25Hz更新,周期约2.5秒
}
```
另外,**避免在中断中做浮点运算**,可预计算查找表(LUT)存256个值。最后,如果MCU支持硬件PWM,确保使用其输出,软件模拟PWM会因抖动影响顺滑度。
mcuku 阿沐 · 2026-08-19