一. 測試目的
經常會有開發者提出基於 ESP32 Light-sleep 模式下的電流功耗問題,本文將測試在連接 Wi-Fi 的情況下 Light-sleep 模式下的 ESP32 的電流功耗。
二. 測試環境
爲了保證測試結果的一致性,採用以下測試環境:
-
esp-idf
編寫本文時,最新的 esp-idf release 版本爲 v4.1,將使用該版本進行測試,對應 commit 爲
70794a0。可通過以下命令確認:git log --oneline -1
結果爲:
70794a0 Merge branch 'feature/ver-4.1' into 'master'
-
toolchain 版本
gcc version 8.2.0 (crosstool-NG esp32-2019r1),可通過以下命令確認:xtensa-esp32-elf-gcc -v
結果爲(log 過長,只需要關注最後的這部分。如下):
Thread model: posix gcc version 8.2.0 (crosstool-NG esp32-2019r1)
-
測試主機
Linux 環境,Ubuntu 16.04 LTS,可選用其他平臺。 -
開發板
ESP32-WROOM-32D 開發板,可選用其他基於 ESP32 的開發板。 -
測試示例
esp-idf 裏的 Power_save 示例。 -
測試工具
Tektronix MDO3104 示波器 或 Agilent 34401A 數字萬用表,使用相關測電流工具均可。
三. 測試步驟
此次測試中使用了 esp-idf 裏的 power_save 用例。
-
接入電流表
測試時將萬用表調至電流表模式,然後測量 Vcc 引腳上連接導線的電流即可。 -
固件燒寫及串口監視
首先你需要 下載並配置esp-idf,配置完成後你需要輸入以下指令:cd ~/esp/esp-idf/examples/wifi/power_save make menuconfig
在
menuconfig
界面,你需要設置需要連接的AP的SSID
和password
,你也可以在menuconfig
裏將 ESP32 調至單核模式。然後你就可以運行如下指令進行固件燒錄及串口監視:make flash monitor
在串口監視工具中,當你看到 Wi-Fi 成功連接時,就可以進行電流功耗測試。
四. 測試結果
運行此示例,在成功連接到 AP 之後,工作站將定期在活動狀態和睡眠狀態之間切換。在睡眠狀態下,RF、PHY 和 BB 被關閉以減少功耗。站可以在調制解調器休眠模式下與 AP 保持連接。在最小調制解調器睡眠模式下,站喚醒每個 DTIM 以接收信標。
測試得到在 Light-sleep 模式下的最小功耗電流爲 0.90 mA ,平均功耗電流爲 5.0 - 8.0 mA 。每隔 300 ms 可以觀測到一個脈衝,每次脈衝持續 10 ms ,此時 ESP32 定期在活動狀態和睡眠狀態之間切換。
以下是測試結果:
測量參數 | 參數數值 |
---|---|
最低電流功耗 | 0.9 mA |
平均電流功耗 | 5.0-8.0 mA |
定期發包的(AP)的週期 | 300 ms |
發包時產生的脈衝時長 | 10 ms |
這裏也能從 log 信息中獲得如下信息:
wifi: AP’s beacon interval = 307200 us,DTIM period = 1
其中:
- beacon interval:信標間隔,爲 307.2 ms ,這與表格裏的定期發包的週期相匹配。
- DTIM:是delivery traffic indication message,一個 DTIM period 決定了隔多久一個 beacon 幀裏會包含一個 DTIM 消息,並且這個 period 值會包含在每個 beacon 幀裏面。當 DTIM period = 1,表示每隔一個 Beacon 的時間間隔,AP 將發送所有暫時緩存的數據包。
注意:手工焊接,集成度不如 ESP32-WROOM-32D 開發板,部分 GPIO 未被禁用均可能導致測量結果不準確。
五. 總結
通過以上方法,可測出 ESP32 在連接 Wi-Fi 時的 Light-sleep 模式下的電流功耗,用戶可選擇採用以上方法對自己的 ESP32 進行電流功耗測試。
六.相關知識附錄
0. ESP32 的 Light-sleep 模式特性
Light-sleep 模式是另一種省電模式。在 Light-sleep 模式下,數字外設和大多數 RAM 被時鐘門控,電源電壓降低,但 RTC 存儲器和外設以及 ULP 協處理器仍保持運行。任何喚醒事件(MAC 、主機、 RTC 定時器或外部中斷)都會喚醒芯片。可以使用多種喚醒源從輕度睡眠模式喚醒。可以組合這些喚醒源,在這種情況下,當觸發任何一個源時芯片將被喚醒。可以使用 esp_sleep_enable_X_wakeup
API 啓用喚醒源,並可以使用 esp_sleep_disable_wakeup_source()
API 禁用喚醒源。
從 Light-sleep 模式退出後,外圍設備和 CPU 恢復運行,它們的內部狀態得以保留。通過調用 esp_err_t esp_light_sleep_start()
,應用程序可以進入 Light-sleep 模式。
此外,應用程序可以使用 esp_sleep_pd_config()
API 強制 RTC 外設和 RTC 存儲器的特定掉電模式。
1. WiFi/BT 與 Light-sleep 模式
在進入 Light-sleep 模式之前,應用程序必須調用以下函數 esp_bluedroid_disable(),esp_bt_controller_disable(),esp_wifi_stop()
禁用 Wi-Fi 和 BT。 即使不調用這些功能,也不會在 Light-sleep 模式中保持 Wi-Fi 和 BT 連接。
2. 喚醒源
你需要使用喚醒源來將 ESP32 從 Light-sleep 模式中喚醒,以下是相關喚醒源的介紹。
-
1. 定時器
ESP32 裏的 RTC 控制器具有內置定時器,可用於在預定義的時間後喚醒芯片。時間精度爲μs
,但實際分辨率取決於爲RTC SLOW_CLK
選擇的時鐘源。有關 RTC 時鐘選項的詳細信息,請參見 ESP32 技術參考手冊。注:此喚醒模式不需要在睡眠期間打開 RTC 外圍設備或 RTC 存儲器。
-
2. Touch pad
RTC IO 模塊包含觸摸傳感器中斷時觸發喚醒的邏輯。你需要在芯片開始睡眠之前配置觸摸傳感器。
當 RTC 外設未被強制上電時,即ESP_PD_DOMAIN_RTC_PERIPH
應設置爲ESP_PD_OPTION_AUTO
esp_sleep_enable_touchpad_wakeup()
函數可用於啓用此喚醒源。 -
3. External 喚醒(通過 EXT0)
RTC IO 模塊包含當其中 一個 RTC GPIO 的電平爲預定義的邏輯電平時觸發喚醒的邏輯。RTC IO 是 RTC 外設電源域的一部分,由於在此模式下啓用了 RTC IO 模塊,因此也可以使用內部上拉或下拉電阻。在調用esp_sleep_start()
之前,需要使用rtc_gpio_pullup_en()
和rtc_gpio_pulldown_en()
函數由應用程序配置它們。esp_sleep_enable_ext0_wakeup()
函數可用於啓用此喚醒源。從睡眠狀態喚醒後,用於喚醒的 IO pad 將被配置爲 RTC IO。在將此 pad 用作數字 GPIO 之前,請使用rtc_gpio_deinit(gpio_num)
函數重新配置它。 -
4. External 喚醒(通過 EXT1)
RTC 控制器包含使用 多個 RTC GPIO 觸發喚醒的邏輯。兩個邏輯功能之一可用於觸發喚醒:如果任何所選引腳爲高電平,則喚醒(ESP_EXT1_WAKEUP_ANY_HIGH)
如果所有選定的引腳都爲低電平,則喚醒(ESP_EXT1_WAKEUP_ALL_LOW)該喚醒源由 RTC 控制器實現。因此,RTC 外設和 RTC 存儲器可以在此模式下斷電。但是,如果 RTC 外設斷電,內部上拉和下拉電阻將被禁用。要使用內部上拉或下拉電阻,請在睡眠期間請求 RTC 外設電源域保持開啓,並在進入睡眠模式之前使用 rtc_gpio_ 函數配置上拉/下拉電阻:
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); gpio_pullup_dis(gpio_num); gpio_pulldown_en(gpio_num);
esp_sleep_enable_ext1_wakeup()
函數可用於啓用此喚醒源。從睡眠狀態喚醒後,用於喚醒的 IO pad 將被配置爲 RTC IO。在將此 pad 用作數字 GPIO 之前,請使用
rtc_gpio_deinit(gpio_num)
函數重新配置它。 -
5. ULP 協處理器喚醒
ULP 協處理器可以在芯片處於睡眠模式時運行,並且可以用於輪詢傳感器,監視 ADC 或觸摸傳感器值,並在檢測到特定事件時喚醒芯片。ULP 協處理器是 RTC 外設電源域的一部分,它運行存儲在 RTC 慢速存儲器中的程序。如果請求此喚醒模式,RTC 慢速內存將在睡眠期間啓動。在 ULP 協處理器開始運行程序之前,RTC 外設將自動上電; 程序停止運行後,RTC 外設將再次自動關閉。當 RTC 外設未被強制上電時(即
ESP_PD_DOMAIN_RTC_PERIPH
應設置爲ESP_PD_OPTION_AUTO
),ESP32 的修訂版 0 和 1 僅支持此喚醒模式。esp_sleep_enable_ulp_wakeup()
函數可用於啓用此喚醒源。 -
6. GPIO 喚醒
除了上面描述的 EXT0 和 EXT1 喚醒源之外,在輕度睡眠模式下還有一種從外部輸入喚醒的方法。通過該喚醒源,每個引腳可以單獨使用gpio_wakeup_enable()
函數配置爲高電平或低電平喚醒。與 EXT0 和 EXT1 喚醒源(只能與 RTC IO 一起使用)不同,此喚醒源可用於任何 IO(RTC 或數字)。esp_sleep_enable_gpio_wakeup()
函數可用於啓用此喚醒源。 -
7. UART 喚醒
當 ESP32 從外部設備接收 UART 輸入時,通常需要在輸入數據可用時喚醒芯片。UART 外設包含一項功能,當看到 RX 引腳上的一定數量的上升沿時,可以將芯片從輕度睡眠狀態喚醒。可以使用uart_set_wakeup_threshold()
函數設置此上升沿數。請注意,喚醒後 UART 不會接收觸發喚醒的字符(及其前面的任何字符)。這意味着外部設備通常需要在發送數據之前向 ESP32 發送額外字符以觸發喚醒。esp_sleep_enable_uart_wakeup()
函數可用於啓用此喚醒源。。