资讯详情

利用硬件SPI控制WS2812,驱动1024颗灯珠

0b964f29eefc00323c03d05f6be0fa95.png

简 介: 利用ESP32中的硬件SPI控制WS显示2812。9018年采用高频三极管 确定适当的电阻参数作为输出界面反向器,验证了驱动方案的硬件和软件的可行性。关键词: WS2812,ESP32,SPI

01 WS2812

??智能集成LED光源 WS2812[1] 易于使用简单的外部接口和独特的级联方案MCU完成多个LED控制,极大简化了LED控制接口。与传统接口相比。 单片机LED IO控制方案口复用[2] ,使用WS2812更简介。

▲ 图1.1 灯珠控制闪烁

一、芯片简介

1.特点和优势

  • 控制电路集成在5050包装中RGB芯片,形成完整的像素点控制;

  • 内置扫描执行整形电路,传输到级联下一节点,无信号失真累积效应;

  • 内置复位电路和掉电复位电路;

  • 每个RGB灯具有256亮度,可形成中色,刷新频率不低于400Hz;

  • 端口级联通过信号线完成;

  • 传输距离在5米以内,无需增加额外电路;

  • 低速模式下可控制不少于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

??在ESP三十二中有两个硬件SPI端口可以最快达到80的总速率MHz,可以满足对WS控制脉冲速率的2812。

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,SPI
import time

hspi = 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,SPI
import time

hspi = 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,SPI
import time

hspi = 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)) + bstr

def 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[i*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+rgbbyte

while True:
    hspi.write(outbyte)
    time.sleep_ms(10)

(2)输出波形

  输出RGB分别为:0xff, 0x80, 0x3f,对应的数据波形为:

▲ 图2.3.2 带有一个RST信号的一组RGB波形

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

▲ 图2.3.3 将RGB对应的输出脉冲展开后的波形

四、测试WS2812

1、波形失真

  编程输出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,SPI
import time

hspi = 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)) + bstr

def 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[i*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+rstbyte

while 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

标签: p6三极管内置电阻led灯珠

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台