ESP32驱动WS2812异常问题
现象
当USB供电电压大于或者等于5v时候,WS2812控制会出现异常,而当USB电压在4.5-5v之间时候ws2812正常控制。
用ESP32-S3板子上的IO48引脚驱动异常,用其他的比如IO45就没问题
分析
首先想到的是可能IO48引脚和其他IO不同,经查数据手册发现IO48在型号为尾号为R8V的型号上是1.8v逻辑。
但是我们用的型号是R8不带v的,是3.3v。经过示波器卡波形看,确实不是1.8v,是3.3v逻辑确认没错。排除这个问题
而为什么使用IO45引脚可以驱动正常,而使用IO48会有异常呢。
示波器测试2个IO输出的波形,并没有太大差异。
IO45的波形如下图
IO48的波形如下图
查询WS2812的手册,发现有两种手册,有一种写的是2.7v,如果是这样,那3.3v的IO逻辑都不会有问题
但是发现另外一种写的是高电平逻辑最低识别是0.7*Vdd,所以存在有几率当供电5v时候,3.5v才被识别成高电平,这种情况就会出现异常。市面上很多WS2812,当是3.3v逻辑控制时候,或许这里官方写的文档有余量,有的能识别有的可能识别不了。这里就是一个潜在问题。所以以后电路需要解决这个问题。
解决问题
方法1:本来想着直接在IO加上上拉电阻,在代码中直接写开漏输出的方法来解决
pinMode(mPin, OUTPUT_OPEN_DRAIN);
测试发现,当普通IO时候可以这样做,但是当驱动WS2812时候,大部分的库是用的ESP32的RMT模块,这个模块是没有设置开漏输出的地方。这个办法只能放弃。
方法2:加一个mosfet,实现3.3v到5v逻辑转换
测试发现,这个电路速度只能达到us级别,反应时间不够,应用在WS2812控制上不合适,他的波形时间大概是250ns左右,速度太快
最终解决办法
控制WS2812时候把第一个WS2812的供电上串联进去一个二极管。强制让第一个WS2812的电压降低。
一个二极管大概0.7v压降,这样供电大概5-0.7=4.3v左右,而0.7Vdd=3V,满足3.3v单片机的高电平逻辑。
级联后面的ws2812还用5v供电,这样第一个ws2812只是亮度稍微有差异,并不影响控制
本店ESP32-S3的LVGL板子,同样方法可以自行修改,增加一个二极管实现。
把这里断开,加进去一个二极管,正极接5V,负极接WS2812这个1号引脚带点的引脚VCC。
这样WS2812可以完美控制了,不用再考虑以后碰到不同批次WS2812或者个例出现控制不了的问题。
当然硬件可能到下个版本V3.3制作时候直接在板子上修复掉。目前3.2版本只能自己修改了。