一. 測試目的
經常會有開發者詢問 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 測得的電壓值基本沒有變化。