这次我将和大家分享如何使用中科蓝讯 AB5301A 驱动 RGB 灯。我将从 RGB灯的原理出发,接着介绍驱动程序,最后使用 RGB 灯实现呼吸灯效。
一、RGB 灯工作原理
1、RGB 灯概述
示例的 GBH6812 RGB灯有四个引脚,DIN 端与蓝牙芯片信号 IO 脚连接,DOUT 为信号输出脚,本示例没有用到,VDD、GND 为供电脚。GBH6812 是一个集控制电路与发光电路于一体的智能外控 LED光源。其外型与一个 5050LED 灯珠相同,每个元件即为一个像素点。每个像素点的三基色颜色可实现 256 级亮度显示,完成 16777216 种颜色的全真色彩显示。
2、RGB 灯电气规格
注意,RGB 灯的工作电压要大于 4V;推动电流为 12mA 左右,所以应把 IO输出驱动配置为32 mA。
3、RGB 灯编码
T0H:300ns T0L:600ns
T1H:600ns T1L:300ns(容错20%)
Trst > 80us
当 IO 输出 300ns 高电平,600ns 低电平,DIN 端将识别为 0 码,1 码与之相反;当 IO 输出大于 80us 的低电平,DIN 端将识别为 RESET 码。如果 DIN 端输入信号为 RESET 信号,RGB 灯将接收到的数据送显示,并将在该信号结束后重新接收数据。
4、24Bits 数据发送顺序:高位先发,即 R7 先发
二、驱动程序
1、定义一个数组存放 RGB 灯呼吸灯效值
2、RGB 灯控制脚初始化函数
RGB 灯需要 12mA 的驱动电流。GPIOEDRV |= BIT(4);这句是把 IO输出驱动配置为32 mA;IO 输出驱动电流默认为 8mA。
3、写入 0 或 1 码函数
AT(.text.led_disp)
void RGB_Write0(void) //输入码0
{
GPIOESET = BIT(4);
asm("nop");
……..(省略了 23 句 asm("nop");)
GPIOECLR = BIT(4);
asm("nop");
………(省略了 23 句 asm("nop");)
}
/**************************************************************/
AT(.text.led_disp)
void RGB_Write1(void) // 输入码1
{
u8 cnt2 = 1;
GPIOESET = BIT(4);
asm("nop");
……..(省略了 47 句 asm("nop");)
GPIOECLR = BIT(4);
while(cnt2--) //00ns
asm("nop");
……..(省略了 6 句 asm("nop");)
}
写 0 或 1 函数需要把系统时钟配置为 80M:
若要 RGB 灯识别为 0 码,IO 输出 300ns 高电平,600ns 低电平;若要RGB 灯识别为 1 码,IO输出 600ns 高电平,300ns 低电平,这两个函数使用示波器测量过,满足 20% 的误差要求。
4、复位函数
每发送完 24 位数据给 RGB 灯后,都需要使控制脚清零 80us,这样才能发送下一个灯效数据。
5、发送灯效数据给 RGB 灯的函数
RGB 灯的颜色控制共需三个字节,每个字节控制一种颜色,依照 RGB 灯的控制原理,高位先写入。
6、呼吸灯效函数
这里只做了一种颜色的呼吸灯效,涉及到的 sys_cb 结构体变量自行定义即可。若要多种颜色交替实现呼吸灯效,只需增加一个代表不同颜色的呼吸灯效的变量即可。
三、呼吸灯效实现
1、RGB 控制 IO 初始化
2、增加一个 30ms 的队列信息
3、30ms 的队列信息跑呼吸灯效函数
30ms 改变一次灯效的亮度。
好了,使用中科蓝讯 AB5301A 驱动 RGB 灯的内容介绍到这里,欢迎大家批评指正。如果大家还有什么其他的问题或者功能想要询问,亦可以在评论区中提出,可以共同探讨,一起进步。
参考文档:
1、中科蓝讯蓝皮书
2、AB5301A DataSheet
3、5050 幻彩灯规格书