- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 + 关注
分享到:
一、ws2812b rgb led介绍:
主要特点
● IC控制电路与LED点光源公用一个电源。 ● 控制电路与RGB芯片集成在一个5050封装的元器件中,构成一个完整的外控像素点。 ● 内置信号整形电路,任何一个像素点收到信号后经过波形整形再输出,保证线路波形畸变不会累加。 ● 内置上电复位和掉电复位电路。 ● 每个像素点的三基色颜色可实现256级亮度显示,完成16777216种颜色的全真色彩显示,扫描频率不低于 400Hz/s。 ● 串行级联接口,能通过一根信号线完成数据的接收与解码。 ● 任意两点传传输距离在不超过3米时无需增加任何电路。 ● 当刷新速率30帧/秒时,级联数不小于1024点。 ● 数据发送速度可达800Kbps。 ● 光的颜色高度一致,性价比高。
主要应用领域
● LED全彩发光字灯串,LED全彩软灯条硬灯条,LED护栏管。 ● LED点光源,LED像素屏,LED异形屏,各种电子产品,电器设备跑马灯。
产品概述
WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每 个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内 部振荡器和12V高压可编程定电流控制部分,有效保证了像素点光的颜色高度一致。 数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先 送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路 整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素 点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。 LED具有低电压驱动,环保节能,亮度高,散射角度大,一致性好,超低功率,超长寿命等优点。将控制电 路集成于LED上面,电路变得更加简单,体积小,安装更加简便。
根据下图WS2812的时序,采用SPI+DMA的方式驱动,用一个字节的SPI数据来表示WS2812的一位数据,一个灯珠需要24位数据,多个灯珠可级联,数据依次转发。
SPI采用8位数据(1个字节),高位在前模式,频率为f Mbit/s,即f bit/us。则1个字节t=8/fus,T0H=n/8*t=n/f,其中n为SPI发送数据连续的“1”个数;WS2812B的一个数据“位”为0.95~1.55us,对于0码,高电平时间应为0.25us~0.55us,n/f应满足0.25
复制代码
时钟配置如下,需保证SPI的速度满足上面的计算要求:
开启DMA:
底层驱动写好了,就可以移植下应用了,我这里简单的移植了部分Adafruit_NeoPixel的函数库;
-
void WS2812B_Init(void)//should >50us
-
{
-
uint8_t ResCode[50]={0};
-
HAL_SPI_Transmit_DMA(&hspi1, ResCode, 50);
-
}
-
void PixelUpdate(void)//should >24us
-
{
-
uint8_t rst[25]={0};
-
HAL_SPI_Transmit_DMA(&hspi1, rst, 25);
-
}
-
void Send_8bits(uint8_t dat)
-
{
-
uint8_t i=0;
-
uint8_t CodeOne=0x7c;//3e
-
uint8_t CodeZero=0x70;//38
-
-
for (i=0;i<8;i++)
-
{
-
if(dat&0x80==0x80)
-
{
-
HAL_SPI_Transmit_DMA(&hspi1, &CodeOne, 1);
-
}
-
else
-
{
-
HAL_SPI_Transmit_DMA(&hspi1, &CodeZero, 1);
-
}
-
dat=dat<<1;
-
}
-
}
-
//G--R--B
-
//MSB first
-
void Send_2811_24bits(uint8_t RData,uint8_t GData,uint8_t BData)
-
{
-
Send_8bits(GData);
-
Send_8bits(RData);
-
Send_8bits(BData);
-
}
-
-
uint8_t rBuffer[PIXEL_MAX]={0};
-
uint8_t gBuffer[PIXEL_MAX]={0};
-
uint8_t bBuffer[PIXEL_MAX]={0};
-
-
void SetPixelColor(uint16_t n, uint32_t c)
-
{
-
uint8_t i=0;
-
-
rBuffer[n]=(uint8_t)(c>>16);
-
gBuffer[n]=(uint8_t)(c>>8);
-
bBuffer[n]=(uint8_t)c;
-
-
for(i=0;i<;PIXEL_MAX;i++)
-
{
-
Send_2811_24bits(rBuffer,gBuffer,bBuffer);
-
}
-
PixelUpdate();
- }
提供以下几个函数供调用:
只需把下图2个文件添加到自己的工程即可:
WS2812B LED模块一般由3个引脚,VCC要接5V,且要根据灯的个数选好电源,每个灯珠最大60mA,IN脚连接Gokit STM32底板的D11脚即MOSI(同样可以使用其他型号的STM32):
最后可以看到如下效果:
(0 )
(0 )
回复
举报
- xiaomiking
-
1148 发帖6357 回复18614 积分
- 私信他 +关注
- phoenix20111116
-
124 发帖361 回复1671 积分
- 私信他 +关注
- 185478492hjg
-
0 发帖7 回复114 积分
- 私信他 +关注
发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