安信可ESP32C3系列|安信可经验分享 | WiFi保持连接状态下低功耗的实现,适用于ESP32/ESP32C3/ESP32S3系列模组二次开发


文章目录

    • 一、前言
    • 二、硬件准备
    • 三、目标芯片选择
    • 四、menuconfig配置项
      • ESP32系列模组 操作说明
      • ESP32C3系列模组 操作说明
      • ESP32S3系列模组 操作说明
    • 五、代码
        • 5.1 初始化电源管理:
        • 5.2 设置Listen-Interval
            • 1、TIM(traffic indication message)
            • 2、DTIM(Delivery Traffic Indication Message )
            • 3、Beacon-Interval(信标间隔)
            • 4、Listen-Interval, (STA即Client接收Beacon 的周期)
    • 六、功耗测试

一、前言 ESP32/ESP32C3/ESP32S3系列模组都有三种低功耗模式:
? Modem-sleep 模式:CPU 可运行,时钟频率可配置。Wi-Fi 及 Bluetooth LE 的基带和射频关闭,但 Wi-Fi
或 Bluetooth LE 可保持连接。
? Light-sleep 模式:CPU 暂停运行。任何唤醒事件(MAC、主机、RTC 定时器或外部中断)都会唤醒芯片。
Wi-Fi 或 Bluetooth LE 可保持连接。
? Deep-sleep 模式:CPU 和大部分外设都会掉电,只有 RTC 存储器处于工作状态。Wi-Fi 连接数据存储在
RTC 中。
功耗Modem-sleep > Light-sleep > Deep-sleep(详细功耗数据见规格书);其中 Modem-sleep和 Light-sleep两种模式下可以保持 Wi-Fi或 Bluetooth LE 。
本文介绍Light-sleep下如何保持WIFI连接。
二、硬件准备 ESP32/ESP32C3/ESP32S3系列模组没有强制要求用32 kHz 的外部晶振,但用32 kHz外部晶振会比不用外部32kHz晶振功耗低很多。32 kHz 的外部晶振具体接哪些引脚见规格书管脚描述。
32.768 kHz 晶振选择要求:
? 等效内阻 (ESR) ? 70 k?;
? 两端负载电容值根据晶振的规格要求进行配置。
? 并联电阻 R4 用于偏置晶振电路,电阻值要求 5 M? < R10 ? 10 M?,该电阻一般无需上件。
安信可ESP32C3系列|安信可经验分享 | WiFi保持连接状态下低功耗的实现,适用于ESP32/ESP32C3/ESP32S3系列模组二次开发
文章图片

三、目标芯片选择 esp32系列模组:
idf.py set-target esp32

esp32c3系列模组:
idf.py set-target esp32c3

esp32s3系列模组:
idf.py set-target esp32s3

四、menuconfig配置项 在工程目录下运行
idf.py menuconfig

ESP32系列模组 操作说明
? Component config → ESP32-Specific → RTC clock source → External 32kHz crystal
? Component config → Power Management → 勾选 Support for power management
? Component config → FreeRTOS → Tick rate (Hz) 改为 1000
? Component config → FreeRTOS → 勾选 Tickless idle support
ESP32C3系列模组 操作说明
? Component config → ESP32C3-Specific → RTC clock source → External 32kHz crystal
? Component config → Power Management → 勾选 Support for power management
【安信可ESP32C3系列|安信可经验分享 | WiFi保持连接状态下低功耗的实现,适用于ESP32/ESP32C3/ESP32S3系列模组二次开发】? Component config → FreeRTOS → Tick rate (Hz) 改为 1000
? Component config → FreeRTOS → 勾选 Tickless idle support
ESP32S3系列模组 操作说明
? Component config → ESP32S3-Specific → RTC clock source → External 32kHz crystal
? Component config → Power Management → 勾选 Support for power management
? Component config → FreeRTOS → Tick rate (Hz) 改为 1000
? Component config → FreeRTOS → 勾选 Tickless idle support
五、代码 5.1 初始化电源管理:
#if CONFIG_PM_ENABLE // Configure dynamic frequency scaling: // maximum and minimum frequencies are set in sdkconfig, // automatic light sleep is enabled if tickless idle support is enabled. #if CONFIG_IDF_TARGET_ESP32 esp_pm_config_esp32_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32S2 esp_pm_config_esp32s2_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32C3 esp_pm_config_esp32c3_t pm_config = { #elif CONFIG_IDF_TARGET_ESP32S3 esp_pm_config_esp32s3_t pm_config = { #endif .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, #if CONFIG_FREERTOS_USE_TICKLESS_IDLE .light_sleep_enable = true #endif }; ESP_ERROR_CHECK( esp_pm_configure(&pm_config) ); #endif // CONFIG_PM_ENABLE

