打印
[STM32F1]

P9813驱动RGB灯珠

[复制链接]
1807|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Cs天涯|  楼主 | 2018-10-13 11:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

1       P9813简介及特点:


2       P8913常见接线图
因为所有的颜色都是由三原色组合而成,这个RGB彩灯就是让我们给它红绿蓝三种不同比例就可以显示出各种颜色。R:red (红色) G:green(绿色)B:blude(蓝色)。驱动芯片负责把三种颜色的颜色系数给到灯珠,灯珠就会显示彩色。三原色国际色卡自行百度。
3       驱动时序图及工作参数
① 前32 位“0”为起始帧,在Cin 上升沿时打入,并且时序DIN要先于CIN;
    ② 标志位为两个“1”;
    ③校验数据“B7’”与“B6’”为蓝色灰度数据的“B7”与“B6”的反码;
    ④ 灰度级数据要高位先入,并且是蓝绿红顺序。
  
由此可得,MCU需要发送的数据
32位0起始信号:        0000 0000 0000 0000 0000 0000 0000 0000
第一点32位灰度数据:   11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxxxxxx xxxx
第二点32位灰度数据:   11B7’B6’ G7’G6’R7’R6’ xxxx xxxx xxxx xxxxxxxx xxxx
                                          (红色码  绿色码  蓝色码)
可见需要延时操作,单片机执行汇编代码需要时间,所以延时不用太久1us就行。
此外,单片机要发送的数据为
4       驱动思路4.1   发送一位数据:
DIN=0/1    //数据线准备数据
CIN=0     
延时
CIN=1
延时       //时钟线拉高后变低,数据传输到芯片内
            
4.2   发送32位数据
发送32位数据
For(i=0;i<32;i++)
{
发送一位数据:
}
5       实战代码5.1   整合3个三原色数据到一个变量。
u32 Color_Data(unsignedint r,unsigned int g,unsigned int b) //写入三个八位的值,返回一个32位的数值
{                                       
         u32 temp=0;
         
         temp |=0x03<<30;         //0xc0--> 1100 0000     1010 1010
         temp |= ((~b)&0xc0)<<22;  //取蓝色最高两位取反,得到B7’ B6’
         temp |= ((~g)&0xc0) <<20;  //取绿色最高两位取反,得到G7’G6’
         temp |= ((~r)&0xc0) <<18;   //取绿色最高两位取反,得到R7’R6’
         temp |= b<<16;
         temp |= g<<8;
         temp |= r<<0;
         
         return temp;
}
5.2   MCU发送数据到芯片
voidRGB_Send_Data(u32 data)
{
         unsigned int i;
         for(i=0;i<32;i++)
         {
//取data的最高位,如果是1就写1(注意按位操作是写16进制)
                  if(data&0x80000000)//准备一位数据   
                  {
                          RGB_DATA_H;
                  }
                  else
                  {
                          RGB_DATA_L;                   //否则写0
                  }
                  data<<=1;//每取出一个数据,让次高位变成最高位,遍历整个32位的data值
                  RGB_CLK_L;
                  Delay_us(1);
                  RGB_CLK_H;
                  Delay_us(1);
                  /*以上四步操作令CLK产生上升沿*/
         }
}
5.3   最终的控制函数
voidRGB_Color_Control(unsigned int r,unsigned int g,unsigned int b)
{
         u32 color_data;
         color_data= Color_Data(r,g,b) ;
         
         RGB_Send_Data(0);//先发送32位低电平起始信号
         RGB_Send_Data(color_data); //发送第一个32位灰度数据
         RGB_Send_Data(color_data); //发送第二个32位灰度数据
}
5.4   IO口初始化略(推挽输出)
沙发
wanduzi| | 2018-10-13 21:52 | 只看该作者
只能驱动一个RGB的LED吗

使用特权

评论回复
板凳
wenunit| | 2018-10-14 10:03 | 只看该作者
用这个驱动一个大屏,要干多少事啊。

使用特权

评论回复
地板
Cs天涯|  楼主 | 2018-10-14 10:32 | 只看该作者
wanduzi 发表于 2018-10-13 21:52
只能驱动一个RGB的LED吗

可以级联驱动多个,不过我没试过,没条件试,手册有说明。

使用特权

评论回复
5
Cs天涯|  楼主 | 2018-10-14 10:33 | 只看该作者
wenunit 发表于 2018-10-14 10:03
用这个驱动一个大屏,要干多少事啊。

看来老哥是老司机啊,我还是个小学生

使用特权

评论回复
6
幸福小强| | 2018-10-14 19:20 | 只看该作者
这控制多彩屏还要用很多啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