0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是WS2812B?WS2812B灯带是怎么连接的呢?

冬至子 来源:小李的创客实验室 作者:初出茅庐的小李 2023-07-08 14:53 次阅读

什么是WS2812B?

WS2812B是一款全彩LED控制IC,单总线控制,何为单总线我的理解就是数据线在一根线上传输的控制方式就是单总线。其实要把灯点亮仅有一根线是不行的,还需要电源线和地线给其供电。

WS2812B灯带是怎么连接的呢?

图片

就是一颗灯珠串联另外一个灯珠,信号通过一根数据线相连起来控制等的亮灭就是在这根信号线上发送数据。

WS2812B灯带的数据是什么样的呢?

图片

在说数据格式之前先来补充一下关于色彩的知识点,就是三原色,红绿蓝,也就是我们常说的RGB,R就是RED,G就是GREEN,B就是BLUE,一个彩色可以用这三种颜色的比例来混合出来。

为什么是红绿蓝?

三原色的原理不是出于物理原因,而是由于生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,到的刺激略大于辨别绿色的细胞,人的感觉是黄色;如果辨别黄绿色的细胞受到的刺激大大高于辨别绿色的细胞,人的感觉是红色。虽然三种细胞并不是分别对红色、绿色和蓝色最敏感,但这三种光可以分别对三种锥形细胞产生刺激。

既然“三原色的原理不是出于物理原因,而是由于生理原因造成的”,那么前段所说的“用三种原色的光以不同的比例加合到一起,形成各种颜色的光”显然就不大合适。使用三原色并不足以重现所有的色彩,准确的说法应该是“将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。”只有那些在三原色的色度所定义的颜色三角内的颜色,才可以利用三原色的光以非负量相加混合得到。

例如,红光与绿光按某种比例复合,对三种锥状细胞刺激后产生的色觉可与眼睛对单纯的黄光的色觉等效。但绝不能认为红光与绿光按某种比例复合后生成黄光,或黄光是由红光和绿光复合而成的。

24bit数据如何构造?

既然是24bit数据代表三种颜色,我们就要首先知道一个bit的意义是什么,我们传统意义上来说1个bit代表一个数据位,但是对于数据位bit的理解好像就是“1”或者“0”在数电里我们很容易把高低电平跟逻辑1和逻辑0对应起来,但是表示灯珠的逻辑电平不是简单的高低电平。

在数值上0xFFFFFF就是24bit的1,0x000000就是24bit的0.这里有8个bit代表颜色G分量,G7G6G5G4G3G2G1G0,有8个bit代表R分量R7R6R5R4R3R2R1R0,有8个bit代表B分量B7B6B5B4B3B2B1B0,当不同分量组合时候就会有不同的数据产生,这个数据背后其实是逻辑电平,这里要说明的是彩灯的逻辑“1”并不是简简单单的高电平,彩灯的逻辑“0”也不是简简单单的低电平。

WS2812B的逻辑“1”和逻辑“0”

图片

由上图可知“0”码和“1”码都是既有高电平又有低电平不过高电平和低电平的比例不同,这点很好理解,重点是分析一下它的特点,首先直观的特点就是编码“0”的电平高电平时间短一些低电平时间长一些,这也恰好符合我们的逻辑毕竟它还是低电平多一些的,编码“1”的电平高电平时间就长一些,而低电平就短一些。

但是不管是高电平还是低电平他们占用整个时间长度是一样的,这里还有一个很长的低电平这个代表复位信号。

WS2812B控制波形的精准描述如何?

这里涉及到严格的数学描述了,长一点是多长?短一点是多短?这个肯定是有标准或者是约束的

图片

理论上来说,高电平时长和低电平时长加起来应该是0.4us+0.85us或者0.85us+0.4us也就是说总共要占用1.25us的时间才可以编码出来一个“0”或者“1”出来。复位是要求50us以上,显然是要比编码的0或者1占用的时间要多的。

当然既然是电路的高低电平时长就会引入误差这个在误差允许的范围内我们可以接受,这个范围就是上下不超过150ns这里是ns比us还要小的时间,这个其实时间要求还是很严格的。

如何编程实现?

这里我选用我手上一个正点原子开发板,网上基于这种方式有很多驱动方案,有直接驱动也有PWM驱动也有SPI驱动,还有PWM+DMA驱动,还有用一些开源库进行驱动的,我感觉各种驱动方式各有优缺点,我先来尝试我认为最容易想到的方式(不一定是最好的或者最合适的)玩一下,后面会根据这些方式的特点进行一个总结,在相对应的需求下选用合适的方案是我们应该重点考虑的。

实现us级别延时

硬件延时NOP实现

滴答定时器中断实现

普通定时器实现

先用nop实现个us延时我手上的板子是精英板主控芯片STM32F103ZET6系统频率是72M,一个NOP的周期就是1/72M单位是s = 1/72=单位是us,换句话说也就是72个NOP浪费的时间是1us,0.4us就是0.4*72=28.8个NOP取整数29,0.2个NOP的误差,因为一个NOP是1/72 1000 个约等于是13.88个ns 所以0.2个NOP引起的误差在150ns以内可以接受。

0.8572=61.2NOP同样取整数61个NOP,这样组合一下编码0的波形和编码1的波形就有了,实现一个 us函数 50us的低电平也可以产生复位信号,理论分析完毕咱直接上代码测试。

void RGB_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能PA,PD端口时钟


 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;         //LED0-- >PA.8 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);           //根据设定参数初始化GPIOA.8


 GPIO_ResetBits(GPIOB,GPIO_Pin_12);              //PD.2 输出高
}
 
