led灯珠亮度等级rgb珠型)
“
概要:用ESP32的硬件SPI控制WS2812的显示。将高频三极管9018用作输出接口反向器,确定适当的电阻参数,验证了驱动方案的硬件和软件的可行性。
关键字:WS2812,ESP32,SPI
”
01 WS2812
智能集成LED光源WS28121通过简单的外部接口,通过独特的级联方式,容易利用MCU完成多个led控制,使led控制接口极为简化。与以往的单片机ledIO端口复用控制方式2相比,更概要是使用WS2812。
▲图1.1串珠控制闪烁
一、芯片介绍1、特征和优势在5050包内集成控制电路和rgb芯片,形成完全的像素点控制。内置扫执行在下一个节点级联时不产生信号失真累积效果的整形电路。内置复位电路和漏电复位电路;各rgb灯为256亮度电平,能够形成中色,刷新频率不低于400Hz。通过信号线完成端口级联。传输距离在5米以内,不需要增加附加电路。在刷新频率30帧/秒中,在低速模式下可以控制512个以上的灯,在高速模式下可以控制1024个以上的灯。数据传输速度为800kbps。颜色一致性强,价格低。
▲图1.1.1灯带亮灯后的效果
2、应用全色模块。全色柔性灯带;led装饰灯带;室内、室外led不规则显示;3,管脚包装
▲图1.1.2WS2812包和管脚功能定义
二、动作原理1、动作电压
WS2812根据3数据手册,该动作电压范围在输入信号电压为动作电压VDD±0.5V的范围内。3路径led参数:
表2-1-1rgb参数
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的级联控制协议非常简单。可以通过一条信号线发送串行异步信号。
以下,表示4个WS2812通过数据性级联的方法。数据0、1的编码在串行通讯中使用不同的高电平脉冲来表示。
▲图1.2.1级联方法和编码波形
221.脉冲编码参数
脉冲定义时间误差T0H0code、high volge time 0.4us±150ns T1code、high volge time 0.85us±150ns T0L0code、low voltage time 0.85us±150ns T1code、low volge time 0.4us±150ns RES low voltage time Above 50μs
接着,表示与3个WS2812级联发送处理对应的波形。通过发送3组24bit的编码,可知能够控制3个级联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端口,但以下测试使用其中的硬件SPI4生成控制脉冲信号。
一、ESP32的硬件SPI
在ESP32中有两个硬件SPI端口,最大能够达到80MHz的经常速度,这能够满足相对于WS2812的控制脉冲的速度。
1、SPI默认管脚
SPI在使用默认配置管脚的情况下,输出速率能够达到80MHz,在使用其他GpIO的情况下,输出速率需要限制在40MHz以下。
表2-1-1ESP32硬件SPI默认端口
管脚 HSPI(id=1) HSPI(id=2) SCK 14 18 MOSI 13 23 MISO 12 19
2,ESP32实验适配器板
ESP32使用实验适配器板5测试硬件SPI端口。
▲图2.1.1ESP32测试适配器板
SPI使用id=1,对应的SPI、MOSI、MISO的对口为14,13,12,对应的实验适配器板上的输出管脚如下图所示从右向左分别为:
●ESP32适配器板SPI管脚定义:
SCK:Pin9
MISO:Pin8
MOSI:Pin7
▲图2.1.2ESP32的SPI、MOSI、MISO的管脚
3,测试SPI输出波形
以输出速率为10MHz的方式初始化SPI端口,使用输出数据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,信号反转电路(0113)
▲图2.2.1MOSI信号反向电路
2,电路测试(1)晶体管BC547
由于BC547B的截止频率只有300MHz,所以当信号通过BC547时,会产生较大的失真。下面的图表示信号波形。
▲图2.2.2MOSI输入输出信号
(2)晶体管9018
为了提高响应速度,如下调整电路。
●电路部件参数:
Q1:9018
R1:10k
R2:200
▲图2.2.3修正了回路参数后输入输出波形
三、生成控制波形1,生成RESET信号
根据WS2812控制信号协议,RESET是时长超过50us的低电平,因此,如果以2.5MHz的波特率连续输出125bit的高电平、即16byte的0xff,则能够生成一个输出可发生的低电平。
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表示,所以输出1组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 #39;0#39;*(8-len(bstr)) + bstrdef rgb2byte(r,g,b): str = byte2bin(g) + byte2bin(r) + byte2bin(b) spistr = #39;#39;.join((lambda s: #39;011#39; if s*#39;0#39; else #39;001#39;)(x) for x in str) rgbdim = int(SPIstri*8:i*8+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.32rst信号组rgb波形
与rgb对应的输出脉冲展开的波形能够检查输出波形是否与WS2812对应的控制信号协议一致。
▲展开与图2.3.rgb对应的输出脉冲的波形
四、测试WS28121、波形畸变
编程输出rgb是0xff、0x0、0x0,对应的WS2812应该是输出红色,但是直接访问后,WS2812是输出白色。
观察DI的波形,发现其处于超过400us的高电平,处于约1.5V的低电平。这表示Q1的驱动不足。
▲图2.4.1DI波形及对应的WS2812颜色
降低2、R1的电阻值
降低R1电阻值,增加Q1响应时间,降低输出低电平。最后,将R1的电阻值换成3.3k欧姆后,D1波形得到改善,与此时WS2812的颜色所设定的参数一致。
▲图2.42DI波形及对应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 #39;0#39;*(8-len(bstr)) + bstrdef rgb2byte(r,g,b): str = byte2bin(g) + byte2bin(r) + byte2bin(b) spistr = #39;#39;.join((lambda s: #39;011#39; if s*#39;0#39; else #39;001#39;)(x) for x in str) rgbdim = int(SPIstri*8:i*8+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在输出波形控制下完成了颜色转换。
▲图2.4.rgb颜色转换
※实验总结※
使用ESP32的硬件SPI输出脉冲波形,控制WS2812响应。
通过电路调整,选择高频晶体管9018作为输出逆晶体管,确定放大电路参数,测试验证了使用高速SPI控制WS2812的硬件电路和软件。
参考资料
1
WS2812: https://wenku.baidu.com/view/c8b79d88fad6195f312ba6d3.html
2
单片机ledIO端口多重控制方式:https:/zhuang。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