风筝
发表于: 2022-11-6 11:01:12 | 显示全部楼层

毫无疑问,ESP32是许多WiFi/MCU Socs强有力的竞争者,在性能和价格上具有绝对优势。但是,根据它的使用方式,ESP32可以是对功耗要求较高的设备。


当您的IoT项目由家用市电提供电源时,您不会太在乎功耗。但是,如果您要使用电池为项目供电,则需要计算每个MA电流。


这里的解决方案是利用其一种睡眠模式来减少ESP32的功耗使用情况。实际上,这是一个很好的策略,可以显着提高不需要一直活跃的项目的电池寿命。


ESP32芯片内部

要了解ESP32如何实现节能,首先我们需要知道芯片内部的内容。下图显示了ESP32芯片的功能框图。

Block-Diagrams.jpg


ESP32芯片的核心是一个双核32位微处理器,具有448 kb的ROM、520 kb的SRAM和4MB的存储器。


该芯片还包含一个WiFi模块、一个蓝牙模块、一个加密加速器(专门设计用于执行加密操作的协调员)、一个RTC模块和许多外围设备。


ESP32电源模式

由于ESP32的高级电源管理,它提供了五种可配置的电源模式。根据功耗要求,芯片可以在不同的功率模式之间切换。这些模式是:

●    活动模式

●    调制解调器睡眠模式

●    轻度睡眠模式

●    深度睡眠模式

●    休眠模式


每种模式都有自己的独特功能和节能。让我们一一看他们。


ESP32活动模式

正常模式也称为活动模式。在这种模式下,芯片的所有功能都保持活跃。


由于活动模式始终运行所有操作(尤其是WiFi模块、处理核心和蓝牙模块),因此操作芯片需要超过240mA的电流。还可以观察到,如果您一起使用WiFi和蓝牙,有时会出现高功率尖峰(高达790mA)。

ESP32-Active-Mode-Functional-Block-Diagram.jpg


显然,这是最低效率的模式,并消耗最多的电流。因此,如果您想节省电源,则必须利用另一种功耗模式来禁用未使用的功能。


ESP32调制解调器睡眠

在调制解调器睡眠模式下,除了WiF、蓝牙和射频外,其他所有内容都是活跃的。它还可以使CPU运行,并且时钟是可配置的。


在这种模式下,芯片在慢速下消耗了约3mA,高速消耗20mA。

ESP32-Modem-Sleep-Functional-Block-Diagram.jpg


为了使WiFi/蓝牙连接保持活动,Wi-Fi、蓝牙和射频以预定义的间隔唤醒。这被称为关联睡眠模式(Association Sleep Pattern)。


在这种睡眠方式中,ESP32在活动模式和调制解调器睡眠模式之间切换。为此,ESP32使用DTIM信标机制在站模式下连接到路由器。


为了节省功耗,ESP32停用了两个DTIM信标间隔之间的Wi-Fi模块,并在下一个信标到达之前自动醒来。睡眠时间由路由器的DTIM信标间隔时间决定,通常为100ms至1000ms。


ESP32轻度睡眠

轻度睡眠类似于现代睡眠。芯片也遵循其中的关联睡眠方式。


唯一的区别是,在轻度睡眠模式下,数字外围设备,大多数RAM和CPU都是时钟门控。


在轻度睡眠模式下,CPU通过关闭其时钟脉冲而暂停,而RTC和ULP-CoproCessor保持活跃。这会导致比0.8mA左右的调制解调器睡眠模式低功耗。

ESP32-Light-Sleep-Functional-Block-Diagram.jpg


在进入轻度睡眠模式之前,ESP32将其内部状态存储在RAM中,并在从睡眠中醒来时恢复操作。这被称为完全保留(Full RAM Retention)。


一旦配置了唤醒源,使用esp_light_sleep_start()函数进入轻度睡眠。


ESP32深度睡眠

在深度睡眠模式下,CPU、大多数RAM和所有数字外围设备都可以关闭。芯片唯一保持运行的部分是:

●    ULP协处理器

●    RTC控制器

●    RTC外围设备

●    RTC快速而缓慢的内存

芯片将消耗约0.15 mA(如果ULP协处理器打开)至10µA。

ESP32-Deep-Sleep-Functional-Block-Diagram.jpg


在深度睡眠模式下,主CPU被关闭,而Ultra­Low­Power(ULP)协处理器可以采用传感器读数,并在必要时唤醒CPU。这种睡眠模式称为ULP传感器监控模式。这对于设计应用程序需要由外部事件或计时器或两者组合唤醒的应用程序很有用,同时保持最少的功耗。


与CPU一起,芯片的主要内存也被禁用。因此,存储在该内存中的所有内容被删除且都无法访问。


由于RTC内存一直供电,因此即使在深度睡眠期间也保留了其内容,并且可以在芯片唤醒后检索。这就是为什么芯片在进入深度睡眠之前将Wi-Fi和蓝牙连接数据存储在RTC内存中的原因。


如果要在重新启动后使用数据,请通过使用RTC_DATA_ATTR属性来定义全局变量,将其存储在RTC内存中。例如,RTC_DATA_ATTR int myVar = 0;


从深度睡眠中出来后,芯片通过复位重新启动,并从一开始就开始执行程序。


与其他睡眠模式不同,系统无法自动进入深度睡眠模式。 esp_deep_sleep_start()函数用于配置唤醒源后立即进入深度睡眠。


ESP32休眠模式

与深度睡眠模式不同,在休眠模式下,芯片会禁用内部8 MHz振荡器以及ULP处理器。 RTC恢复内存也已关闭,这意味着我们在休眠模式下无法保留任何数据。


除了一个RTC计时器(在慢速时钟)和一些RTC GPIO外,其他所有内容都被关闭。他们负责从休眠模式中唤醒芯片。

ESP32-Hibernation-Mode-Functional-Block-Diagram.jpg


这进一步降低了功耗。在休眠模式下芯片仅消耗约2.5μa。如果您要构建一个不需要一直活跃的项目,则此模式特别有用。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-7-20 11:01 , Processed in 0.038998 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表