打印
[活动]

【APM32F402R Micro-EVB开发板测评】+3、正弦波调光法实现呼吸灯效果

[复制链接]
149|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xu@xupt|  楼主 | 2025-7-27 13:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

1、正弦波调光法

  • 正弦波调光法借助正弦函数计算各时刻的 PWM 占空比,使 LED 亮度变化更平滑自然,以此模拟真实呼吸效果;其实现需用正弦函数计算亮度值并转换为 PWM 占空比输出,优点是亮度渐变平缓、视觉效果好,不过需要浮点运算或查表,可能会占用较多运算资源。
  • 使用一个角度变量在 0 到 2π 之间变化。 利用正弦函数计算亮度值:
  • duty = (sin(θ) + 1) / 2 × 255
  • 这里,sin(θ) 输出范围是 [-1,1],通过加 1 后除 2 映射到 [0,1],再乘以 255 转成 PWM 占空比。 角度随着循环迭代平滑增长。

2、程序

#include "main.h"
#include <math.h>   

#define PWM_PERIOD 50000
#define PI 3.14159265f

void LEDSoftPWM(int led, int duty);
void DelayX(uint32_t t);

int main(void)
{
    BOARD_LED_Config(LED2);

    float angle = 0.0f;
    float angle_step = 0.008f;  

    while (1)
    {

        int duty = (int)((sin(angle) + 1.0f) / 2.0f * 255);

        LEDSoftPWM(LED2, duty);

        angle += angle_step;
        if (angle >= 2 * PI)
        {
            angle -= 2 * PI;  
        }
    }
}

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、效果

222.gif

使用特权

评论回复
沙发
真的问题不大| | 2025-7-29 09:49 | 只看该作者
还能这么玩点灯?真是学习了

使用特权

评论回复
板凳
银河漫步| | 2025-7-29 11:34 | 只看该作者
您这个点灯可真是高级啊

使用特权

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

本版积分规则

127

主题

740

帖子

3

粉丝