项目背景:
提示:本篇文章同样适用于ESP32其他型号的Bluetooth和WiFi下的功耗问题。
项目背景简述:
- 本项目需要在保证Bluetooth功能正常的前提下实现低功耗功能。
- 在项目开发中,遇到Demo板发热严重。Demo板只有普通Bluetooth通讯和CAN通讯功能,并无耗电太大的元器件。
- 经排除,确认发热是由ESP32-C3这颗MCU引起的,ESP32只使用了Bluetooth,并没有使用WiFi。
1. 官网对睡眠模式的介绍:
我们需要了解到以下内容:
- ESP32 具有 Light-sleep 和 Deep-sleep 两种睡眠节能模式。
- 在 Light-sleep 模式下,数字外设、CPU、以及大部分 RAM 都使用时钟门控,同时其供电电压降低。退出该模式后,数字外设、CPU 和 RAM 恢复运行,并且内部状态将被保留。
- 在 Deep-sleep 模式下,CPU、大部分 RAM、以及所有由时钟 APB_CLK 驱动的数字外设都会被断电。芯片上继续处于供电状态的部分仅包括:RTC 控制器、ULP 协处理器、RTC 高速内存、RTC 低速内存。
- 在 Light-sleep 和 Deep-sleep 模式下,无线外设会被断电。因此,在进入这两种睡眠模式前,应用程序必须调用恰当的函数(esp_bluedroid_disable()、esp_bt_controller_disable() 或 esp_wifi_stop())来禁用 Wi-Fi 和 Bluetooth。在 Light-sleep 或 Deep-sleep 模式下,即使不调用这些函数也无法连接 Wi-Fi 和 Bluetooth。
- 如需保持 Wi-Fi 和 Bluetooth 连接,请启用 Wi-Fi 和 Bluetooth Modem-sleep 模式和自动 Light-sleep 模式(请参阅电源管理 API)。在这两种模式下,Wi-Fi 和 Bluetooth 驱动程序发出请求时,系统将自动从睡眠中被唤醒,从而保持连接。
值得注意的是:
①在 Light-sleep 或 Deep-sleep 模式下,无法连接 Wi-Fi 和 Bluetooth。
②在power save(Modem-sleep 模式+自动 Light-sleep 模式)下,Wi-Fi 和 Bluetooth 驱动程序发出请求时,系统将自动从睡眠中被唤醒,另外,官网文档睡眠模式中提到的适用于 Light-sleep 的唤醒源也适用于 power save 模式(Modem-sleep 模式+自动 Light-sleep 模式)。
结合项目需要在需要在保证Bluetooth功能正常的前提下实现低功耗功能的需求,因此,选用power save(Modem-sleep 模式+自动 Light-sleep 模式)。
原因分析:
问题1:
如图分别对应 WiFi 和蓝牙的示例,蓝牙的示例虽然是 nimble,bluedroid 也是类似的配置。
应用代码中需要加这部分:#include “esp_pm.h”
#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.
esp_pm_config_t pm_config ={
.max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ,
.min_freg_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
值得注意的是:
①使能 Light sleep 时,min_freq_mhz 为最小 CPU 频率 (MHz),即仅获取 ESP_PM_NO_LIGHT_SLEEP 锁后所使用的频率。
②未使能 Light sleep 时,min_freq_mhz 为释放所有电源管理锁或仅获取ESP_PM_NO_LIGHT_SLEEP锁后 CPU 的运行频率。
问题2:
提示:项目中LED全亮且亮度最大时,耗电40mA,在使用power save模式后并没有明显功耗降低的表现。
经过查找官网发现,如果要实现蓝牙低功耗的话,需要外加一个 32KHz 晶振。参考 ESP32-C3 硬件设计指南。
如果外接 32KHz 晶振的话,注意蓝牙低功耗时钟源需要设置为 32KHz 晶振。
此外,RTC 时钟源也要设置为 32KHz。