本教程适用于ESP32-S3、ESP32-C3、ESP32-C6
睡眠模式介绍
ESP32系列常见的休眠方式有三种,分别为Modem-sleep、Light-sleep 和 Deep-sleep。
Modem-sleep模式:CPU正常工作,可以对时钟进行配置。进入 Modem-sleep 模式后,还可以选择降低CPU时钟频率,进⼀步降低电流。休眠期间WiFi或 Bluetooth LE 可保持连接。
Light-sleep模式:CPU暂停工作,数字内核时钟受限。任何唤醒事件(MAC、主机、RTC 定时器或外部中断)都会唤醒芯片。休眠期间WiFi或Bluetooth LE可保持连接。
Deep-sleep模式:数字内核断电,CPU内容丢失。RTC时钟定时器或RTC GPIO可以将芯片从Deep-sleep模式中唤醒。进⼊休眠状态后,关闭除RTC模块外的所有其他模块。休眠期间WiFi或Bluetooth LE无法保持连接。
硬件准备
ESP32系列模组既支持外置32.768 kHz的时钟振荡器作为RTC睡眠时钟,也支持外部激励信号(如有源晶振)作为RTC睡眠时钟。ESP32外置32.768 kHz晶振的电路如下图所示。具体的32k晶振引脚请参考对应芯片的技术规格书。
(https://www.espressif.com.cn/zh-hans/support/documents/technical-documents?keys=&field_download_document_type_tid%5B%5D=510)
软件准备
部分源码解析
1. 电源管理功能
电源管理功能(power_managenment) 是ESP-IDF中集成的电源管理算法,可以根据应用程序组件的需求,调整外围总线 (APB) 频率和CPU频率,并使芯片进入Light-sleep模式,尽可能减少运行应用程序的功耗。
通过调用esp_pm_configure() 函数,在应用程序中启用动态调频 (DFS) 功能和自动 Light-sleep 模式。此函数的参数 esp_pm_config_t 定义了频率调节的相关设置。在此参数结构中,需要初始化以下三个字段:
max_freq_mhz :最大 CPU 频率 (MHz),获取 ESP_PM_CPU_FREQ_MAX 锁后所使用的频率。
min_freq_mhz :最小 CPU 频率 (MHz),即未持有电源管理锁时所使用的频率。注意,10 MHz 是生成1MHz的REF_TICK默认时钟所需的最小频率。
light_sleep_enable :没有获取任何管理锁时,决定系统是否需要自动进入Light-sleep状态( true/false)。
2. ble广播间隔
在程序中有个结构体 adv_params,其中有两个变量 .adv_int_min 和 .adv_int_max,这两个参数影响着广播间隔,可设置范围为 0x20~0x4000,广播时间间隔为 Time = N * 0.625 ms。
例如:0x640(十六进制)= 1600(十进制)* 0.625ms = 1s
3. ble连接间隔
当连接成功后,在连接事件中有两个变量 conn_params.max_int 和 conn_params.min_int,这两个参数影响着连接间隔, 可设置范围为0x0006~0x0C80,连接间隔为 Time = N * 1.25 ms
例如:0x320(十六进制)= 800(十进制)* 1.25ms = 1s
注:最大连接间隔是 4 s,所以当设置超过4s时设置无效,则会变成了默认的间隔,功耗会增加。
完整示例代码链接(基于ESP-IDF release/v5.3版本)
https://gitee.com/SNKjxn/ble_power_save
获取工程后,激活esp-idf并进入工程目录下
设置目标芯片
idf.py set-target (目标芯片型号)
例如:
编译烧录
正常运行log如下:
功耗测试结果参考
注意:下面的测试结果,硬件均为外加32k晶振的单模块。
软件广播间隔1s,连接间隔1s。
ESP32-C3
平均功耗 474ua
ESP32-C6
平均功耗 512ua
ESP32-S3
平均功耗 826ua
全部0条评论
快来发表一下你的评论吧 !