打印
[活动专区]

【AT-START-L021测评】2、呼吸灯效果

[复制链接]
80|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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、程序
#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、效果

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

115

主题

702

帖子

3

粉丝