关于ESP32测模拟电压的错误的改正
图1
如图1,很简单的一个分压电路,给两个等值电阻两端加5V电压,然后从中间即Pot位置测量分出来的电压。应该测量出来2.5V才对,但是用万用表实测,显示出来却是3.37V。
问题出在哪里呢?
开始的时候以为是ESP32的ADC引脚非线性造成的,但是想想不可能有这么巨大的差别。于是利用一点点零碎的时间,重新测量了一下。琢磨来琢磨去的,每当操作,都用万用表同时也进行测量,后来发现,问题出现在我对ESP32开发板的ADC理解上了。
ESP32自带ADC引脚,即直接测量模拟电压。由于ADC是12位的,因此4095就对应着可测量的最大电压。
图2
问题是,这个4095对应着什么呢?对应3.3V。
我先前一直错误地认为,4095是开发板上能输出的最大电压,即5V,所以一直在错误地使用它。于是,在ESP32与Phyphox互连时,使用了
float fV = iV * 5.0 /1024.0 / 4.0;
事实上,ESP32虽然有输出5V的本领,但是它可测量的最大电压,就是3.3V。亦即,要把ESP32测电压的代码改写成
float fV = iV * 3.3 /1024.0 / 4.0;
才是正确的。
我手上有3或4种ESP32正规或不正规的开发板,有约60元一块的,也有约10一块的,我专门测量了一下ESP32的引脚输出:
第一种:5V、VIN引脚,实际输出4.48V,并非5V;而3V3引脚,输出较准确的3.3V。
第二种:5V引脚,无VIN引脚,实际输出4.50V;而3V3引脚,输出较准确的3.3V。
另两种:5V引脚,无VIN引脚,实际输出4.50V;而3V3引脚,输出4.50V。
如果在5V输出的情况下,在图1两电阻两端加5V电压,测得电压不为2.5V,用万用表测VIN与GND或5V与GND之间电压,从电脑USB口供电,测得电压约4.50V,并不等于5.0V;同时测量Pot点输出电压,大约2.22V,说明float fV = iV * 3.3 / 1024.0 /4.0;的计算方法正确。使Pot点输出电压高于3.3V,ESP32测得的电压总为3.3V。说明什么?说明一旦ESP32测量得4095以上的输入,全部作为4095来对待。也就是,3.3V它会测得3.3V;而当引脚输入电压超过3.3V时,没有其它运算,全部认为是3.3V,此时ESP32虽然没有烧坏!
总结经验:
(1)编写实际显示电压代码时,最好还是用万用表打一下,校准一下显示数据与真实数据;
(2)各种复制版ESP32的标注数据最好还是实测一下好,不能完全按照标注进行;
(3)ESP32引脚输出电压是可以超过3.3V的,但是测量时只能显示到3.3V,超过3.3V的全被视为3.3V了;似乎超过3.3V的输入电压,在短时间内不会烧芯片,但是没试过长时间能不能烧,估计会烧了。