【ESP32填坑日记】问题篇⑥ ESP32-C3低功耗问题

项目背景:

提示:本篇文章同样适用于ESP32其他型号的Bluetooth和WiFi下的功耗问题。

项目背景简述:

  1. 本项目需要在保证Bluetooth功能正常的前提下实现低功耗功能。
  2. 在项目开发中,遇到Demo板发热严重。Demo板只有普通Bluetooth通讯和CAN通讯功能,并无耗电太大的元器件。
  3. 经排除,确认发热是由ESP32-C3这颗MCU引起的,ESP32只使用了Bluetooth,并没有使用WiFi。

提示:本文默认读者已经阅读过官网文档中的睡眠模式应用程序示例

1. 官网对睡眠模式的介绍:

在这里插入图片描述
我们需要了解到以下内容:

  1. ESP32 具有 Light-sleep 和 Deep-sleep 两种睡眠节能模式。
  2. 在 Light-sleep 模式下,数字外设、CPU、以及大部分 RAM 都使用时钟门控,同时其供电电压降低。退出该模式后,数字外设、CPU 和 RAM 恢复运行,并且内部状态将被保留。
  3. 在 Deep-sleep 模式下,CPU、大部分 RAM、以及所有由时钟 APB_CLK 驱动的数字外设都会被断电。芯片上继续处于供电状态的部分仅包括:RTC 控制器、ULP 协处理器、RTC 高速内存、RTC 低速内存。
  4. 在 Light-sleep 和 Deep-sleep 模式下,无线外设会被断电。因此,在进入这两种睡眠模式前,应用程序必须调用恰当的函数(esp_bluedroid_disable()、esp_bt_controller_disable() 或 esp_wifi_stop())来禁用 Wi-Fi 和 Bluetooth。在 Light-sleep 或 Deep-sleep 模式下,即使不调用这些函数也无法连接 Wi-Fi 和 Bluetooth。
  5. 如需保持 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。
在这里插入图片描述