| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> WS2812串行可控彩色LED灯珠 -> 正文阅读 |
|
[嵌入式]WS2812串行可控彩色LED灯珠 |
?
|
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 |
??WS2812的级联控制协议非常简单。通过一根信号线就可以进行串行异步信号发送。
??下面显示了四个WS2812通过数据性级联的方式。在串行通讯中使用不同高低电平脉冲表示数据0,1编码。
▲ 图1.2.1 级联方法与编码波形
脉冲 | 定义 | 时间 | 误差 |
---|---|---|---|
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 灯带点亮后的效果
?
??由于控制WS2812的脉冲高低电平在0.85us,0.4us,时间间隔,为了产生这样的脉冲,使用普通的软件控制IO口是无法完成的,下面测试使用其中的 硬件SPI 产生控制脉冲信号。
??在ESP32中具有两路硬件SPI端口,可以最快达到始终速率80MHz,这可以满足对WS2812的控制脉冲的速率。
??如果使用SPI缺省配置管脚,输出速率可以达到80MHz,如果使用其它GPIO,则输出的速率则需要限制在40MHz以下。
管脚 | HSPI(id=1) | HSPI(id=2) |
---|---|---|
SCK | 14 | 18 |
MOSI | 13 | 23 |
MISO | 12 | 19 |
??利用 ESP32实验转接板 ,测试硬件SPI端口。
▲ 图2.1.1 ESP32实验转接板
??使用SPI id=1,对应的SPI,MOSI,MISO的对口为,14,13,12,对应的实验转接板上的输出管脚如下图所示,从右往左分别是:
SCK
:PIN9
MISO
:PIN8
MOSI
:PIN7
▲ 图2.1.2 ESP32中对应的SPI,MOSI,MISO的管脚
??初始化SPI端口,使得输出速率为10MHz,输出数据0x55,0xaa,使用示波器观察MOSI,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波形进行反向,这可以:
▲ 图2.2.1 MOSI信号反向电路
??由于BC547B的截止频率只有300MHz,信号通过BC547之后,引起了很大的失真。下图显示了信号波形。
▲ 图2.2.2 MOSI 输入输出信号
??为了提高响应速度,对电路进行如下的调整:
Q1
:9018
R1
:10k
R2
:200
▲ 图2.2.3 电路参数修改之后输入输出波形
??根据WS2812控制信号协议,RESET是时长超过50us的低电平,因此,在2.5MHz的波特率下,连续输出125bit的高电平,也就是16个byte的0xff,则可以产生: 16 × 8 = 128 16 \times 8 = 128 16×8=128个1输出,便可以产生 128 × 0.4 = 51.2 μ s 128 \times 0.4 = 51.2\mu s 128×0.4=51.2μs的低电平。
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信号
??根据WS2812协议,每一组RGB需要24个bit,每个bit可以有SPI输出的3个bit来表示,因此输出一组RGB数据,则需要SPI输出 24 × 3 = 72 b i t s = 9 b y t e s 24 \times 3 = 72bits = 9bytes 24×3=72bits=9bytes。
??由于存在MOSI输出反向,所以对应的RGB输出的高低电平需要进行反相。
RGB-0
:SPI-011
RGB-1
:SPI-001
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)
??输出RGB分别为:0xff, 0x80, 0x3f,对应的数据波形为:
▲ 图2.3.2 带有一个RST信号的一组RGB波形
??将RGB对应的输出脉冲展开后的波形,可以检查输出波形是否符合WS2812对应的控制信号协议。
▲ 图2.3.3 将RGB对应的输出脉冲展开后的波形
??编程输出RGB为(0xff,0x0,0x0),对应WS2812应该是输出红色,但直接接入之后,WS2812输出为白色。
??通过观察DI的波形,可以看到它处于高电平的时间超过400us,并且低电平大约为1.5V。这说明Q1的驱动不足。
▲ 图2.4.1 DI波形以及对应的WS2812颜色
??降低R1阻值,提高Q1响应时间,以及输出低电平降低。最后将R1的阻值更换成3.3k欧姆之后,D1波形有了改善,此时WS2812的颜色与设置的参数相符了。
▲ 图2.4.2 DI波形以及对应的WS2812颜色
▲ 图2.4.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的硬件电路和软件。
增加R2的阻值,可以进一步降低输出MOSI的低电平,但是减缓了上升时间,但是控制信号依然可以工作。
▲ 图3.1 更换R2(430欧姆)之后对应的输出波形
▲ 图3.1.2 增加加速电容
▲ 图3.1.3 增加加速电容之后的波形
提高SPI的波特率,可以提高设置颜色的准确率。
from machine import Pin,Timer,SPI
import time
hspi = SPI(1, 3000000, 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
hspi.write(outbyte)
while True:
str = [int(s, 16) for s in input('Input RGB\n').split()]
print(str)
rgbbyte = rgb2byte(str[0], str[1], str[2])
outbyte = rstbyte+rgbbyte+rstbyte
hspi.write(outbyte)
hspi.write(outbyte)
time.sleep_ms(10)
■ 相关文献链接:
● 相关图表链接:
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:30:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |