本帖最后由 HonestQiao 于 2022-11-20 00:14 编辑
#申请原创#
我有一个宝贝WS2812B灯环,玩过的板子,我都要给点亮一番。


一、WS2812B控制信号了解:
WS2812B的具体介绍,这里就不详细说明了,在网上,有大量的文章资料进行说明。
要点亮WS2812B,重点在于理解以下要点:
- WS2812B是通过单总线控制的,也就是一根信号线,控制所有的LED
- WS2812B每收到一个特定的信号时,会认为收到了0码或者1码:信号总线上,高电平保持1s,低电平保持0.25s,则认为收到了1码;反之,如果高电平保持0.25s,低电平保持1s,则认为收到了0码。
- 每8个0/1码,对应一种颜色控制,我们可以理解为1个8位二进制,所以范围为0~255;一颗LED,共有三种颜色,接受顺序为GRB,每种颜色取值范围在0~255,十六进制0x00~0xFF;也就是控制一颗灯珠,需要3组8个的0/1码,一个24个0/1码
- 如果要控制多颗灯珠,则连续发送多组上述数据即可;及时某颗灯珠熄灭,也需要发送对应的0码,使其不亮。
- 如果要多次发送控制数据,则两次之间,需要低电平保持至少50us
了解了以上信息,我们就可以考虑使用NBK-RD8x3x核心开发板来进行控制。
二、NBK-RD8x3x核心开发板能否满足要求:
从上面的说明,可以看到WS2812B对信号时序有特定的要求,这就需要我们的控制板能够满足这些要求。
进过一番测试,确认在NBK-RD8x3x核心开发板上,直接通过控制IO接口的高低电平,即可满足要求。
通过官方资料了解到:RD8T36 系列具有超高速 1T 8051 CPU 内核,运行频率高达 32MHz。
那么,如果运行在32MHz,则每一个时钟周期的时间为:T0=1/fsoc=1/32MHz=0.03125us
WS2812B要求的最小控制时间细腻度为0.25us,也就是8个T0,因为 0.25us / T0 = 0.25us / 0.03125us = 8.
在C51上,使用1个nop(),就表示一次时钟周期,那么使用8次nop(),就能够实现0.25us的时间控制了。
做好了以上前期准备工作,我们就可以开始正式的工作了。
三、连线:
在NBK-RD8x3x核心开发板的核心开发板上,有两排共4组Arduino管脚,具体如下:
我使用的WS2812B灯环,有DIN和OUT两个接口,控制信号从DIN接入,OUT用于级联下级。
DIN上有三根线,就接到Arduino管脚上,包括5V、GND和信号控制引脚。信号控制引脚,选择了D8。
从官方提供的电路原理图,可以了解到D8具体对应的IO口:
从上图中,可以了解到D8对应的IO口为P06。
最终实物连接如下:
四、代码编写:
万事俱备,只欠代码。
具体的代码如下:WS2812B_Init.c
|