ESP32 測試(五): Light-sleep 模式下的電流功耗測試及特性(使用 Wi-Fi)

一. 測試目的

經常會有開發者提出基於 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 用例。

  1. 接入電流表
    測試時將萬用表調至電流表模式,然後測量 Vcc 引腳上連接導線的電流即可。

  2. 固件燒寫及串口監視
    首先你需要 下載並配置esp-idf,配置完成後你需要輸入以下指令:

    cd ~/esp/esp-idf/examples/wifi/power_save
    make menuconfig
    

    menuconfig 界面,你需要設置需要連接的AP的 SSIDpassword,你也可以在 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() 函數可用於啓用此喚醒源。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章