WS2812简介
WS2812B-5050是一个集控制电路与发光电路于一体的智能外控LED光源;其外型采用最新的molding封装工艺,将IC与发光芯片封装在一个5050的封装尺寸中,每个元件即为一个像素点;像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。下图为我所采用的25位的WS2812B RGB LED开发板。
模组选型
主控方面选择STC15系列的STC15W204S,这是一款只有8个引脚的高性能单片机,相对于传统的8051他的时钟速度更快,外围电路不需要太多内部集成了ICR晶振可供选择,在下载时勾选上就好,在驱动WS2812的过程中普通的12T单片机不是很好做到精准控制时序,所以选择次单片机IO口虽然小但是功能够用就好。具体图片如下图所示:
关于WS2812的时序解析
由此可以看的出来WS2812对时序还是要求比较严格的,需要到ns级别,我们也可以看到发0码的时序和发1码的时序是刚好相反的。
发送数据格式解析
上图中我们可以知道在发送数据时是按照GRB的顺序高位先发的。
部分代码
发送 0,1码时序,此时序由逻辑分析仪拉波形得出,时间上准确无误。
void WS2812_bit(bit data_bit)
{
if(data_bit)
{
LED=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
LED=0;
}
else
{
LED=1;
_nop_();_nop_();_nop_();_nop_();
LED=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
}
}
发送24位数据分开解析,封装此函数,能更容易移植改变灯的颜色直接根据RGB值设置就好
void WS2812_rand_color(unsigned char R,unsigned char G,unsigned char B)
{
WS2812_bit(G&0X80);WS2812_bit(G&0X40);WS2812_bit(G&0X20);WS2812_bit(G&0X10);
WS2812_bit(G&0X08);WS2812_bit(G&0X04);WS2812_bit(G&0X02);WS2812_bit(G&0X01);
WS2812_bit(R&0X80);WS2812_bit(R&0X40);WS2812_bit(R&0X20);WS2812_bit(R&0X10);
WS2812_bit(R&0X08);WS2812_bit(R&0X04);WS2812_bit(R&0X02);WS2812_bit(R&0X01);
WS2812_bit(B&0X80);WS2812_bit(B&0X40);WS2812_bit(B&0X20);WS2812_bit(B&0X10);
WS2812_bit(B&0X08);WS2812_bit(B&0X04);WS2812_bit(B&0X02);WS2812_bit(B&0X01);
}
功能现象
可以参考下图亮灯效果:
总结
长期发布此类文章,谢谢大家的关注与喜欢,代码有需求的留言再评论区邮箱获取哦。