【WCH蓝牙系列芯片】-基于CH582开发板—LED亮度线性与非线性变化

发布时间 2023-09-08 14:27:02作者: zyl4444

-------------------------------------------------------------------------------------------------------

在调节PWM的占空比控制LED的亮度变化的过程中,可以实现呼吸灯的效果。

但是,在实现过程中,可以察觉到LED在不同亮度变换过程中,在占空比较低的时候,LED亮度很明显,在高占空比过程中,LED亮度变化差异很小,这样就会导致整体呼吸灯效果不均匀,看起来很别扭。在灭下去的时候会突然一亮,而不是呈现一种线性变化的感觉。

LED的驱动是恒流的,PWM调节的是恒流时间与断流时间的比值,所以占空比和光通量的输出应该是线性的。从下图可以看出。

光通量是可以随时间线性变化,但是人眼对光的感受却不是线性的。

表现为:在弱光情况下,很小的光通量能让人眼感觉光变化很大,在强光情况下,很大的光通量变化,人眼的感觉也不大。

所以针对这样的情况,需要将人眼感光的线性变化,那么将实际光通量控制为非线性变化,即控制PWM非线性变化。如图。

所以针对程序中,在设置占空比参数时,将数据dutyCycle_data平方之后,除以100,这样就可以将数据非线性变化映射到0~100。可以实现输入的数据与输出的占空比是非线性变化的关系,得到关系图第三个图和第四个图所示。这样人眼观察此时呼吸灯状态是线性变化的状态。

 1 //frequency_data设置为频率
 2 //dutyCycle_data设置为占空比
 3 /* 定时器3,PWM输出 */  //非线性控制PWM
 4 void Timer3_PWM_1(uint16_t frequency_data,uint16_t dutyCycle_data)
 5 {
 6     GPIOB_ResetBits(GPIO_Pin_22); // 配置PWM口 PB22
 7     GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeOut_PP_5mA);   //PB22推挽输出
 8 
 9     TMR3_PWMInit(Low_Level, PWM_Times_1);   //初始化定时器3的PWM,极性设置为低电平输出,PWM输出信号重复1次
10 
11 
12     // 设置频率为 10 kHz
13     uint16_t frequency = frequency_data;  // Hz,frequency_data设置所需频率,若设置频率为 10 kHz,frequency_data为10000
14     int cycle = 600000 / frequency;  // 计算周期,单位为微秒
15 
16 
17     // 设置占空比为 90%
18     int dutyCycle = (dutyCycle_data*dutyCycle_data)/100;  // 百分比,dutyCycle_data设置所需占空比,若设置占空比为 90%,dutyCycle_data为90
19     int LowTime = cycle * dutyCycle;  // 计算高电平时间,单位为微秒
20 
21 
22     TMR3_PWMCycleCfg(cycle * 100); // 配置周期,系统时钟直接做timer时钟,所以记录主频的次数就是1s,即60M为1秒
23     TMR3_PWMActDataWidth(LowTime); // 配置占空比,, 修改占空比必须暂时关闭定时器
24     TMR3_PWMEnable();   //启用TIMR3的PWM功能
25     TMR3_Enable();  //打开定时器3,开始计数
26 
27 }