当您的IoT项目由家用市电提供电源时,您不会太在乎功耗。但是,如果您要使用电池为项目供电,则需要计算每个mA电流。
这里的解决方案是利用其一种睡眠模式来减少ESP32的功耗使用情况。实际上,这是一个很好的策略,可以显著提高不需要一直活跃的项目的电池寿命。
要了解ESP32如何实现节能,首先我们需要知道芯片内部的内容。下图显示了ESP32芯片的功能框图。
ESP32芯片的核心是一个双核32位微处理器,具有448 kb的ROM、520 kb的SRAM和4MB的存储器。
该芯片还包含一个WiFi模块、一个蓝牙模块、一个加密加速器(专门设计用于执行加密操作的协调员)、一个RTC模块和许多外围设备。
ESP32的高级电源管理提供了五种可配置的电源模式。根据功耗要求,芯片可以在不同的功率模式之间切换。这些模式是:
● 活动模式
● 调制解调器睡眠模式
● 轻度睡眠模式
● 深度睡眠模式
● 休眠模式
每种模式都有自己的独特功能和节能。
正常模式也称为活动模式。在这种模式下,芯片的所有功能都保持活跃。
由于活动模式始终运行所有操作(尤其是WiFi模块、处理核心和蓝牙模块),因此操作芯片需要超过240mA的电流。还可以观察到,如果您一起使用WiFi和蓝牙,有时会出现高功率尖峰(高达790mA)。
显然,这是最低效率的模式,并消耗最多的电流。因此,如果您想节省电源,则必须利用另一种功耗模式来禁用未使用的功能。
在调制解调器睡眠模式下,除了WiFi、蓝牙和射频外,其他所有内容都是活跃的。它还可以使CPU运行,并且时钟是可配置的。
在这种模式下,芯片在慢速下消耗了约3mA,高速消耗20mA。
为了使WiFi/蓝牙连接保持活动,Wi-Fi、蓝牙和射频以预定义的间隔唤醒。这被称为关联睡眠模式(Association Sleep Pattern)。
在这种睡眠方式中,ESP32在活动模式和调制解调器睡眠模式之间切换。为此,ESP32使用DTIM信标机制在站模式下连接到路由器。
为了节省功耗,ESP32停用了两个DTIM信标间隔之间的Wi-Fi模块,并在下一个信标到达之前自动醒来。睡眠时间由路由器的DTIM信标间隔时间决定,通常为100ms至1000ms。
轻度睡眠类似于Modem睡眠,芯片也遵循其中的关联睡眠方式。
唯一的区别是,在轻度睡眠模式下,数字外围设备,大多数RAM和CPU都是时钟门控。
在轻度睡眠模式下,CPU通过关闭其时钟脉冲而暂停,而RTC和ULP-CoproCessor保持活跃。
在进入轻度睡眠模式之前,ESP32将其内部状态存储在RAM中,并在从睡眠中醒来时恢复操作。这被称为完全保留(Full RAM Retention)。
一旦配置了唤醒源,使用esp_light_sleep_start()函数进入轻度睡眠。
在深度睡眠模式下,CPU、大多数RAM和所有数字外围设备都可以关闭。芯片唯一保持运行的部分是:
● ULP协处理器
● RTC控制器
● RTC外围设备
● RTC快速而缓慢的内存
芯片将消耗约0.15 mA(如果ULP协处理器打开)至10µA。
在深度睡眠模式下,主CPU被关闭,而UltraLowPower(ULP)协处理器可以采用传感器读数,并在必要时唤醒CPU。这种睡眠模式称为ULP传感器监控模式。这对于设计应用程序需要由外部事件或计时器或两者组合唤醒的应用程序很有用,同时保持最少的功耗。
与CPU一起,芯片的主要内存也被禁用。因此,存储在该内存中的所有内容被删除且都无法访问。
由于RTC内存一直供电,因此即使在深度睡眠期间也保留了其内容,并且可以在芯片唤醒后检索。这就是为什么芯片在进入深度睡眠之前将Wi-Fi和蓝牙连接数据存储在RTC内存中的原因。
如果要在重新启动后使用数据,请通过使用RTC_DATA_ATTR属性来定义全局变量,将其存储在RTC内存中。例如,RTC_DATA_ATTR int myVar = 0;
从深度睡眠中出来后,芯片通过复位重新启动,并从一开始就开始执行程序。
与其他睡眠模式不同,系统无法自动进入深度睡眠模式。 esp_deep_sleep_start()函数用于配置唤醒源后立即进入深度睡眠。
与深度睡眠模式不同,在休眠模式下,芯片会禁用内部8 MHz振荡器以及ULP处理器。 RTC恢复内存也已关闭,这意味着我们在休眠模式下无法保留任何数据。
除了一个RTC计时器(在慢速时钟)和一些RTC GPIO外,其他所有内容都被关闭。他们负责从休眠模式中唤醒芯片。
这进一步降低了功耗。在休眠模式下芯片仅消耗约2.5μa。如果您要构建一个不需要一直活跃的项目,则此模式特别有用。
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。
本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。
ESP32Encoder库是一个利用ESP32脉冲计数器硬件外设实现高效旋转编码器读取的软件库。
本文对比了几款适合物联网开发的盒子硬件参数,供大家参考。
乐动掌控采用掌控板作为主控,塑胶一体式外壳,侧面和底面开具多个乐高扩展孔位,兼容乐高积木,可完成多种创意应用。
在MicroPython的ESP32库中,NVS类用于管理非易失性存储,支持 32 位有符号整数和 二进制blob。
Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。