void Bit_0(void)
{
   GPIO_SetBits(GPIOB,GPIO_Pin_12);              //PB12 输出高
   Delay_L();
   GPIO_ResetBits(GPIOB,GPIO_Pin_12);                //PB12 输出高
   Delay_H();
}
void Bit_1(void)
{
   GPIO_ResetBits(GPIOB,GPIO_Pin_12);              //PB12 输出高
   Delay_H();
   GPIO_SetBits(GPIOB,GPIO_Pin_12);                //PB12 输出高
   Delay_L();
}


void RGB_Set(void)
{
  for(uint8_t i = 0;i< 8;i++)
  {
    Bit_1();
  }
  for(uint8_t i = 0;i< 8;i++)
  {
    Bit_0();
  }
  for(uint8_t i = 0;i< 8;i++)
  {
    Bit_1();
  }
//  for(uint8_t i = 0;i< 24;i++)
//  {
//    delay_us(100);
//  }
}
void Delay_L(void)
{
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
}


void Delay_H(void)
{
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
  __nop();
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LED控制
    +关注

    关注

    0

    文章

    38

    浏览量

    16785
  • RGB
    RGB
    +关注

    关注

    4

    文章

    763

    浏览量

    57412
  • 定时器中断
    +关注

    关注

    0

    文章

    46

    浏览量

    11025
  • PWM驱动
    +关注

    关注

    0

    文章

    26

    浏览量

    1130
  • WS2812B
    +关注

    关注

    1

    文章

    38

    浏览量

    1920
收藏 人收藏

    评论

    相关推荐

    哪位大神有完整的STM32F205驱动WS2812B的程序

    哪位大神有完整的STM32F205驱动WS2812B的程序
    发表于 09-03 18:08

    使用ESP8266驱动WS2812B型RGB LED智能制作分享

    这个智能方案很不错,只用了一个无线WIFI esp8266芯片,驱动ws2812b型RGB LED,效果很赞,在群里看到的,特分享下,若是侵犯了版权,联系我删除就行了
    发表于 07-16 04:35

    怎么使用Arduino控制采用WS2812B可独立寻址的LED

    如何使用Arduino控制采用WS2812B可独立寻址的LED
    发表于 06-19 11:22

    WS2812B RGB全彩LED

    WS2812B RGB全彩LED珠,只需通过一根信号线控制多个显示,本教程使用X-CTR100控制器驱动WS2812环。原理
    发表于 08-06 08:15

    怎样给WS2812B发送数据

    1. 对于写驱动来说WS2812B芯片手册主要就是看通讯。简单来说就是给WS2812B发送数据,数据就是RGB对应的值,先发高位,按照GRB的顺序发送数据。通常我们用高电平表示数字信号“1”,低电平
    发表于 02-22 06:51

    怎样使用PWM+DMA的方式去驱动WS2812B

    PWM+DMA 驱动 WS2812一、项目要求(主要目的)使用 PWM+DMA 的方式驱动 WS2812B, 并每隔 800ms 随机显示不同颜色。(附加目的)探索一下 STM32 的极限性,内容
    发表于 02-22 06:42

    ws2812b led条做远程区域面板控制器的教程

    描述WS2812B 远程区域面板控制器我用ws2812b led条做了一个面板,你可以把覆盆子前面的动画放到面板上使用此板,您可以控制面板并将其放置在任何有 wifi 的地方PCB代码https://github.com/du
    发表于 07-29 07:16

    使用WS2812b Led条的diy光剑光剑控制器

    描述使用 WS2812b Led 条的 diy 光剑光剑控制器,包括用于声音的微型 SD 插槽、用于运动跟踪的 6 轴传感器和用于光剑声音的扬声器。通过板载 USB 端口和 Arduino IDE 进行编程。
    发表于 08-25 07:40

    基于GD32F427开发板点亮WS2812B炫彩灯环的设计实现

    1、如何点亮WS2812B炫彩灯环  我有一个WS2812B炫彩灯环,搭配精选的背景  在玩过的板子上,我都要把它点亮。  关于WS2812B的介绍资料,网上有很多,这里就不细说了,
    发表于 11-25 15:51

    esp32如何连接WS2812B LED?

    我买了 esp32 控制器,我想连接 WS2812B LED(5V 5050 150 LED IP30)。LED 的红线连接到 5v 引脚,白色连接到 Gnd 引脚,绿色
    发表于 04-12 07:34

    WS2812B多了怎么保证时序的正确?

    WS2812B多了,怎么保证时序的正确。
    发表于 09-20 08:14

    WS2812B最后一个的颜色总是不对,是什么原因造成的?

    WS2812B最后一个的颜色总是不对
    发表于 09-20 07:24

    【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动

    【有趣的全彩LED | 编程】用STM32 HAL库让WS2812B为你所动
    发表于 12-05 15:06 34次下载
    【有趣的全彩LED | 编程】用STM32 HAL库让<b class='flag-5'>WS2812B</b>为你所动

    Arduino WS2812B LED灯带设计方案

    Arduino WS2812B LED灯带可单独控制每个LED的亮度和颜色,提供了一种简单而酷炫的LED效果体验。
    发表于 04-24 08:36 1.1w次阅读
    Arduino <b class='flag-5'>WS2812B</b> LED灯带设计方案

    WS2812B遥控灯控制器

    电子发烧友网站提供《WS2812B遥控灯控制器.zip》资料免费下载
    发表于 11-25 09:16 7次下载
    <b class='flag-5'>WS2812B</b>遥控灯控制器