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

一、前言

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Ω,该电阻一般无需上件。
在这里插入图片描述

三、目标芯片选择

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

⚫ 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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
联系我们
官方官网:https://www.ai-thinker.com
开发DOCS:https://docs.ai-thinker.com
官方论坛:http://bbs.ai-thinker.com
技术支持:[email protected]

猜你喜欢

转载自blog.csdn.net/Boantong_/article/details/123873182