页面加载中,请稍候
来源:芯片之家发布时间:2021-10-245091浏览
询问 AI
“简 介:利用ESP32中的硬件SPI控制WS2812的显示。使用了高频三极管9018 作为输出接口反向器,确定合适的电阻参数,验证了驱动方案的硬件和软件的可行性。
”
关键词:WS2812,ESP32,SPI
智能集成LED光源WS2812[1]通过简单的外部接口、特有的级联方案便于利用MCU完成多个LED控制,极大简化了LED控制接口。相比于传统的单片机LED IO口复用控制方案[2],使用WS2812则更加的简介。



根据WS2812[3]数据手册,它的工作电压范围在,输入信号电压在工作电压VDD±0.5V范围内。三路LED的参数:
【表2-1-1 RGB 参数】
Emitting colorWavelength(nm)Luminous intensity(mcd)Current(mA)Voltage(V)Red620-630550-700161.8-2.2Green515-5301100-1400162.8~3.1Blue465-475200-400163.0-3.4WS2812的级联控制协议非常简单。通过一根信号线就可以进行串行异步信号发送。
下面显示了四个WS2812通过数据性级联的方式。在串行通讯中使用不同高低电平脉冲表示数据0,1编码。

【221. 脉冲编码参数】
脉冲定义时间误差T0H0 code ,high voltage time0.4us±150nsT1H1 code ,high voltage time0.85us±150nsT0L0 code , low voltage time0.85us±150nsT1L1 code ,low voltage time0.4us±150nsRESlow voltage timeAbove 50μs下面是三个WS2812级联发送过程对应的波形。可以看到通过发送三组24bit的编码,可以控制三个级联的WS2812灯的颜色。数据D1是直接由MCU数据端口控制,D2,D3,D4则是WS8212内部整形放大后再进行传输。
使用RESET编码,也就是超过50us的低电平形成WS2812输出锁定。

每组24bit对应的的GRB编码如下所示。发送颜色顺序为GRB,字节的高位在前。


由于控制WS2812的脉冲高低电平在0.85us,0.4us,时间间隔,为了产生这样的脉冲,使用普通的软件控制IO口是无法完成的,下面测试使用其中的硬件SPI[4]产生控制脉冲信号。
在ESP32中具有两路硬件SPI端口,可以最快达到始终速率80MHz,这可以满足对WS2812的控制脉冲的速率。
如果使用SPI缺省配置管脚,输出速率可以达到80MHz,如果使用其它GPIO,则输出的速率则需要限制在40MHz以下。
【表2-1-1 ESP32 硬件SPI缺省端口】
管脚HSPI(id=1)HSPI(id=2)SCK1418MOSI1323MISO1219利用ESP32实验转接板[5],测试硬件SPI端口。

使用SPI id=1,对应的SPI,MOSI,MISO的对口为,14,13,12,对应的实验转接板上的输出管脚如下图所示,从右往左分别是:
●ESP32转接板SPI管脚定义:
SCK:PIN9
MISO:PIN8
MOSI:PIN7

