本教程适用于ESP32S32S、ESP32C3、ESP32C6
介绍睡眠模式
有三种常见的ESP32系列休眠方式,分别是Modem-sleep、Light-sleep 和 Deep-sleep。
Modem-sleep模式:CPU 正常工作,可配置时钟。 进入 Modem-sleep 模式之后,也可以选择减少模式。 CPU 时钟频率,进一步降低电流。WiFi或WiFi在休眠期间 Bluetooth LE 可以保持连接。
Light-sleep模式:CPU 停止工作,数字内核时钟有限。任何觉醒事件(MAC、主机、RTC 定时器或外部中断)会唤醒芯片。WiFi或WiFi在休眠期间 Bluetooth LE 可以保持连接。
Deep-sleep模式:数字内断电,CPU 内容丢失。RTC 时钟定时器或 RTC GPIO 从Deep-sleep模式中可以唤醒芯片。进入⼊休眠状态后,关闭RTC。 所有其他模块都在模块之外。WiFi或者Bluetooth LE不能保持连接。
关于睡眠模式的具体说明请参考睡眠模式。 - ESP32 - ESP-IDF 编程指南 latest 文档。
硬件准备
ESP32系列模块支持外置32.768 kHz 作为时钟振荡器 RTC 睡眠时钟,还支持外部激励信号(如有源晶振) RTC 睡眠时钟。ESP32外置32.768 如下图所示,kHz晶振电路。具体的32k晶振引脚请参考相应芯片的技术文件。 | 乐鑫科技。
软件准备
部分源代码分析
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 这是REF_TICK默认时钟生成1MHz所需的最小频率。
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,这两个参数影响连接间隔, 可以设定0x006~0x0C80的范围,连接间隔为0x006~0x0 Time = N * 1.25 ms
比如:0x320(十六进制)= 800(十进制)* 1.25ms = 1s
注意:最大连接间隔是 4 s,因此,当设置超过4s时,设置无效,就会变成默认间隔,功耗也会增加。
基于ESP的完整示例代码链接(基于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
发表评论