ESP32 测试(一): Light-sleep 模式的电流功耗测试及特性

一. 测试目的

经常会有开发者提出基于 ESP32 Light-sleep 模式下的电流功耗问题,本文将测试在 Light-sleep 模式下的 ESP32 的电流功耗。


二. 测试环境

为了保证测试结果的一致性,采用以下测试环境:

  • esp-iot-solution
    编写本文时,最新的 esp-iot-solution release 版本对应的 commit 为
    40cec13。可通过以下命令确认:

    git log --oneline -1
    

    结果为:

    40cec13 Merge branch 'master' of https://github.com/espressif/esp-iot-solution
    
  • 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 的开发板。

  • 测试示例
    esp-iot-solution 里的 Light-sleep 示例。

  • 测试工具
    Tektronix MDO3104 示波器 或 Agilent 34401A 数字万用表, 使用相关测电流工具均可。


三. 测试步骤

这篇文档将介绍如何在 esp-iot-solution 平台下进行 Light-sleep 期间电流的测试。Light-sleep 测试代码在 esp-iot-solution 中可以找到 测试代码链接。

  1. 开发板的焊接与接线图

这次测试使用了 ESP32-WROOM-32D 开发板。以下是相应的焊接实物图以及接线图。

焊接实物图 接线图

注:测试时将万用表调至电流表模式,然后测量 Vcc 引脚上连接导线的电流即可。

  1. 工具链的安装

    在进行 Light-sleep 模式下的的电流功耗测试之前需要安装工具链。工具链的详细安装步骤可以在 ESP-IDF Programming Guide 找到,这里与不多加以描述。
     

    注: esp-iot-solution 使用与 esp-idf 相同的工具链, 所以如果你的平台上能够编译 esp-idf 中的 example,则工具链无须重复安装。

  2. 测试代码下载

    在工具链安装完成之后,接下来你需要下载完整的 esp-iot-solution 工程,推荐使用如下指令:

    git clone https://github.com/espressif/esp-iot-solution.git
    cd esp-iot-solution
    git submodule update --init --recursive
    

    更新 submodule 时可能需要几分钟的时间,如果本地已经有 esp-iot-solution 仓库,请及时更新到最新版本。
     

  3. 测试代码编译及下载

    编译 Light-sleep 测试用例 (Light-sleep 测试代码放在了 esp-iot-solution/tools/unit-test-app/components 目录下)。

    • 1 工程配置

      make menuconfig
      

      menuconfig-->Serial flasher config 中修改串口号和波特率。

    • 2 代码编译

      cd esp-iot-solution/tools/unit-test-app
      make TEST_COMPONENTS=light_sleep
      
    • 3 固件烧写

      代码编译通过后,将编译生成的 .bin 文件烧写到开发板上。 首先将 GPIO0 拉低,然后按下复位键让芯片进入下载模式。执行指令:

      make flash
      

      注:波特率太高,可能会下载失败,太低则烧写过程缓慢。一般可以配置成 921600

  4. Light-sleep 电流测试用例 log

    打开串口终端,按下复位键后,芯片启动。你将看到如下打印信息:

    Here's the test menu, pick your combo:
    (1)	"Light_sleep get wake_up cause test" [light_sleep][iot]
    (2)	"Light_sleep EXT0 wakeup test" [light_sleep][iot]
    (3)	"Light_sleep EXT1 wakeup test" [light_sleep][iot]
    (4)	"Light_sleep touch_pad wakeup test" [light_sleep][iot]
    (5)	"Light_sleep time wakeup test" [light_sleep][iot]
    (6)	"Time to enter light_sleep test" [light_sleep][iot]
    

    log 上列举的就是你可以进行的测试选项,其中使用了不同的唤醒源,比如 输入 5 则进行 Light_sleep time wakeup test 。在 Light-sleep 期间,你可以对电流进行测试。Light-sleep 期间, 由于分别测试了不同的唤醒源,电流是 0.72 mA - 1.27 mA 左右。

     

    注:使用此示例对不同的唤醒源进行测试,需要你拉高对应的 GPIO(使用导线连接相关 GPIO 与 VCC ),目前需要上拉的 GPIO 列表如下:

    唤醒源 需要拉高的 GPIO
    EXT0 GPIO34 或 GPIO35 或 GPIO36 或 GPIO39
    EXT1 GPIO39 (可在代码里调整成 GPIO35)
    timer 无需刻意拉高 GPIO
  5. 示波器或万用表的连接方法
    在这里,你要注意设置示波器或电流表的量程(Light-sleep 模式下的电流处于 mA 级别)。按照上图操作即可,如果使用的是 ESP32-WROOM-32D 开发板,将电流表正负探针分别接在 3.3 V 电源 与 模块 Vcc 引脚即可(此时模块应用此 3.3 V 电源供电)。
     

    注:如果用示波器,请注意电流在示波器上能显示的最小单位,如果最小单位为 10 mA 及以上,可能会导致测量结果不准确。

  6. 附加测试方法

    如果你不想使用官方测试用例,或者你想测试进入 Light-sleep 模式与从 Light-sleep 模式恢复所需要的时间,你可以参考以下代码来自行编写测试用例。

    • 进入 Light-sleep 模式需要的时间

      首先,你可以对进入 Light-sleep 模式的时间进行测试。 在调用 esp_light_sleep_start 来启动 Light-sleep 模式之前先设置一个 GPIO(此处我们使用 GPIO18 )从高电平至低电平。 如下所示,大约 200 us 之后,芯片完全进入了 Light-sleep 状态。对应代码如下所示。

      gpio_set_level(GPIO_NUM_18, 1);
      vTaskDelay(2000 / portTICK_PERIOD_MS);
      gpio_set_level(GPIO_NUM_18, 0);
      esp_light_sleep_start();
      
    • 从 Light-sleep 模式中恢复需要的时间

      第二项测试是从 Light-sleep 模式下恢复所需要的时间。 芯片唤醒后,程序将从上次停止的位置继续执行,而不是重新启动。 因此,你可以将 EXT0 配置为唤醒源,并且在 EXT0 源触发后大约 566 us,芯片恢复正常运转,GPIO18 输出为低电平。 此测试对应的代码如下。

      esp_sleep_enable_ext0_wakeup(GPIO_NUM_34, 0);
      gpio_set_level(GPIO_NUM_18, 0);
      esp_light_sleep_start();
      gpio_set_level(GPIO_NUM_18, 1);
      

四. 测量结果

当 ESP32-WROOM-32D 进入 Light-sleep 模式后,分别使用不同唤醒源进行设置,获得的测试结果稍大于官方文档上的数值,手工焊接,集成度不如 ESP32-WROOM-32D 开发板,部分 GPIO 未被禁用均可能导致测量结果不准确。测试结果如下:

唤醒源 Light-sleep下的最小电流功耗
EXT0 1.27 mA
EXT1 1.19 mA
timer 0.72 mA

五. 可能导致测试结果不准确的原因

  1. 在进入 Light-sleep 之前,那些由 VDD3P3_CPU 供电的 GPIO 应该被全部禁用。 否则,由于 GPIO 泄漏电流,电流会更高(约 1.5mA )。

六. 总结

通过以上方法,可测出 ESP32 的 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() 函数可用于启用此唤醒源。

你可能感兴趣的:(ESP32,TEST)