RGB彩灯驱动实现三种不同的显示效果

一 背景
最近接触到了rgb彩灯,这种灯的驱动方式一般有两种,一种是使用专门的驱动ic,可能是i2c接口也可能是spi接口,发送一些指令来实现驱动的目的,另外一种是直接使用pwm方式驱动,根据三路pwm设置的duty比例来实现显示不同的颜色,我们可以设置最大duty为255,颜色可以参考标准的24位rgb定义。
二 实现三种不同的显示效果
2.1 显示指定颜色长亮
在三个pwm值都为0时灯是灭的状态
我们可以写一个接口函数,输入参数是颜色值
void drv_rgbled_setcolor(uint32_t set_val){ rgbled_r_pwmset((uint8_t)(set_val >>16)); rgbled_g_pwmset((uint8_t)(set_val >>8)); rgbled_b_pwmset((uint8_t)(set_val));}2.2 实现闪烁效果
在pwm关闭的时候灯也是灭的状态,我们可以通过使能pwm的方式来完成闪烁功能,我们也可以记录下当前灯的颜色,在关闭时设置为0,在非0时保存颜色值,打开时使用之前的颜色值即可,做一个接口来实现开关rgb灯条
static uint32_t s_current_rgbled_color = 0;void drv_rgbled_setcolor(uint32_t set_val){ rgbled_r_pwmset((uint8_t)(set_val >>16)); rgbled_g_pwmset((uint8_t)(set_val >>8)); rgbled_b_pwmset((uint8_t)(set_val)); if (set_val) { s_current_rgbled_color = set_val; }}void drv_rgbled_enbale(uint8_t set_en){ if (!set_en) { drv_rgbled_setcolor(0); } else { drv_rgbled_setcolor(s_current_rgbled_color); }2.3 实现呼吸效果
如果要实现一个蓝色呼吸灯的效果,我们首先知道的是蓝色灯100%亮度的值是0x0000ff,如果要实现50%蓝色灯的效果就需要对三个颜色分量乘以等比例系数0.5,我们可以实现一个设置亮度的接口函数
void drv_rgbled_brightness(uint8_t set_val,uint8_t max_val){ uint32_t get_color = s_current_rgbled_color; uint8_t get_r = (uint8_t)(get_color >>16); uint8_t get_g = (uint8_t)(get_color >>8); uint8_t get_b = (uint8_t)(get_color); uint8_t set_val_r = get_r*set_val/max_val; uint8_t set_val_g = get_g*set_val/max_val; uint8_t set_val_b = get_b*set_val/max_val; rgbled_r_pwmset(set_val_r); rgbled_g_pwmset(set_val_g); rgbled_b_pwmset(set_val_b);}2.4 应用层
在任务中需要对闪烁时间进行计数,控制呼吸灯的状态
#define config_rgbled_flash_ivt_ms 500#define config_rgbled_breath_brightness_max 100#define config_rgbled_breath_change_ms 1500#define config_rgbled_breath_ivt_ms (config_rgbled_breath_change_ms/config_rgbled_breath_brightness_max)#define config_task_ivt_ms 15typedef enum{ s_rgbled_off, s_rgbled_on, s_rgbled_flash, s_rgbled_breath}rgbled_workstatus_t;typedef enum{ brs_rgbled_reduce, brs_rgbled_increase,}rgbled_breathstatus_t;uint32_t rgbled_workstatus = s_rgbled_off;uint32_t rgbled_flash_ivt_count_ms = 0;uint32_t rgbled_flash_status = 0;uint32_t rgbled_breath_ivt_count_ms = 0;uint32_t rgbled_breath_status = 0;uint32_t rgbled_breath_brightness = config_rgbled_breath_brightness_max;void task_entry_main(void *parameter){ while(1) { if (s_rgbled_flash == rgbled_workstatus) { rgbled_flash_ivt_count_ms++; if (rgbled_flash_ivt_count_ms >= config_rgbled_flash_ivt_ms) { rgbled_flash_ivt_count_ms = 0; rgbled_flash_status = !rgbled_flash_status; drv_rgbled_enbale(rgbled_flash_status); } } else if (s_rgbled_breath == rgbled_workstatus) { rgbled_breath_ivt_count_ms++; if (rgbled_breath_ivt_count_ms >= (config_rgbled_breath_ivt_ms/config_task_ivt_ms)) { rgbled_breath_ivt_count_ms = 0; if (brs_rgbled_reduce == rgbled_breath_status) { if (rgbled_breath_brightness > 0) { rgbled_breath_brightness--; } else { rgbled_breath_brightness = 0; rgbled_breath_status = brsbrs_rgbled_increase; } } else if (brsbrs_rgbled_increase == rgbled_breath_status) { if (rgbled_breath_brightness < config_rgbled_breath_brightness_max) { rgbled_breath_brightness++; } else { rgbled_breath_brightness = config_rgbled_breath_brightness_max; rgbled_breath_status = brs_rgbled_reduce; } } drv_rgbled_brightness(rgbled_breath_brightness,config_rgbled_breath_brightness_max); } } task_mdelay(config_task_ivt_ms); }}

GE微服务发展工业互联网的策略解析
微软亚洲研究院开发出了一种超级凤凰人工智能系统
三星Galaxy S系列在影像方面的亮点
Los Angeles mobileFPGA系列器件架构/特性/电路
未来宁德时代动力电池行业发展的五个方向
RGB彩灯驱动实现三种不同的显示效果
智能燃气表内部封装适用什么灌封胶?
紫光展锐重振旗鼓 2020年将推出5GSoC
5G技术的特点和关键技术
5G输给了华为!为6G护盘,美国开始加速!
中国医疗行业:医院互联网市场分析
外媒点评AirPods:这么多年就数这个最好了!
芯片赋能智慧医疗,集成电路为我们打造了怎样的行业未来?
DSP在六自由度电磁跟踪系统中的应用
锂离子电池和锂聚合物电池的区别
步态识别的神奇之处在哪
基于环介导等温扩增的纸基核酸快速检测
汽车人机接口迎来新革命
人工智能,连整过容的脸都不放过!
射频同轴连接器未来的发展方向分析