本帖最后由 xu@xupt 于 2025-7-27 12:31 编辑
1、呼吸灯实现方法
1、直接 PWM 调光法是利用单片机的 PWM 功能,通过改变 PWM 占空比来控制 LED 亮度,让其缓慢地从暗到亮再到暗循环变化;实现时需配置 PWM 模块并设置合适频率,在定时器中断或主程序中周期性调整占空比,代码上通过占空比的递增递减产生呼吸效果,该方法简单易用且资源占用低,但亮度变化为线性,可能不够自然。
2、正弦波调光法借助正弦函数计算各时刻的 PWM 占空比,使 LED 亮度变化更平滑自然,以此模拟真实呼吸效果;其实现需用正弦函数计算亮度值并转换为 PWM 占空比输出,优点是亮度渐变平缓、视觉效果好,不过需要浮点运算或查表,可能会占用较多运算资源。
3、查表法是预先将一个周期的 PWM 占空比数据(如正弦波数据)存入数组,程序运行时循环读取数组值来设置 PWM 输出;实现步骤包括预先生成亮度值表和主程序顺序读取表中数据,该方法实时运算负担小,适合资源有限的单片机,还能实现正弦渐变效果,但需要一定的存储空间来存放数组。
4、定时器 + 中断动态调节法通过定时器中断周期性调整 PWM 占空比,使呼吸灯自动更新;实现时要设置定时器中断,在每次中断时修改占空比并控制亮度的递增递减状态,其优点是精度高、响应灵活且与主程序解耦,不过程序和中断的协调需要合理设计。
5、软件延时方式适用于无 PWM 模块的单片机,利用软件快速切换 LED 开关比例来模拟 PWM 亮度变化;实现时通过延时和开关频率控制占空比,调整开灯与关灯时间比例实现呼吸效果,该方法不依赖硬件 PWM,适合资源极限的单片机,但 CPU 占用高,且亮度调节不够细腻。
6、独立硬件 PWM 生成法使用专用的 PWM 控制芯片或辅助芯片产生 PWM 信号,单片机仅负责周期调整;此方法能大幅减轻单片机负担,且 PWM 精度高,但会增加硬件成本,设计也更为复杂。
2、软件延时实现呼吸灯
- <div class="blockcode"><blockquote>#include "main.h"
- #define PWM_PERIOD 50000 //
- void LEDSoftPWM(int led, int duty);
- void DelayX(uint32_t t);
- int main(void)
- {
- BOARD_LED_Config(LED2);
- while (1)
- {
- for (int duty = 0; duty <= 255; duty++)
- {
- LEDSoftPWM(LED2, duty);
- }
- for (int duty = 255; duty >= 0; duty--)
- {
- LEDSoftPWM(LED2, duty);
- }
- }
- }
- void LEDSoftPWM(int led, int duty)
- {
- uint32_t onTime = (PWM_PERIOD * duty) / 255;
- uint32_t offTime = PWM_PERIOD - onTime;
- if (onTime > 0)
- {
- BOARD_LED_On(led);
- DelayX(onTime);
- }
- if (offTime > 0)
- {
- BOARD_LED_Off(led);
- DelayX(offTime);
- }
- }
- void DelayX(uint32_t t)
- {
- volatile uint32_t delay = t;
- while (delay--);
- }
3、效果
|