安信可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?,该电阻一般无需上件。
文章图片
三、目标芯片选择 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 |
文章图片
文章图片
文章图片
联系我们
官方官网:https://www.ai-thinker.com
开发DOCS:https://docs.ai-thinker.com
官方论坛:http://bbs.ai-thinker.com
技术支持:support@aithinker.com
推荐阅读
- ESP32-C3|ESP32-C3 应用程序的启动流程
- 电路小课堂|分享一款实用的太阳能充电电路(室内光照可用)
- Arduino|Arduino TFT_eSPI库来驱动SPI接口的LCD显示文字详解
- ESP32|基于arduino的ESP32 学习笔记(二) TFT_eSPI和LVGL库使用笔记
- esp32|Arduino应用开发——spi flash(以esp32和w25qxx为例)
- esp32|ESP32-S2应用开发——USB通信(虚拟串口)
- esp32|ESP32烧录Arduino生成的bin文件
- HaaS解决方案|看屏幕眼睛干(没问题 用ESP32和 HaaS Python做一个 全自动加湿器)
- HaaS解决方案|开工大吉,ESP32 + HaaS Python为您送上久坐提醒器,好好工作更要注意健康哦