ESP8266 测试(一): ESP8266 Deep-sleep 模式下的电流功耗测试

一. 测试目的

经常会有开发者提出基于 ESP8266 Deep-sleep 模式下的电流功耗问题,本文将测试在连接 Wi-Fi 的情况下 Deep-sleep 模式下的 ESP8266 的电流功耗。


二. 测试环境

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

  • ESP8266_RTOS_SDK 版本

    • ESP8266_RTOS_SDK: release/v3.3
    • 对应的 commit: f7d65fe

    可通过以下命令确认:

    git log --oneline -1
    

    结果为:

    f7d65fe Merge branch 'bugfix/support_GD25Q64_qio_enable' into 'master'
    
  • toolchain 版本
    gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-92-g8facf4c),可通过以下命令确认:

    xtensa-lx106-elf-gcc -v
    

    结果为(log 过长,只需要关注最后的这部分。如下):

    Thread model: single
    gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-92-g8facf4c) 
    
  • 测试主机
    Linux 环境,Ubuntu 16.04 LTS,可选用其他平台。

  • 开发板
    ESP-WROOM-02D 模组,可选用其他基于 ESP8266 的开发板。

  • 测试示例
    ESP8266_RTOS_SDK/examples/wifi/simple_wifi 示例。

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

  • ESP8266 输入电压
    采用标准输入电压 3.3 V。


三. 测试步骤

在此次测试中使用了 ESP8266_RTOS_SDK 里的 simple_wifi 用例。

  1. 模组的焊接与接线图 & 电流功耗的测量方式

    这里使用了 ESP-WROOM-02D 开发板进行测试,以下是相应的焊接实物图以及接线图。

    焊接实物图 接线图
    ESP8266 测试(一): ESP8266 Deep-sleep 模式下的电流功耗测试_第1张图片 ESP8266 测试(一): ESP8266 Deep-sleep 模式下的电流功耗测试_第2张图片

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

  2. 先确保基于 ESP8266_RTOS_SDK 的编译、烧写、运行正常。

  3. 部分代码修改

    为了在 ESP8266 连接 Wi-Fi 后进入 Deep-sleep 模式,你需要在 simple_wifi 示例 main.c 中的 app_main 结束位置增加以下代码:

    esp_deep_sleep((1000*1000)*10); //10ms
    printf("finish!\n");
    

    然后在 main.c 文件开头加上 #include "esp_sleep.h" 来加入 Deep-sleep 相关头文件。

  4. 固件烧写及串口监视
    首先需要 下载并配置 ESP8266_RTOS_SDK,配置完成后,输入以下指令:

    cd ~/esp/ESP8266_RTOS_SDK/examples/wifi/simple_wifi
    make menuconfig
    

    menuconfig 界面,你需要设置需要连接的 AP 的 SSIDpassword,然后就可以运行如下指令进行固件烧录及串口监视:

    make erase_flash flash monitor ESPPORT=/dev/ttyUSB0 ESPBAUD=921600 -j8
    

    在串口监视工具中,当看到 Wi-Fi 以下 log 时,就可以进行电流功耗测试。

    I (43) boot: ESP-IDF v3.2-324-gf7d65fe-dirty 2nd stage bootloader
    I (43) boot: compile time 17:28:24
    I (43) boot: SPI Speed      : 40MHz
    I (47) boot: SPI Mode       : DIO
    I (51) boot: SPI Flash Size : 4MB
    I (55) boot: Partition Table:
    I (59) boot: ## Label            Usage          Type ST Offset   Length
    I (66) boot:  0 nvs              WiFi data        01 02 00009000 00006000
    I (74) boot:  1 phy_init         RF data          01 01 0000f000 00001000
    I (81) boot:  2 factory          factory app      00 00 00010000 000f0000
    I (89) boot: End of partition table
    I (93) esp_image: segment 0: paddr=0x00010010 vaddr=0x40210010 size=0x3a474 (238708) map
    0x40210010: _flash_cache_start at ??:?
    I (201) esp_image: segment 1: paddr=0x0004a48c vaddr=0x4024a484 size=0x0725c ( 29276) map
    I (214) esp_image: segment 2: paddr=0x000516f0 vaddr=0x3ffe8000 size=0x0097c (  2428) load
    I (215) esp_image: segment 3: paddr=0x00052074 vaddr=0x40100000 size=0x00a30 (  2608) load
    I (222) esp_image: segment 4: paddr=0x00052aac vaddr=0x40100a30 size=0x05880 ( 22656) load
    I (239) boot: Loaded app from partition at offset 0x10000
    I (262) system_api: Base MAC address is not set, read default base MAC address from EFUSE
    I (272) system_api: Base MAC address is not set, read default base MAC address from EFUSE
    phy_version: 1155.0, 6cb3053, Nov 11 2019, 17:31:08, RTOS new
    I (325) phy_init: phy ver: 1155_0
    I (330) reset_reason: RTC reset 1 wakeup 0 store 0, reason is 1
    I (337) simple wifi: ESP_WIFI_MODE_STA
    I (386) simple wifi: wifi_init_sta finished.
    I (391) simple wifi: connect to ap SSID:ZZTest password:22222222
    finish!
    

