1、呼吸灯常用方法 实现呼吸灯效果的方法主要有以下几种: 硬件 PWM 实现,利用定时器的 PWM 功能生成可控的占空比信号,直接驱动 LED。通过改变 PWM 占空比,控制 LED 的亮度。具有硬件独立运行占用 CPU 资源少、调节精度高亮度变化平滑和硬件实现简单但需要 MCU 提供 PWM 外设等特点 软件模拟 PWM,通过软件控制 LED 的点亮时间和熄灭时间比例(类似 PWM 的占空比),从而模拟亮度变化。具有不需要硬件 PWM 外设适用于资源有限的 MCU、占用 CPU 时间较多、实时性较差和易于实现等特点。 查表法,预先生成一组符合呼吸灯亮度规律的表(如正弦波或指数变化的亮度值),通过定时器或软件逐步读取表中数据,改变 LED 的亮度。具有亮度变化平滑、可实现复杂的亮度曲线、占用存储空间较大、运行效率高和適合需要复杂亮度曲线场景等特点。 本文使用了 软件模拟 PWM的方法来实现呼吸灯效果。 2、程序 - #include "at32l021_board.h"
- #include "at32l021_clock.h"
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] main function.
- * @param none
- * @retval none
- */
- int main(void)
- {
- // 变量声明必须在代码块起始位置
- int brightness = 0; // 当前亮度
- int direction = 1; // 亮度变化方向(1:增加,-1:减少)
- const int max_brightness = 100; // 最大亮度值
- int i; // `for` 循环中使用的变量
- system_clock_config(); // 配置系统时钟
- at32_board_init(); // 初始化开发板
- while (1)
- {
- // 模拟亮度变化
- for (i = 0; i < max_brightness; i++) // 循环变量 `i` 在外部声明
- {
- // LED2 的亮度与 brightness 成正比
- if (i < brightness)
- at32_led_on(LED2);
- else
- at32_led_off(LED2);
- // LED3 的亮度与 brightness 成反比
- if (i < max_brightness - brightness)
- at32_led_on(LED3);
- else
- at32_led_off(LED3);
- // LED4 的亮度介于两者之间
- if (i < (brightness + (max_brightness - brightness) / 2))
- at32_led_on(LED4);
- else
- at32_led_off(LED4);
- delay_us(100); // 延迟 100 μs,控制亮度变化速度
- }
- // 调整亮度值
- brightness += direction;
- if (brightness >= max_brightness || brightness <= 0)
- {
- direction = -direction; // 到达最大或最小亮度时反向
- }
- }
- }
3、效果
|