【WCH蓝牙系列芯片】-基于CH582开发板—LED亮度线性与非线性变化
-------------------------------------------------------------------------------------------------------------------------------------
在调节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 }