四. 测试结果

运行此示例,在成功连接到 Wi-Fi 后,ESP8266 会进入一段持续 10 s 的 Deep-sleep,在此期间的电流为 18.3 μA(输入电压为 3.3 V)。此外,通过查询 esp-wroom-02 技术规格书,发现 esp-wroom-02 系列的工作电压范围是 2.7 V ~ 3.6 V。在此工作电压范围下的电流功耗如下表。

输入工作电压 Deep-sleep 下的最小电流功耗
2.7 V 13.1 μA
2.8 V 14.2 μA
2.9 V 15.1 μA
3.0 V 15.5 μA
3.1 V 16.4 μA
3.2 V 17.7 μA
3.3 V 18.3 μA
3.4 V 19.6 μA
3.5 V 22.9 μA
3.6 V 30.2 μA

五. 可能的进一步优化

1. 以下是已进行测试的优化:

  1. 关闭唤醒后 RF 校验

    esp_deep_sleep() API 前添加 esp_deep_sleep_set_rf_option(2),这样 ESP8266 在唤醒后不会进行 RF 校验(如果不使用 esp_deep_sleep_set_rf_option(),则默认为 esp_deep_sleep_set_rf_option(1),此时会在唤醒后进行 RF 校验),这种优化理论上会减少初始化时间与对应电流功耗。

    实际测试结果:唤醒后电流在 18 mA ~ 75 mA 浮动,Deep-sleep 期间为 17.5 μA。 可能由于测试设备的限制(实际电流过低,变化较快),在关闭校验后观察到电流功耗基本没有变化。

  2. 减少 RF 功率消耗

    我们可以在 make menuconfig 里的 PHY-->Tx Power 选项里将默认的 20 调低,例如调至 15,请注意:这样会对 Wi-Fi 功能的正常运行产生影响。这种优化理论上会减少对应 RF 功率电流功耗。

    实际测试结果:唤醒后电流在 18 mA ~ 75 mA 浮动,Deep-sleep 期间为 17.5 μA。可能由于测试设备的限制(实际电流过低,变化较快),在减少 RF 功率消耗后观察到电流功耗基本没有变化。

2. 以下是已经查找到且有需要可以进行进一步尝试的优化(不推荐,实在需要进一步优化的用户可以进行尝试):

  1. 修改二进制文件

    使用以下指令来修改二进制文件来减少 flash 初始化时的时间和电流功耗:

    python	add_low-power_deepsleep_cmd.py	./bin	file
    
    • 如果 OTA 固件被使用,用户需要修改 boot_v1.5.bin 然后下载生成的 boot_v15_low_power.bin 到地址 0x0.

    • 如果无 OTA 固件被使用,用户需要修改 eagle.flash.bin 然后下载生成的 eagle.flash_low_power.bin 到地址 0x0.

  2. 选择 flash 类型和工作模式

    正确的 flash, 比如 ISSI-IS25LQ025,能显著减少固件加载时间,合适的 flash 工作模式也能减少固件加载时间。其中推荐四线工作模式。

  3. 清空 UART FIFO 来减少打印时间
    以下代码可以用来参考:

    SET_PERI_REG_MASK(UART_CONF0(0),	UART_TXFIFO_RST);//RESET FIFO
    CLEAR_PERI_REG_MASK(UART_CONF0(0),	UART_TXFIFO_RST);
    
  4. 同步数据传输

    数据传输在设备唤醒模式时具有更低的功耗,所以推荐在 ESP8266 唤醒时一次性发送许多数据包。

  5. 更新 SDK 至最新版

    随着 SDK 的更新,其中的 API 也会被优化,这样只需要更少的电流功耗。


