之前对模拟传感器进行了校准,结果不甚理想。有必要对ESP32的ADC进行检查了。顺便将其与Arduino和ADS1115进行比较。

校准后跑了一天的结果如下:

2022-10-27_20-17

注意导出的数据只记录变化,故中间很长的TEMT6000爆表的截断部分只有两个数据点,按之前的处理这之间BH1750的数据由于缺少TEMT6000的时间戳数据点会舍弃,所以对拟合没有影响。

对于BH,同样是140 lx,7点TEMT是186.3 lx,而10点半就成了127 lx。有必要对ESP32的ADC进行检查了。

ESP32

测试用的是ESP32-WROOM-32UE开发板,针脚定义如下:

ESP32-DOIT-DEVKIT-V1-Board-Pinout-30-GPIOs

ESP32内置2个逐次逼近型ADC。但ADC2也用于WiFi,故WiFi开启时不要用ADC2,只用ADC1。

ESP32的ADC为12位,故分辨率为 3.3V / 4096 ≈ 0.8057 mV。最高采样率为 2 MHz。数值上完爆Arduino,但实际上呢?

信号抖动很大,需要损失采样率求平均做平滑处理。

用线性回归拟合(y = 0.9696 * x + 0.2191)后R方为0.9928,经过校准和去抖动后勉强可用,但比Arduino差远了。

ADC受到附近无线电信号的影响。改进:可以在测量时关闭WiFi和蓝牙,传输时再开启。

ESP32的ADC误差较大且非线性。高分辨率但低准确率,不可靠。

Arduino

测试用的是兼容Arduino Uno的OCROBOT MANGO开发板。针脚定义如下:

2022-10-28_12-01

Arduino的AREF是空接的,实际用的是供电的5V。

其ADC为10位,故分辨率为 5V / 1023 ≈ 4.9 mV。ADC时钟频率 16MHz / 128 = 125 KHz(见此处)。每次采样耗费13个周期,故最高采样率为 125 KHz / 13 ≈ 9615 Hz。

实验通过精密多圈绕线电位器调节模拟接口的输入电压,用万用表测得的电压为准0.2V步进和arduino的结果做比较。

IMG_20221028_192528

用线性回归拟合(y = 0.9998 * x + 0.9927)后R方为0.9998,可以说经过校准后相当准确。

Arduino不用校准也相当准确,前提是供电的5V准确。由于USB充电器电压在4~5.25V间,并不稳定,所以建议采用DC9V,经过板载LDO降至5V供电。

ADS1115

测试用ESP32外接ADS1115。

此ADC为16位,最高采样率为 860 Hz,是三个之中最慢的。I2C接口。有4个模拟输入。

2022-10-28_22-39

用线性回归拟合(y = 0.9983 * x - 0.000349)后R方为0.9999998,是线性程度最好的。

ADS1115无需校准可直接使用,是最准确的。

2022-10-28_22-40

结论

ESP32的ADC不可靠,尽量用数字传感器。模拟传感器可接Arduino处理,实在要用ESP32接模拟传感器可在中间加ADS1115先处理成数字信号。

参考资料

ESP32-WROOM-32E & ESP32-WROOM-32UE Datasheet

ESP32 > Peripherals API > Analog to Digital Converter

ATmega328P Datasheet

analogRead()

ADS1115 Datasheet