[活动专区] 【AT-START-L021测评】2、呼吸灯效果

[复制链接]
 楼主| xu@xupt 发表于 2024-11-24 22:52 | 显示全部楼层 |阅读模式
1、呼吸灯常用方法
实现呼吸灯效果的方法主要有以下几种:
硬件 PWM 实现,利用定时器的 PWM 功能生成可控的占空比信号,直接驱动 LED。通过改变 PWM 占空比,控制 LED 的亮度。具有硬件独立运行占用 CPU 资源少、调节精度高亮度变化平滑和硬件实现简单但需要 MCU 提供 PWM 外设等特点
软件模拟 PWM,通过软件控制 LED 的点亮时间和熄灭时间比例(类似 PWM 的占空比),从而模拟亮度变化。具有不需要硬件 PWM 外设适用于资源有限的 MCU、占用 CPU 时间较多、实时性较差和易于实现等特点。
查表法,预先生成一组符合呼吸灯亮度规律的表(如正弦波或指数变化的亮度值),通过定时器或软件逐步读取表中数据,改变 LED 的亮度。具有亮度变化平滑、可实现复杂的亮度曲线、占用存储空间较大、运行效率高和適合需要复杂亮度曲线场景等特点。
本文使用了 软件模拟 PWM的方法来实现呼吸灯效果。
2、程序
  1. #include "at32l021_board.h"
  2. #include "at32l021_clock.h"

  3. /**
  4.   * [url=home.php?mod=space&uid=247401]@brief[/url]  main function.
  5.   * @param  none
  6.   * @retval none
  7.   */
  8. int main(void)
  9. {
  10.     // 变量声明必须在代码块起始位置
  11.     int brightness = 0;         // 当前亮度
  12.     int direction = 1;          // 亮度变化方向(1:增加,-1:减少)
  13.     const int max_brightness = 100;  // 最大亮度值
  14.     int i;                      // `for` 循环中使用的变量

  15.     system_clock_config();  // 配置系统时钟
  16.     at32_board_init();      // 初始化开发板

  17.     while (1)
  18.     {
  19.         // 模拟亮度变化
  20.         for (i = 0; i < max_brightness; i++)  // 循环变量 `i` 在外部声明
  21.         {
  22.             // LED2 的亮度与 brightness 成正比
  23.             if (i < brightness)
  24.                 at32_led_on(LED2);
  25.             else
  26.                 at32_led_off(LED2);

  27.             // LED3 的亮度与 brightness 成反比
  28.             if (i < max_brightness - brightness)
  29.                 at32_led_on(LED3);
  30.             else
  31.                 at32_led_off(LED3);

  32.             // LED4 的亮度介于两者之间
  33.             if (i < (brightness + (max_brightness - brightness) / 2))
  34.                 at32_led_on(LED4);
  35.             else
  36.                 at32_led_off(LED4);

  37.             delay_us(100);  // 延迟 100 μs,控制亮度变化速度
  38.         }

  39.         // 调整亮度值
  40.         brightness += direction;
  41.         if (brightness >= max_brightness || brightness <= 0)
  42.         {
  43.             direction = -direction;  // 到达最大或最小亮度时反向
  44.         }
  45.     }
  46. }

3、效果
x2-ezgif.com-video-to-gif-converter.gif

您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

751

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部