yCat 发表于 2015-8-28 11:22:40

【转载】RGB灯的使用步骤与代码分享

帖子链接:http://bbs.elecfans.com/jishu_500362_1_1.html
帖子作者:xintuxing


关于RGB灯的使用下面给出我个人的使用步骤和代码:第一,从原理图上可知,RGB灯共阳连接,共阳端由一个MOS管控制与5V电源的通断。可控硅又由A0的驱动引脚间接控制,仔细查找原理图可知A0是STM32芯片的PA0引脚。三个阴极分别连接着P9813芯片的R G B(5,6,7)引脚。
http://bbs.elecfans.com/data/attachment/forum/201507/20/193345eg3gse8u1x26mgx1.jpg.thumb.jpg

第二,查询P9813的资料,它是一款全彩点光源LED驱动芯片,提供三路恒流驱动和256级灰度调制输出。采用双线制传输方式(SDA和SCL),内部结构如图:
http://bbs.elecfans.com/data/attachment/forum/201507/20/193335lsul3w3737556sz2.jpg.thumb.jpg
时序及通讯协议图:
http://bbs.elecfans.com/data/attachment/forum/201507/20/193340l8wwc734wqyv7vqy.jpg.thumb.jpg
第三,认真看完了上面的三个图片,接下来就应该写程序了:
其它的就不去讲了,只说说与RGB灯有关的部分。
1、宏定义对应引脚的置位和重置操作,这样比较方便操作(PA0,PB8和PB9都要配置为输出)。
#define   SCL_0         GPIO_ResetBits(GPIOB,GPIO_Pin_8)
#define   SCL_1         GPIO_SetBits(GPIOB,GPIO_Pin_8)
#define   SDA_0       GPIO_ResetBits(GPIOB,GPIO_Pin_9)
#define   SDA_1       GPIO_SetBits(GPIOB,GPIO_Pin_9)

2、观察P9813的时序及通讯协议图,写出程序如下:
void RGB_Write_Data(u8 R,u8 G,u8 B)//为方便记住,三个参数的顺序为R G B;
{
                u32 RGB_Data = 0;//定义一个32位的数据,各字节对应到P9813的寄存器,方便操作
                u8 i;      //循环计数
//以下为 组合数据:
                RGB_Data |= 0xC0000000;                           //将最高两位的标志位置1,。
                RGB_Data |= ((u32)((~B) & 0xc0)) << 22;//将数据B按位取反后,再与0xC0按位与,得到B的最高两位的反码,然后强制转换成u32类型,最后装入RGB_Data的对应位。
                RGB_Data |= ((u32)((~G) & 0xc0)) << 20;//与数据B的处理相同
                RGB_Data |= ((u32)((~R) & 0xc0)) << 18;//与数据B的处理相同
                RGB_Data |= ((u32)B) << 16;//强制转换后移入对应位
                RGB_Data |= ((u32)G) << 8;//强制转换后移入对应位
                RGB_Data |= R;      //最低8位直接按位或
//以下为 数据组合好后写入P9813:
                for (i=0;i<32;i++)
                {
                        if ((RGB_Data & 0x80000000) != 0)//取得RGB数据中的最高位
                                        SDA_1;
                        else
                                        SDA_0;
                              RGB_Data <<= 1;
                              SCL_0;
                              SCL_1;
                }

//写入32个0的起始帧,在使用过程中,给我的感觉是,上面的RGB数据是在一个缓存器中,执行下面的写0操作后,RGB的数据就移入了P9813有效寄存器中。所以就把这三十二0放在后面。
                SDA_0;
                for (i=0; i<32; i++)
                {      
                              SCL_0;
                              SCL_1;      
                }
}

试验结果:
调试过程中的RGB组合后的数据:
http://bbs.elecfans.com/data/attachment/forum/201507/20/205314lh7zczk8j5k57p7j.jpg.thumb.jpg
红色灯:
http://bbs.elecfans.com/data/attachment/forum/201507/20/205456ysa6a9wqeaqa6azf.jpg.thumb.jpg

绿色灯:
http://bbs.elecfans.com/data/attachment/forum/201507/20/205425ez03s1s0efcz1jse.jpg.thumb.jpg

蓝色灯:
http://bbs.elecfans.com/data/attachment/forum/201507/20/205521qqfy3qr66dfrl8lr.jpg.thumb.jpg


仅此拿来分享,见笑了。

东风知我 发表于 2015-8-31 15:06:53

感觉挺不错的。

汤博 发表于 2015-9-17 21:06:27

太棒了!我也迫不及待了!

yCat 发表于 2015-9-18 10:11:54

汤博 发表于 2015-9-17 21:06
太棒了!我也迫不及待了!

尽情玩吧~~~

难得飞起 发表于 2015-9-18 22:30:09

学习了。路漫漫修远兮

难得飞起 发表于 2015-9-20 02:44:21

弄懂了。。我是v2.3版的所以需要自己设置a0输出模式,5v
页: [1]
查看完整版本: 【转载】RGB灯的使用步骤与代码分享