ESP32驱动WS2812异常问题

现象

  1. 当USB供电电压大于或者等于5v时候,WS2812控制会出现异常,而当USB电压在4.5-5v之间时候ws2812正常控制。

  2. 用ESP32-S3板子上的IO48引脚驱动异常,用其他的比如IO45就没问题

分析

  1. 首先想到的是可能IO48引脚和其他IO不同,经查数据手册发现IO48在型号为尾号为R8V的型号上是1.8v逻辑。

    image-20230218165821054

  2. 但是我们用的型号是R8不带v的,是3.3v。经过示波器卡波形看,确实不是1.8v,是3.3v逻辑确认没错。排除这个问题

    image-20230218170038649

  3. 而为什么使用IO45引脚可以驱动正常,而使用IO48会有异常呢。

    示波器测试2个IO输出的波形,并没有太大差异。

    IO45的波形如下图

    image-20230218170208924

    IO48的波形如下图

    image-20230218170233928

  4. 查询WS2812的手册,发现有两种手册,有一种写的是2.7v,如果是这样,那3.3v的IO逻辑都不会有问题

    image-20230218170624122

    但是发现另外一种写的是高电平逻辑最低识别是0.7*Vdd,所以存在有几率当供电5v时候,3.5v才被识别成高电平,这种情况就会出现异常。市面上很多WS2812,当是3.3v逻辑控制时候,或许这里官方写的文档有余量,有的能识别有的可能识别不了。这里就是一个潜在问题。所以以后电路需要解决这个问题。

    image-20230218170752777

解决问题

方法1:本来想着直接在IO加上上拉电阻,在代码中直接写开漏输出的方法来解决

pinMode(mPin, OUTPUT_OPEN_DRAIN); 

测试发现,当普通IO时候可以这样做,但是当驱动WS2812时候,大部分的库是用的ESP32的RMT模块,这个模块是没有设置开漏输出的地方。这个办法只能放弃。

方法2:加一个mosfet,实现3.3v到5v逻辑转换

image-20230218171426927

测试发现,这个电路速度只能达到us级别,反应时间不够,应用在WS2812控制上不合适,他的波形时间大概是250ns左右,速度太快

image-20230218171523326

最终解决办法

控制WS2812时候把第一个WS2812的供电上串联进去一个二极管。强制让第一个WS2812的电压降低。

一个二极管大概0.7v压降,这样供电大概5-0.7=4.3v左右,而0.7Vdd=3V,满足3.3v单片机的高电平逻辑。

image-20230218171821497

级联后面的ws2812还用5v供电,这样第一个ws2812只是亮度稍微有差异,并不影响控制

本店ESP32-S3的LVGL板子,同样方法可以自行修改,增加一个二极管实现。

image-20230218172220808

把这里断开,加进去一个二极管,正极接5V,负极接WS2812这个1号引脚带点的引脚VCC。

这样WS2812可以完美控制了,不用再考虑以后碰到不同批次WS2812或者个例出现控制不了的问题。

当然硬件可能到下个版本V3.3制作时候直接在板子上修复掉。目前3.2版本只能自己修改了。