六. 附加测试:ESP8266 在低工作电压下的 Deep-sleep 模式运行情况

  1. 测试目的:

    • 获得 ESP8266 能长时间进入 Deep-sleep 模式并唤醒的最低工作电压
    • 从最低工作电压以下回升至最低工作电压以上时 ESP8266 能否恢复运行
  2. 测试结果:

    • ESP8266 能长时间进入 Deep-sleep 模式并唤醒的最低工作电压为 2.3 V
    • 从最低工作电压以下回升至最低工作电压以上时 ESP8266 能顺利恢复运行

七. 总结

通过以上方法,可测出 ESP8266 在连接 Wi-Fi 后的 Deep-sleep 模式下的电流功耗,可见 ESP8266 的 Deep-sleep 模式非常省电。用户可选择采用以上方法对自己的 ESP8266 进行电流功耗测试。


八. 注意事项 & 知识点补充

  1. 进行 Deep-sleep 后 ESP8266 无法烧录其他固件

    当用户尝试烧录其他固件时,可能会出现无法成功烧录其他固件的情况, log 信息如下:

    Toolchain path: /home/jiangyafeng/esp/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc
    Toolchain version: crosstool-ng-1.22.0-100-ge567ec7
    Compiler version: 5.2.0
    Python requirements from /home/jiangyafeng/esp/ESP8266_RTOS_SDK/requirements.txt are satisfied.
    Flashing binaries to serial port /dev/ttyUSB4 (app at offset 0x10000)...
    esptool.py v2.4.0
    Connecting....
    Chip is ESP8266EX
    Features: WiFi
    MAC: bc:dd:c2:43:57:45
    Uploading stub...
    Running stub...
    Stub running...
    Changing baud rate to 921600
    Changed.
    Configuring flash size...
    Compressed 10784 bytes to 7148...
    A fatal error occurred: Timed out waiting for packet content
    /home/jiangyafeng/esp/ESP8266_RTOS_SDK/components/esptool_py/Makefile.projbuild:75: recipe for target 'flash' failed
    make: *** [flash] Error 2
    

    解决办法:首先将 ESP8266 上的 GPIO0 接 GND,然后将 ESP8266 断电后重新上电,最后重新将将ESP8266 上的 GPIO0 接底板对应的 GPIO0 即可(重新让 ESP8266 进入下载模式即可)。然后就可以成功烧录其他固件了。

  2. 自动唤醒和外部唤醒

    自动唤醒:ESP8266 在 Deep-sleep 模式下时,可以将 GPIO16 (XPD_DCDC) 连接至 EXT_RSTB。计时到达睡眠时间后,GPIO16 输出低电平给 EXT_RSTB 管脚,芯片即可被重置并被唤醒。

    外部唤醒:ESP8266 在 Deep-sleep 模式下时,可以通过外部 IO 在芯片 EXT_RSTB 管脚上产生一个低电平脉冲,芯片即可被重置并被唤醒。

  3. ESP8266 Deep-sleep 最大时间间隔
    事实上 ESP8266 并不会持续地维持这种深度睡眠状态,而是在一个指定间隔内关闭所有其它电路,当达到指定时间间隔后 ESP8266 将会自动重新启动一次,这个最大时间间隔为 4,294,967,295 µs,约合 71 分钟。这种模式非常适合于那种对时间间隔要求很长的场合,例如最常见的温度湿度检测,河水水位检测等。

  4. ESP8266 低工作电压时的 Deep-sleep 与 wake-up 情况说明
    经检测,工作电压低至 2.7 V 时仍能正常进入 Deep-sleep 与 wake up,请注意:在低于 2.7 V 时,ESP8266 可能会进入异常工作状态,后续如果将工作电压恢复至正常的 3.3 V 也无法恢复正常工作。如果要避免异常工作的情况发生,可以将 ESP8266 外接一个复位芯片来确保 ESP8266 最低只在 2.7 V 的时候进行工作(外界复位芯片通过当前 ESP8266 的工作电压大小来决定是否使能 EN,EN 使能时芯片才开始进入正常工作)。

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