ESP32 Arduino ADS1115三者的ADC比较
之前对模拟传感器进行了校准,结果不甚理想。有必要对ESP32的ADC进行检查了。顺便将其与Arduino和ADS1115进行比较。
校准后跑了一天的结果如下:
注意导出的数据只记录变化,故中间很长的TEMT6000爆表的截断部分只有两个数据点,按之前的处理这之间BH1750的数据由于缺少TEMT6000的时间戳数据点会舍弃,所以对拟合没有影响。
对于BH,同样是140 lx,7点TEMT是186.3 lx,而10点半就成了127 lx。有必要对ESP32的ADC进行检查了。
ESP32
测试用的是ESP32-WROOM-32UE
开发板,针脚定义如下:
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开发板。针脚定义如下:
Arduino的AREF是空接的,实际用的是供电的5V。
其ADC为10位,故分辨率为 5V / 1023 ≈ 4.9 mV。ADC时钟频率 16MHz / 128 = 125 KHz(见此处)。每次采样耗费13个周期,故最高采样率为 125 KHz / 13 ≈ 9615 Hz。
实验通过精密多圈绕线电位器调节模拟接口的输入电压,用万用表测得的电压为准0.2V步进和arduino的结果做比较。
用线性回归拟合(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个模拟输入。
用线性回归拟合(y = 0.9983 * x - 0.000349)后R方为0.9999998,是线性程度最好的。
ADS1115无需校准可直接使用,是最准确的。
结论
ESP32的ADC不可靠,尽量用数字传感器。模拟传感器可接Arduino处理,实在要用ESP32接模拟传感器可在中间加ADS1115先处理成数字信号。
参考资料
ESP32-WROOM-32E & ESP32-WROOM-32UE Datasheet