一. 测试目的
经常会有开发者询问 ESP32 ADC 精度是否符合文档里的误差 6% 的标准,本文将进行此项测试。
二. 测试环境
为了保证测试结果的一致性,采用以下测试环境:
-
esp-idf
本文使用 release/v3.3 版本进行测试,对应 commit 为 6ccb4cf5b。可通过以下命令确认:git log --oneline -1
结果为:
6ccb4cf5b (HEAD, tag: v3.3) Merge branch 'bugfix/btdm_security_vulnerability_on_encryption_key_size_v3.3' into 'release/v3.3'
-
toolchain 版本
gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a) ,可通过以下命令确认:xtensa-esp32-elf-gcc -v
结果为(log 过长,只需要关注最后的这部分。如下):
Thread model: posix gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-80-g6c4433a)
-
测试主机
Linux 环境,Ubuntu 16.04 LTS,可选用其他平台。 -
开发板
包含 ESP32-WROOM-32D 模组 的ESP32_DevKitc_V4
开发板,可选用其他基于 ESP32 的开发板。
包含 ESP32-WROVER-B 模组 的ESP-WROVER-KIT
开发板,可选用其他基于 ESP32 的开发板。 -
测试示例
esp-idf 里的 adc 示例。 -
测试工具
多路直流稳压电源 (TPR3002-2D)、Agilent 34401A 数字万用表。
三. 测试步骤
此次测试使用了 esp-idf 里的 adc 示例 。
1. 接入多路直流稳压电源
测试时将多路直流稳压电源的正极接 ESP32 上的引脚 GPIO34、负极接 ESP32 上的引脚 GND,然后在此正负极上并联一个万用表(此时被当做电压表使用)来确保多路直流稳压电源的电压输出精度。
2. 代码修改
首先你需要 下载并配置 esp-idf,配置完成后,你可以输入以下指令来进入对应的项目:
cd ~/esp/esp-idf/examples/peripherals/adc
然后你需要修改并采用不同的 atten。以下是具体的操作:
- 修改并采用不同的 atten:修改
adc1_example_main.c
里第 22 行static const adc_atten_t atten = ADC_ATTEN_DB_0;
中 atten 的值。 不同的 atten 值代表了不同的 ADC 电压有效测量范围。在这次测试中会将 atten 的值从 0 递增到 3,从而依次观察测试结果是否满足对应的电压有效测量范围以及精度。以下是 esp-idf 支持的 atten 值:ADC_ATTEN_DB_0 = 0, /*!<The input voltage of ADC will be reduced to about 1/1 */ ADC_ATTEN_DB_2_5 = 1, /*!<The input voltage of ADC will be reduced to about 1/1.34 */ ADC_ATTEN_DB_6 = 2, /*!<The input voltage of ADC will be reduced to about 1/2 */ ADC_ATTEN_DB_11 = 3, /*!<The input voltage of ADC will be reduced to about 1/3.6*/
3. 固件烧写及串口监视
在正确配置 atten 的值后,你需要进行固件烧写及串口监视,首先需要针对串口进行配置:
make menuconfig
在 menuconfig
界面设置 ESP32 所使用的串口,然后就可以运行如下指令进行固件烧录及串口监视:
make flash monitor
在串口监视工具中,当看到在串口监视中已经在不断的打印 ADC GPIO34 引脚测得的电压值,就可以开始此次测试了。
四. 测试结果
运行此示例,在烧录并成功观测到测量电压的 log 之后,你即可开始调整多路直流稳压电源来观测对比 GPIO34 引脚上测得的电压值。以下是对应不同 atten 与 ESP32 模组 下的 ADC 量程与精度测试结果:
1. ESP32-WROOM-32D 模组
-
atten = 0 (电压有效测量范围为 100 mV - 950 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 100 mV 105 mV 5.00% 200 mV 205 mV 2.50% 300 mV 304 mV 1.33% 400 mV 405 mV 1.25% 500 mV 505 mV 1.00% 600 mV 605 mV 0.83% 700 mV 710 mV 1.42% 800 mV 815 mV 1.88% 900 mV 917 mV 1.89% 实际测试的电压量程为 75 mV - 1045 mV。
-
atten = 1 (电压有效测量范围为 100 mV - 1250 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 200 mV 211 mV 5.50% 400 mV 413 mV 3.25% 600 mV 612 mV 2.00% 800 mV 812 mV 1.50% 1000 mV 1014 mV 1.40% 1200 mV 1216 mV 1.33% 实际测试的电压量程为 78 mV - 1365 mV。
-
atten = 2 (电压有效测量范围为 150 mV - 1750 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 300 mV 317 mV 5.66% 600 mV 616 mV 2.66% 900 mV 917 mV 1.89% 1200 mV 1224 mV 2.00% 1500 mV 1527 mV 1.80% 1800 mV 1830 mV 1.67% 实际测试的电压量程为 107 mV - 1888 mV。
-
atten = 3 (电压有效测量范围为 150 mV - 2450 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 400 mV 426 mV 6.25% 800 mV 824 mV 3.00% 1200 mV 1226 mV 2.17% 1600 mV 1637 mV 2.31% 2000 mV 2040 mV 2.00% 2400 mV 2450 mV 2.08% 实际测试的电压量程为 142 mV - 3139 mV。
2. ESP32-WROVER-B 模组
-
atten = 0 (电压有效测量范围为 100 mV - 950 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 100 mV 104 mV 4.00% 300 mV 306 mV 2.00% 500 mV 508 mV 1.60% 700 mV 710 mV 1.43% 900 mV 913 mV 1.44% 实际测试的电压量程为 75 mV - 1026 mV。
-
atten = 1 (电压有效测量范围为 100 mV - 1250 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 100 mV 106 mV 6.00% 400 mV 409 mV 2.25% 700 mV 710 mV 1.43% 1000 mV 1015 mV 1.50% 1300 mV 1322 mV 1.69% 实际测试的电压量程为 78 mV - 1341 mV。
-
atten = 2 (电压有效测量范围为 150 mV - 1750 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 200 mV 212 mV 6.00% 600 mV 612 mV 2.00% 1000 mV 1015 mV 1.50% 1400 mV 1418 mV 1.29% 1800 mV 1826 mV 1.44% 实际测试的电压量程为 107 mV - 1854 mV。
-
atten = 3 (电压有效测量范围为 150 mV - 2450 mV)
直流电源输出电压 GPIO34 测得的电压 百分比误差 200 mV 216 mV 8.00% 700 mV 715 mV 2.14% 1200 mV 1226 mV 2.17% 1700 mV 1739 mV 5.57% 2200 mV 2232 mV 1.45% 实际测试的电压量程为 142 mV - 3124 mV。
五. 总结
通过以上方法可以发现在采用不同的 ESP32 模组 与 atten 逐点测试的情况下,实际测试的 ADC 电压量程与 datasheet 里的电压有效测量范围都吻合。其中绝大部分数值也都满足 ESP32 datasheet 6 % 的精度要求。故 ESP32 的 ADC 功能可以放心使用。
六. 附加测试
1. 进行了当工作电压 Vcc 不足 3.3 V 时(2.7 V - 3.3 V) 是否影响 ADC 精度的测试
测试结果:将 ESP32 的工作电压 Vcc 在 2.7 V - 3.3 V 间来回调试,发现 ADC 测得的电压值基本没有变化。