【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")
还能这么玩点灯?真是学习了 您这个点灯可真是高级啊
页:
[1]