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
在工程目录下运行
idf.py menuconfig
⚫ 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
⚫ 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
⚫ 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
#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
设置之前先了解一下wifi省电模式下的四个基本概念:
每一个Beacon的帧中都有一个TIM信息 ,它主要用来由AP通告它管辖下的哪个STA有信息现在缓存在AP 中,而在TIM中包含一个Bitmap control 字段,它最大是251个字节,每一位映射一个STA,当为1时表示该位对应的STA在AP的缓存中有信息。
DTIM用于传统节电模式中,多点的应用,即由AP通过设置DTIM的间隔(缺省是一个beacon时间,100ms),根据这个间隔发送组播流量。
这个值不会影响单播的流量传递,如果没有开启PS的用户使用组播也不会受到影响,但是会影响开启了PS的用户接收多播数据的传递,如果设置的太小,起不到节电作用,太大又可能会影响组播通讯的质量,这个过程是一个trial-error的调整过程,只能一个一个测试调整,以达到最佳,既可以达到最佳节电效果又不影响应用。
DTIM=1表示每个beacon中都包含DTIM, DTIM=2表示每两个beacon中包含一个DTIM,以此类推。
这个值变大,有助于client端省电。
这个值变小,有助于提高client端连接速度。降低了基地台的buffer frame负载。
一般预设为100mS。
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]