新闻详情

幻彩灯珠编程代码(APA102彩色灯珠的使用方法)

 二维码
发表时间:2022-08-26 11:07
文章附图

APA102彩色灯珠的使用方法

近两年城市亮化工程中,多处可以见到一些彩色灯柱,颜色可变,可以单一颜色显示,也可以从上到下或者从下到上多彩渐变,这是APA102的一个典型应用场景。

在proteus中,发现也增加了这个器件的模拟,在使用过程中发现apa102的手册关于使用方法说的不是很详细。百度资料的时候,发现国内介绍这个灯珠的资料也比较少,这儿把APA102的使用方法简单介绍一下。

图 1 ATA102在proteus库中的外形

1. 硬件简介

APA102是个一个SPI接口的真彩led灯珠,rgb颜色控制,自带驱动,可以级联,同时具有256级灰度控制和32级亮度控制,是一个非常容易使用的彩灯,可以用来做led灯、大型led屏幕以及LED广告牌。

工业级设计,5V供电,单个灯珠功耗0.2瓦,最大不超过1W。

长宽高5x5x1.4mm。

图 2 引脚图

单个灯珠的引脚定义如图 2所示,除去电源和地引脚外,DI、CI引脚分数是数据输入和时钟输入,分别接控制器的MOSI和SCK,DO与CO用来级联,接下个灯珠的DI和CI。使用SPI进行控制的时候,使用mode0,时钟线空闲周期为低电平,上升沿采样。

图 3 SPI模式

2. 软件控制方法

图 4 控制协议

APA102的软件控制方法如图 4所示,除去开头一个起始帧,最后一个结尾帧以外,中间的是每个led的控制帧。

起始帧的格式是固定的,为连续的32bit的0,即连续发送4个16进制的0x00。如图 5所示。

图5 起始帧

结束帧也是发送特定长度的0,但是结束帧长度不固定,官方计算公式为:


举例来说,假设要控制256个灯珠的话,255×8/16=128,需要末尾发送128bit的0,也就是发送16个0x00。实际上使用中测试,在小于8个灯珠的时候,必须发送4个0x00才可以正确的结束一个控制流程,不影响下次的控制,大于8个的时候,未作测试。

图 6 LED帧

起始帧和结束帧中间的是LED的颜色帧,每个led需要一个颜色帧数据,有多少个led中间就需要发送多少个颜色帧。单个led的控制帧格式如图 6所示。控制一个led需要四个字节的数据,第一个字节是亮度信息,第5位用来做32级亮度控制。后面紧跟着三个字节是蓝色、绿色、和红色颜色分量控制,每个led灯珠需要4个字节的控制信息。

3. 示例代码

使用stm32,管脚模拟的方式做SPI通信,用proteus模拟,代码使用外设库开发,示例代码如下。

图 7 proteus电路连接

示例代码:颜色定义

/*红 绿 黑 橙 蓝 黄 紫 白*/

u8 color[8][4] = {{255,220,20,60},{255,0,100,0},{255,0,0,0},

{255,0,140,255},{255,255,0,0},{255,0,255,255}, {255,148,0,211},{255,255,255,255}};


/**apa102 display color**/

#define RED 0x00

#define GREEN 0x01

#define BLACK 0x02

#define ORANGE 0x03

#define BLUE 0x04

#define YELLOW 0x05

#define ZISE 0x06

#define WHITE 0x07

#define FCOLOR 0x08


示例代码:apa102显示

/**apa102c display color defined in color**/

void apaDIS(u8 incolor)

{

switch(incolor){

case RED:

SPI_SendByte(0x00);//apa启动,写4个0

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(60);

SPI_SendByte(20);

SPI_SendByte(220);

}

SPI_SendByte(0x00);//停止

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case GREEN:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(00);

SPI_SendByte(100);

SPI_SendByte(00);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case BLACK:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case ORANGE:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(00);

SPI_SendByte(140);

SPI_SendByte(255);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case BLUE:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(255);

SPI_SendByte(00);

SPI_SendByte(00);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case YELLOW:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(00);

SPI_SendByte(255);

SPI_SendByte(255);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case ZISE:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(211);

SPI_SendByte(00);

SPI_SendByte(148);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case WHITE:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

{

SPI_SendByte(0xff);

SPI_SendByte(255);

SPI_SendByte(255);

SPI_SendByte(255);

}

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

case FCOLOR:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

for(int j=0;j<4;j++)

SPI_SendByte(color[i][j]);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

default:

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

for(int i=0;i<8;i++)

for(int j=0;j<4;j++)

SPI_SendByte(color[i][j]);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

SPI_SendByte(0x00);

break;

}

}

示例代码:spi部分

void sSPI2_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOD端口

/****SCLK MOSI 配置为输出**/


GPIO_InitStructure.GPIO_Pin = SPI_MOSI_PIN|SPI_SCLK_PIN|SPI_SNSS_PIN; //选择低端口2


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //开漏输出


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度

GPIO_Init(SPI_DIFN_GRP, &GPIO_InitStructure); //GPIO配置函数

/**miso 配置为输入**/

GPIO_InitStructure.GPIO_Pin = SPI_MISO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(SPI_DIFN_GRP, &GPIO_InitStructure);

}


u8 SPI_SendByte(u8 dt)

{

u8 temp=0,i;

SCLK=0;

for(i=8;i>0;i--)

{

if(dt&0x80)

MOSI=1;

else

MOSI=0;

dt<<=1;

SCLK=1;

Delay_us(5);

temp<<=1;

if(MISO)

temp++;

SCLK=0;

Delay_us(5);

}

SCLK=0;

return temp;

}


