利用硬件SPI控制WS2812,驱动1024颗灯珠
“
简 介: 利用ESP32中的硬件SPI控制WS2812的显示。使用了高频三极管9018 作为输出接口反向器,确定合适的电阻参数,验证了驱动方案的硬件和软件的可行性。
关键词
: WS2812,ESP32,SPI”
01 WS2812
智能集成LED光源 WS2812[1] 通过简单的外部接口、特有的级联方案便于利用MCU完成多个LED控制,极大简化了LED控制接口。相比于传统的 单片机LED IO口复用控制方案[2] ,使用WS2812则更加的简介。
一、芯片简介
1、特点与优势
在5050封装内集成有控制电路和RGB芯片,形成完整像素点控制;
内置扫执行好整形电路,传递到级联下一节点时,不会产生信号失真累积效应;
内置复位电路与掉电复位电路;
每个RGB灯都有256亮度级别,可以形成中颜色,刷新频率不低于400Hz;
通过信号线完成端口级联;
传输距离在5米之内,无需增加额外电路;
在刷新频率30帧/秒中,低速模式下可以控制不少于512颗灯,高速模式下则超过1024颗灯;
数据传输速率为800kbps;
颜色一致性强,价格低;
2、应用
全色彩模块;全色彩柔光灯带;
LED装饰灯带;室内、室外LED不规则显示屏;
3、管脚封装
二、工作原理
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编码。
【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输出锁定。
每组24bit对应的的GRB编码如下所示。发送颜色顺序为GRB,字节的高位在前。
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端口。
使用SPI id=1,对应的SPI,MOSI,MISO的对口为,14,13,12,对应的实验转接板上的输出管脚如下图所示,从右往左分别是:
● ESP32转接板SPI管脚定义:
SCK
:PIN9
MISO
:PIN8
MOSI
:PIN7
3、测试SPI输出波形
初始化SPI端口,使得输出速率为10MHz,输出数据0x55,0xaa,使用示波器观察MOSI,SPI波形。
(1)测试缺省SPI模式
from machine import Pin,Timer,SPI
import 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.5MHz,此时便可以输出 0.4us 的低脉冲。
设置输出波特率为2.5MHz,可以产生所需要的0.4us的电平输出。波形如下图所示:
二、使用晶体管反向MOSI
使用晶体管将MOSI波形进行反向,这可以:
能够满足WS2812控制脉冲电平极性要求。它要求控制信号在平时为高电平,通过低电平脉冲获得复位信号、0/1数据位信号。
提高带载能力。
1、信号反向电路
2、电路测试
(1)晶体管BC547
由于BC547B的截止频率只有300MHz,信号通过BC547之后,引起了很大的失真。下图显示了信号波形。
(2)晶体管9018
为了提高响应速度,对电路进行如下的调整:
● 电路元器件参数:
Q1
:9018
R1
:10k
R2
:200
三、产生控制波形
1、产生RESET信号
根据WS2812控制信号协议,RESET是时长超过50us的低电平,因此,在2.5MHz的波特率下,连续输出125bit的高电平,也就是16个byte的0xff,则可以产生:个1输出,便可以产生的低电平。
from machine import Pin,Timer,SPI
import 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、产生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 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[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+rgbbytewhile True:hspi.write(outbyte)time.sleep_ms(10)
(2)输出波形
输出RGB分别为:0xff, 0x80, 0x3f,对应的数据波形为:
将RGB对应的输出脉冲展开后的波形,可以检查输出波形是否符合WS2812对应的控制信号协议。
四、测试WS2812
1、波形失真
编程输出RGB为(0xff,0x0,0x0),对应WS2812应该是输出红色,但直接接入之后,WS2812输出为白色。
通过观察DI的波形,可以看到它处于高电平的时间超过400us,并且低电平大约为1.5V。这说明Q1的驱动不足。
2、降低R1的阻值
降低R1阻值,提高Q1响应时间,以及输出低电平降低。最后将R1的阻值更换成3.3k欧姆之后,D1波形有了改善,此时WS2812的颜色与设置的参数相符了。
3、RGB转换颜色
编程依次输出RGB颜色。
3、RGB转换颜色
from machine import Pin,Timer,SPI
import 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[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+rstbytewhile True:rgbbyte = rgb2byte(0xff,0x0,0x0)outbyte = rstbyte+rgbbyte+rstbytehspi.write(outbyte)time.sleep_ms(500)rgbbyte = rgb2byte(0x0,0xff,0x0)outbyte = rstbyte+rgbbyte+rstbytehspi.write(outbyte)time.sleep_ms(500)rgbbyte = rgb2byte(0x0,0x0,0xff)outbyte = rstbyte+rgbbyte+rstbytehspi.write(outbyte)time.sleep_ms(500)
下面显示了WS2812在SPI输出波形控制下完成颜色的转换。
※ 实验总结 ※
利用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
利用硬件SPI控制WS2812,驱动1024颗灯珠相关推荐
- STM32硬件SPI控制TM1638 按键数码管LED显示模块
STM32硬件SPI控制TM1638按键数码管LED显示模块 从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...
- 【0.96寸 OLED屏实现1500Fps的帧率】STM32 软件、硬件SPI、I2C驱动总结
目录 SPI版 OLED SPI 端口定义 七针OLED引脚定义 六针OLED引脚定义 软件SPI 硬件SPI 启用DMA 帧率测试 I2C 版 软件I2C 硬件I2C DMA STM32F103VE ...
- 硬件SPI控制ST7789V
文章目录 前言 一.能用的方法有那些? 1.利用硬件UART模拟SPI,实现9位数据发送 2.搭建一个数字逻辑电路,人为实现9位spi发送 3.发送两组8位SPI 二.具体操作 1.具体实现 总结 前 ...
- STM32F103C8T6硬件SPI控制6针/7针0.96寸OLED显示屏
OLED介绍 OLED主要参数 1.高分辨率:12864(和12864LCD相同分辨率,但该OLED屏的单位面积像素点多). 2.广可视角度:大于160°. 3.低功耗:正常显示时0.04W. 4.宽 ...
- 下载的内容:MSP430F149利用硬件SPI口读写串行Flash M25P64
/*****************<SPI_Flash.C>**************************************/ #include "SPI_Flas ...
- WS2812串行可控彩色LED灯珠
简 介: 利用ESP32中的硬件SPI控制WS2812的显示.使用了高频三极管9018 作为输出接口反向器,确定合适的电阻参数,验证了驱动方案的硬件和软件的可行性. 关键词: WS2812,ESP32 ...
- Arduino控制1302颗ws2812灯珠显示圣诞树和圣诞老人(附程序源码)
Arduino控制1302颗ws2812灯珠显示圣诞树和圣诞老人 设计者:STCode(公众号同名) 效果直接看视频~ Arduino控制ws2812灯带显示圣诞树和圣诞老人 1)项目介绍 该设计一共 ...
- ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)
由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...
- ws2812驱动总结(包括对时序的详细分析,代码基于STC15系列单片机)
声明 本文版权归作者bxgj所有,未经作者授权,本文禁止以任何形式在任何平台(包括但不限于各网站.论坛.博客.微博.公众号等)部分或全部地转载,禁止二次修改后声明原创.授权转载内容请注明出处(如作者: ...
最新文章
- 【算法竞赛学习】金融风控之贷款违约预测-模型融合
- 1-3.监督学习(supervised learning)
- php strlen遇0截断,聊下php下的截断问题
- strassen算法java_使用java写的矩阵乘法实例(Strassen算法)_Java_软件编程
- javascript (BOM DOM)
- java中的上传下载----ajaxFileUpload+struts2
- 凸优化第四章凸优化问题 4.4二次优化问题
- 2022年系统分析师论文模拟题--押题
- OCR-CTPN 文字检测
- 电脑声控 电脑机器人功能
- 迪厅装修后地板清洁与保养
- echars自定义y轴为图片
- c语言判断非法字符题目,C语言考试题库之判断题-c语言考试判断题
- hx711模块原理图及驱动程序你知道了么?
- 此“备忘录”和彼备忘录一样吗?
- C语言数组讲解(1)一维数组的创建和初始化。
- 第二章 大数据如此重要,引无数英雄竞折腰
- python平均值代码_python中的运行平均值
- hdf5 文件生成 C++
- 企业如何利用免费ERP系统进行内部控制