简 介: 利用ESP32中的硬件SPI掌握WS2812的显示。利用了高频三极管9018 作为输出接口反向器,确定得当的电阻参数,验证了驱动方案的硬件和软件的可行性。 关键词: WS2812,ESP32,SPI
”

智能集成LED光源 WS2812[1] 通过大略的外部接口、特有的级联方案便于利用MCU完成多个LED掌握,极大简化了LED掌握接口。比较于传统的 单片机LED IO口复用掌握方案[2] ,利用WS2812则更加的简介。

▲ 图1.1 灯珠掌握闪烁
一、芯片简介1、特点与上风在5050封装内集成有掌握电路和RGB芯片,形成完全像素点掌握;内置扫实行好整形电路,通报到级联下一节点时,不会产生旗子暗记失落真累积效应;内置复位电路与掉电复位电路;每个RGB灯都有256亮度级别,可以形成中颜色,刷新频率不低于400Hz;通过旗子暗记线完成端口级联;传输间隔在5米之内,无需增加额外电路;在刷新频率30帧/秒中,低速模式下可以掌握不少于512颗灯,高速模式下则超过1024颗灯;数据传输速率为800kbps;颜色同等性强,价格低;▲ 图1.1.1 灯带点亮后的效果
2、运用全色彩模块;全色彩柔光灯带;LED装饰灯带;室内、室外LED不规则显示屏;3、管脚封装▲ 图1.1.2 WS2812封装与管脚功能定义
二、事情事理1、事情电压根据 WS2812[3] 数据手册,它的事情电压范围在,输入旗子暗记电压在事情电压VDD±0.5V范围内。三路LED的参数:
【表2-1-1 RGB 参数】
Emitting color Wavelength(nm) Luminous intensity(mcd) Current(mA) Voltage(V) Red 620-630 550-700 16 1.8-2.2 Green 515-530 1100-1400 16 2.8~3.1 Blue 465-475 200-400 16 3.0-3.4
2、掌握协议WS2812的级联掌握协议非常大略。通过一根旗子暗记线就可以进行串行异步旗子暗记发送。
下面显示了四个WS2812通过数据性级联的办法。在串行通讯中利用不同高低电平脉冲表示数据0,1编码。
▲ 图1.2.1 级联方法与编码波形
【221. 脉冲编码参数】
脉冲 定义 韶光 偏差 T0H 0 code ,high voltage time 0.4us ±150ns T1H 1 code ,high voltage time 0.85us ±150ns T0L 0 code , low voltage time 0.85us ±150ns T1L 1 code ,low voltage time 0.4us ±150ns RES low voltage time Above 50μs
下面是三个WS2812级联发送过程对应的波形。可以看到通过发送三组24bit的编码,可以掌握三个级联的WS2812灯的颜色。数据D1是直接由MCU数据端口掌握,D2,D3,D4则是WS8212内部整形放大后再进行传输。
利用RESET编码,也便是超过50us的低电平形成WS2812输出锁定。
▲ 图1.2.2 三个WS2812级联发送过程对应的波形
每组24bit对应的的GRB编码如下所示。发送颜色顺序为GRB,字节的高位在前。
▲ 图1.2.3 每组24bit对应的的GRB编码
▲ 图1.1.3 灯带点亮后的效果
02 ESP32-SPI由于掌握WS2812的脉冲高低电平在0.85us,0.4us,韶光间隔,为了产生这样的脉冲,利用普通的软件掌握IO口是无法完成的,下面测试利用个中的 硬件SPI[4] 产生掌握脉冲旗子暗记。
一、ESP32中的硬件SPI在ESP32中具有两路硬件SPI端口,可以最快达到始终速率80MHz,这可以知足对WS2812的掌握脉冲的速率。
1、SPI缺省管脚如果利用SPI缺省配置管脚,输出速率可以达到80MHz,如果利用其它GPIO,则输出的速率则须要限定在40MHz以下。
【表2-1-1 ESP32 硬件SPI缺省端口】
管脚 HSPI(id=1) HSPI(id=2) SCK 14 18 MOSI 13 23 MISO 12 19
2、ESP32实验转接板利用 ESP32实验转接板[5] ,测试硬件SPI端口。
▲ 图2.1.1 ESP32实验转接板
利用SPI id=1,对应的SPI,MOSI,MISO的对口为,14,13,12,对应的实验转接板上的输出管脚如下图所示,从右往左分别是:
● ESP32转接板SPI管脚定义: SCK:PIN9 MISO:PIN8 MOSI:PIN7
▲ 图2.1.2 ESP32中对应的SPI,MOSI,MISO的管脚
3、测试SPI输出波形初始化SPI端口,使得输出速率为10MHz,输出数据0x55,0xaa,利用示波器不雅观察MOSI,SPI波形。
(1)测试缺省SPI模式from machine import Pin,Timer,SPIimport timehspi = SPI(1, 10000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))buf = bytes((0x55,0xaa))print(buf)while True: hspi.write(buf) time.sleep_ms(10)
通过测试波形可以看到输出SPI的频率为5MHz。SPI正常的电平为低电平。
▲ 图2.1.3 丈量SPI,MOSI的输出波形
设置输出的波特率为2.5MHz,此时便可以输出 0.4us 的低脉冲。
设置输出波特率为2.5MHz,可以产生所须要的0.4us的电平输出。波形如下图所示:
▲ 图2.1.4 设置输出波特率为2.5MHz,可以产生所须要的0.4us的电平输出
二、利用晶体管反向MOSI利用晶体管将MOSI波形进行反向,这可以:
能够知足WS2812掌握脉冲电平极性哀求。它哀求掌握旗子暗记在平时为高电平,通过低电平脉冲得到复位旗子暗记、0/1数据位旗子暗记。提高带载能力。1、旗子暗记反向电路▲ 图2.2.1 MOSI旗子暗记反向电路
2、电路测试(1)晶体管BC547由于BC547B的截止频率只有300MHz,旗子暗记通过BC547之后,引起了很大的失落真。下图显示了旗子暗记波形。
▲ 图2.2.2 MOSI 输入输出旗子暗记
(2)晶体管9018为了提高相应速率,对电路进行如下的调度:
● 电路元器件参数: Q1:9018 R1:10k R2:200
▲ 图2.2.3 电路参数修正之后输入输出波形
三、产生掌握波形1、产生RESET旗子暗记根据WS2812掌握旗子暗记协议,RESET是时长超过50us的低电平,因此,在2.5MHz的波特率下,连续输出125bit的高电平,也便是16个byte的0xff,则可以产生:个1输出,便可以产生的低电平。
from machine import Pin,Timer,SPIimport timehspi = SPI(1, 2500000, sck=Pin(14), mosi=Pin(13), miso=Pin(12), polarity=0)buf = bytes([0xff]16)print(buf)while True: hspi.write(buf) time.sleep_ms(10)
▲ 图2.3.1 连续输出16个0xff所产生的RESET旗子暗记
2、产生RGB数据根据WS2812协议,每一组RGB须要24个bit,每个bit可以有SPI输出的3个bit来表示,因此输出一组RGB数据,则须要SPI输出。
由于存在MOSI输出反向,以是对应的RGB输出的高低电平须要进行反相。
● RGB的0,1bit对应SPI: RGB-0:SPI-011 RGB-1:SPI-001
(1)转换代码from machine import Pin,Timer,SPIimport timehspi = SPI(1, 2500000, sck=Pin(14), mosi=Pin(13), miso=Pin(12), polarity=0)def byte2bin(b): bstr = bin(b)[2:] return '0'(8-len(bstr)) + bstrdef rgb2byte(r,g,b): str = byte2bin(g) + byte2bin(r) + byte2bin(b) spistr = ''.join([(lambda s: '011' if s'0' else '001')(x) for x in str]) rgbdim = [int(spistr[i8:i8+8], 2) for i in range(9)] return bytes(rgbdim)rgbbyte = rgb2byte(0xff,0x80,0x3f)print(rgbbyte)rstbyte = bytes([0xff]16)outbyte = rstbyte+rgbbytewhile True: hspi.write(outbyte) time.sleep_ms(10)(2)输出波形
输出RGB分别为:0xff, 0x80, 0x3f,对应的数据波形为:
▲ 图2.3.2 带有一个RST旗子暗记的一组RGB波形
将RGB对应的输出脉冲展开后的波形,可以检讨输出波形是否符合WS2812对应的掌握旗子暗记协议。
▲ 图2.3.3 将RGB对应的输出脉冲展开后的波形
四、测试WS28121、波形失落真编程输出RGB为(0xff,0x0,0x0),对应WS2812该当是输出赤色,但直接接入之后,WS2812输出为白色。
通过不雅观察DI的波形,可以看到它处于高电平的韶光超过400us,并且低电平大约为1.5V。这解释Q1的驱动不敷。
▲ 图2.4.1 DI波形以及对应的WS2812颜色
2、降落R1的阻值降落R1阻值,提高Q1相应韶光,以及输出低电平降落。末了将R1的阻值改换成3.3k欧姆之后,D1波形有了改进,此时WS2812的颜色与设置的参数符合了。
▲ 图2.4.2 DI波形以及对应的WS2812颜色
▲ 图2.4.3 终极对应的电路图中的参数
3、RGB转换颜色编程依次输出RGB颜色。
3、RGB转换颜色from machine import Pin,Timer,SPIimport timehspi = SPI(1, 2500000, sck=Pin(14), mosi=Pin(13), miso=Pin(12), polarity=0)def byte2bin(b): bstr = bin(b)[2:] return '0'(8-len(bstr)) + bstrdef rgb2byte(r,g,b): str = byte2bin(g) + byte2bin(r) + byte2bin(b) spistr = ''.join([(lambda s: '011' if s'0' else '001')(x) for x in str]) rgbdim = [int(spistr[i8:i8+8], 2) for i in range(9)] return bytes(rgbdim)rgbbyte = rgb2byte(0xff,0x0,0x0)rstbyte = bytes([0xff]16)outbyte = rstbyte+rgbbyte+rstbytewhile True: 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输出波形掌握下完成颜色的转换。
▲ 图2.4.4 RGB转换颜色
※ 实验总结 ※利用ESP32中的硬件SPI输出脉冲波形,掌握WS2812相应。
通过电路调度,选择了高频晶体管9018 作为输出反向晶体管,确定了放大电路参数,测试验证了利用高速SPI掌握WS2812的硬件电路和软件。
参考资料[1]
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