u8 SPI_RecvByte(void)//数据接收函数,方便调用

{

u8 spi_bValue;

for (u8 no=0;no<8;no++)

{

SCLK=1;

spi_bValue=(spi_bValue <<1);

Delay_us(5);

SCLK=0;

Delay_us(5);

if(MISO ==1)

spi_bValue|=0x01;

else

spi_bValue&=~0x01;

}

return spi_bValue;

}


文章分类: 技术知识
分享到:
最新文章
>
2022-09-17
>
2022-09-17
>
2022-09-17
>
2022-09-17
>
2022-09-17
>
2022-08-28
>
2022-08-28
>
2022-08-27
>
2022-08-27
>
2022-08-27
随机文章
>
  LED电子显示屏很重要的组成部分就有LED单元板,如果单元板有问题,会直影响LED显示屏的整体质量!所以,如何辨别LED单元板的好坏是LED显示屏商家关心的问题,下面整理了一些检测LED单元板的常见方法。  一、材质  1. LED单元板板材  有些LED单元板厂家为了低价竞争,采用廉价的阻燃纸质板或者是单面纤维板作为LED灯的PCB线路板。因为全玻纤PCB板很贵。刚开始看不出差别,一般...
>
  8月17日,福建泉州市2022年重大项目视频连线开工活动在晋江举行。据悉,晋江市此次共22个项目集中开工,总投资965.5亿元,涵盖光电显示等多个领域。  此次集中开工活动中,位于高端制造产业园的MiniLED封装产业项目作为安溪县的代表性重大项目,向全市展示开工场面。    图片来源:安溪县融媒体中心  据悉,安溪县MiniLED封装产业项目总投资11.67亿元,年度计划投资1.5亿元...
>
  1:幻彩灯珠简介  1.1 幻彩内置IC灯珠的特点  幻彩内置IC灯泡主要有两个部分:一个是LED,另一个是IC晶体管。LED部分负责产生光,而IC晶体管则负责控制LED的亮度和颜色。通常情况下,一个幻彩内置IC灯泡包含三个不同颜色的LED:红、 绿、 和 蓝 (RGB) 。 控制晶体 管开关的电流大小,来调整 LED的亮度。而通过不同比例地控制三个 LED的亮度,可以得到不同颜色的光。...
>
  led灯在我们的生活中使用极广,同时在使用led灯时还会出现一些故障,如只发弱光,甚至是不亮了。面对这些情况应该怎么办?  一、led灯只发弱光怎么回事  电源参数主要注意两个,一个是瓦数,一个是电源输出电压(也就是灯板上的输入DC电压)。  也可能是灯的驱动电源损坏了,若是独立电源,可买个相同规格的更换,若是一体的,建议整灯更换。  还有可能是led灯泡的问题,也可以再买个灯泡看看。 ...
>
  led灯是现代生活中再常见不过的灯具,人们选择led灯时会考虑其使用寿命,更需要注意保养。究竟led灯怎么保养?  一、led灯的使用寿命多少  正常来说,led灯的使用寿命差不多都是能够达到4万小时到5万小时的,这个跟led灯的品牌和性能是有很大的关系的,像大品牌的led灯各方面还是比较有保障的,使用寿命久,而且质量也是非常不错的,不容易出现问题。  现在led灯的应用还是非常广泛的,...
>
  led灯不亮怎么回事  led灯是我们生活中再常见不过的灯具,led灯在使用过程中容易出现不亮的情况,究竟是怎么回事?不亮的话怎么修理呢  一、led灯不亮怎么回事  1、led灯条的焊接点有虚焊现象,运输过程中的震动造成焊点脱落而导致灯带不亮。  2、焊锡质量不好,led灯条在弯折的过程中焊点容易产生脆裂、脱落现象。  3、安装时弯折角度过大,造成led灯条焊点与铜箔分离而导致不亮。 ...
>
  对于led灯人们都并不陌生,甚至我们生活中大部分灯具都是led灯,led灯在使用过程中可能会出现一些问题,如不亮或者变弱的问题   一、led灯不亮怎么办  1、关掉开关,在折叠梯子的帮助下,拆掉led吸顶灯的外壳,并检查灯管是否出现发黑发暗的地方。如果有,很有可能是灯管已经损坏了。必须更换了,这种LED灯管在五金商店里面可以买到,建议选择知名品牌。  2、如果灯管还是完好的,那么应该试...

关于天成    产品中心    新闻资讯    技术支持    人力资源    联系方式

联系我们

----------------------------------------------

电话:4008-320-328 /   0755-29573979   

传真:0755-29573533

邮件:tczm@tczmled.com   邮编:518000

地址:深圳市宝安区松岗街道东方大道33号第四栋

邮箱:jiangeng@tczmled.com   (投诉与合作)


(关注我们)
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________

友情链接: led光源LED灯带 | 洗地机‍ |   | 方木多片锯‍ | 泰兴减速机‍ | led灯珠‍ ‍‍ | 网带输送机‍‍    | 波峰焊‍ |   滚针轴承|   高温退火炉   |   试验筛 |   螺旋叶片 |   梅花联轴器 ‍ |   电热管‍   |   青岛电缆桥架‍‍ | N80石油套管‍   | 玻璃钢冷却塔‍ | 西安装修公司

会员登录
登录
其他帐号登录:
我的资料
留言
回到顶部