渐变的原理和电影播放帧原理类似,变化的频率大于人眼刷新频率就可以实现不间断的渐变。人眼的刷新频率一般不超过30Hz,即变化间隔不大于33.3ms。要让灯光实现渐变效果,也只要实现频率大于人眼刷新频率的颜色变化即可。
软件上对实时性要求不高,可以使用软件定时器来实现,相对于使用线程更节省资源,也更容易移植到不跑操作系统的芯片上。
这里我使用Freertos的软件定时器来定时,定时周期30ms。代码基于上一次的工程,增加定时器的代码和渐变的代码。从红色开始,每30ms进入一次定时器回调,对H值进行自增,增加的量值会影响渐变的周期,也就是渐变的速度。
代码如下:
//全局hsb变量
hsb_t hsb = {0, 100, 100};
//软件定时器回调
void timer_callback(xTimerHandle timer_t)
{
rgb_t rgb;
hsb.h += 0.5; //每次增加一定的值,增加此值会缩短渐变周期
if (hsb.h >= 360)
{
hsb.h -= 360;
}
hsb_to_rgb(&hsb, &rgb);
set_rgb_color(&rgb);
}
void light_init(void)
{
//启用PWM通道
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
//创建Freertos软件定时器
xTimerHandle timer = xTimerCreate(NULL, 30 / portTICK_RATE_MS, pdTRUE, NULL, timer_callback);
xTimerStart(timer, 0);
}
我要赚赏金