5.2 设置Listen-Interval 设置之前先了解一下wifi省电模式下的四个基本概念:
1、TIM(traffic indication message) 每一个Beacon的帧中都有一个TIM信息 ,它主要用来由AP通告它管辖下的哪个STA有信息现在缓存在AP 中,而在TIM中包含一个Bitmap control 字段,它最大是251个字节,每一位映射一个STA,当为1时表示该位对应的STA在AP的缓存中有信息。
2、DTIM(Delivery Traffic Indication Message ) DTIM用于传统节电模式中,多点的应用,即由AP通过设置DTIM的间隔(缺省是一个beacon时间,100ms),根据这个间隔发送组播流量。
这个值不会影响单播的流量传递,如果没有开启PS的用户使用组播也不会受到影响,但是会影响开启了PS的用户接收多播数据的传递,如果设置的太小,起不到节电作用,太大又可能会影响组播通讯的质量,这个过程是一个trial-error的调整过程,只能一个一个测试调整,以达到最佳,既可以达到最佳节电效果又不影响应用。
DTIM=1表示每个beacon中都包含DTIM, DTIM=2表示每两个beacon中包含一个DTIM,以此类推。
3、Beacon-Interval(信标间隔) 这个值变大,有助于client端省电。
这个值变小,有助于提高client端连接速度。降低了基地台的buffer frame负载。
一般预设为100mS。
4、Listen-Interval, (STA即Client接收Beacon 的周期) AP 广播Beacon 的周期为Beacon-Interval,STA 可以自由选择Beacon-Interval的整数倍作为自己的Listen-Interval,比如10。
STA 每隔Listen-Interval 接收Beacon并解码其中的TIM,如果TIM 指示没有数据缓存,STA 就可以立刻转入Doze 状态,如果TIM 指示其有数据缓存,STA 就要向AP 发一个竞选控制包Poll,AP 在收到Poll 后就可以向该Poll 的源STA 发送一个为它缓存的数据包。
了解了以上概念后,我们在代码里面设置listen_interval 的值
static void wifi_power_save(void) { tcpip_adapter_init(); ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL)); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); wifi_config_t wifi_config = { .sta = { .ssid = "AIOT@Aithinker",//设置WiFi名称 .password = "12345678", //设置WiFi密码 .listen_interval = 10,//listen_interval=10 即10个Beacon-Interval,每个Beacon-Interval默认为100ms }, }; ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_LOGI(TAG, "esp_wifi_set_ps()."); esp_wifi_set_ps(WIFI_PS_MAX_MODEM); }

完整示例代码:
https://github.com/espressif/esp-idf/tree/master/examples/wifi/power_save
六、功耗测试 以下数据外挂32.768K晶振在屏蔽房测试所得
系列模组 ESP32 ESP32C3 ESP32S3
DTIM10功耗 1.4ma 681ua 1.1ma
安信可ESP32C3系列|安信可经验分享 | WiFi保持连接状态下低功耗的实现,适用于ESP32/ESP32C3/ESP32S3系列模组二次开发
文章图片

安信可ESP32C3系列|安信可经验分享 | WiFi保持连接状态下低功耗的实现,适用于ESP32/ESP32C3/ESP32S3系列模组二次开发
文章图片

安信可ESP32C3系列|安信可经验分享 | WiFi保持连接状态下低功耗的实现,适用于ESP32/ESP32C3/ESP32S3系列模组二次开发
文章图片

联系我们
官方官网:https://www.ai-thinker.com
开发DOCS:https://docs.ai-thinker.com
官方论坛:http://bbs.ai-thinker.com
技术支持:support@aithinker.com

    推荐阅读