一. 测试目的
经常会有开发者提出基于 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()
函数可用于启用此唤醒源。。