初始化SPI端口,使得输出速率为10MHz,输出数据0x55,0xaa,使用示波器观察MOSI,SPI波形。
frommachineimportPin,Timer,SPI
importtime
hspi = SPI(1,10000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
buf = bytes((0x55,0xaa))
print(buf)
whileTrue:
hspi.write(buf)
time.sleep_ms(10)
通过测试波形可以看到输出SPI的频率为5MHz。SPI正常的电平为低电平。

设置输出的波特率为2.5MHz,此时便可以输出 0.4us 的低脉冲。
设置输出波特率为2.5MHz,可以产生所需要的0.4us的电平输出。波形如下图所示:

使用晶体管将MOSI波形进行反向,这可以:

由于BC547B的截止频率只有300MHz,信号通过BC547之后,引起了很大的失真。下图显示了信号波形。

为了提高响应速度,对电路进行如下的调整:
●电路元器件参数:
Q1:9018
R1:10k
R2:200

根据WS2812控制信号协议,RESET是时长超过50us的低电平,因此,在2.5MHz的波特率下,连续输出125bit的高电平,也就是16个byte的0xff,则可以产生:个1输出,便可以产生的低电平。
frommachineimportPin,Timer,SPI
importtime
hspi = SPI(1,2500000, sck=Pin(14), mosi=Pin(13), miso=Pin(12),
polarity=0)
buf = bytes([0xff]*16)
print(buf)
whileTrue:
hspi.write(buf)
time.sleep_ms(10)

根据WS2812协议,每一组RGB需要24个bit,每个bit可以有SPI输出的3个bit来表示,因此输出一组RGB数据,则需要SPI输出。
由于存在MOSI输出反向,所以对应的RGB输出的高低电平需要进行反相。
●RGB的0,1bit对应SPI:
RGB-0:SPI-011
RGB-1:SPI-001
frommachineimportPin,Timer,SPI
importtime
hspi = SPI(1,2500000, sck=Pin(14), mosi=Pin(13), miso=Pin(12),
polarity=0)
defbyte2bin(b):
bstr = bin(b)[2:]
return'0'*(8-len(bstr)) + bstr
defrgb2byte(r,g,b):
str = byte2bin(g) + byte2bin(r) + byte2bin(b)
spistr =''.join([(lambdas:'011'ifs*'0'else'001')(x)forxinstr])
rgbdim = [int(spistr[i*8:i*8+8],2)foriinrange(9)]
returnbytes(rgbdim)
rgbbyte = rgb2byte(0xff,0x80,0x3f)
print(rgbbyte)
rstbyte = bytes([0xff]*16)
outbyte = rstbyte+rgbbyte
whileTrue:
hspi.write(outbyte)
time.sleep_ms(10)
输出RGB分别为:0xff, 0x80, 0x3f,对应的数据波形为:

将RGB对应的输出脉冲展开后的波形,可以检查输出波形是否符合WS2812对应的控制信号协议。

编程输出RGB为(0xff,0x0,0x0),对应WS2812应该是输出红色,但直接接入之后,WS2812输出为白色。
通过观察DI的波形,可以看到它处于高电平的时间超过400us,并且低电平大约为1.5V。这说明Q1的驱动不足。

降低R1阻值,提高Q1响应时间,以及输出低电平降低。最后将R1的阻值更换成3.3k欧姆之后,D1波形有了改善,此时WS2812的颜色与设置的参数相符了。


编程依次输出RGB颜色。
frommachineimportPin,Timer,SPI
importtime
hspi = SPI(1,2500000, sck=Pin(14), mosi=Pin(13), miso=Pin(12),
polarity=0)
defbyte2bin(b):
bstr = bin(b)[2:]
return'0'*(8-len(bstr)) + bstr
defrgb2byte(r,g,b):
str = byte2bin(g) + byte2bin(r) + byte2bin(b)
spistr =''.join([(lambdas:'011'ifs*'0'else'001')(x)forxinstr])
rgbdim = [int(spistr[i*8:i*8+8],2)foriinrange(9)]
returnbytes(rgbdim)
rgbbyte = rgb2byte(0xff,0x0,0x0)
rstbyte = bytes([0xff]*16)
outbyte = rstbyte+rgbbyte+rstbyte
whileTrue:
rgbbyte = rgb2byte(0xff,0x0,0x0)
outbyte = rstbyte+rgbbyte+rstbyte
hspi.write(outbyte)
time.sleep_ms(500)
rgbbyte = rgb2byte(0x0,0xff,0x0)
outbyte = rstbyte+rgbbyte+rstbyte
hspi.write(outbyte)
time.sleep_ms(500)
rgbbyte = rgb2byte(0x0,0x0,0xff)
outbyte = rstbyte+rgbbyte+rstbyte
hspi.write(outbyte)
time.sleep_ms(500)
下面显示了WS2812在SPI输出波形控制下完成颜色的转换。

利用ESP32中的硬件SPI输出脉冲波形,控制WS2812响应。
通过电路调整,选择了高频晶体管9018 作为输出反向晶体管,确定了放大电路参数,测试验证了利用高速SPI控制WS2812的硬件电路和软件。
WS2812:https://wenku.baidu.com/view/c8b79d88fad6195f312ba6d3.html
[2]单片机LED IO口复用控制方案:https://zhuoqing.blog.csdn.net/article/details/116725947
[3]WS2812:https://d2j2m4p6r3pg95.cloudfront.net/module_files/led-cube/assets/datasheets/WS2812B.pdf
[4]硬件SPI:https://docs.micropython.org/en/latest/esp32/quickref.html#hardware-spi-bus
[5]ESP32实验转接板:https://zhuoqing.blog.csdn.net/article/details/115563474
新闻来源:芯片之家,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!


2026-07-01