xu@xupt 发表于 2025-7-27 13:13

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

# 1、正弦波调光法


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

!(data/attachment/forum/202507/27/131313gzuu0buff9e09hb4.gif "222.gif")

真的问题不大 发表于 2025-7-29 09:49

还能这么玩点灯?真是学习了

银河漫步 发表于 2025-7-29 11:34

您这个点灯可真是高级啊
页: [1]
查看完整版本: 【APM32F402R Micro-EVB开发板测评】+3、正弦波调光法实现呼吸灯效果