风筝
发表于: 2021-9-6 12:00:22 | 显示全部楼层

ESP32是一款最受欢迎的基于Wi-Fi的微控制器模块之一,它是许多便携式物联网应用的热门选择。它是一个强大的控制器,支持双核编程,还具有内置的低功耗蓝牙 (BLE) ,使其成为 iBeacon设备、GPS跟踪器等便携式应用的理想选择。 然而,在这些电池供电的应用中,主要关注的是备用电池。可以通过对微控制器单元进行更智能的控制来增加这种备用电池的使用时间,就像可以在理想条件下在睡眠模式下对ESP32 进行编程以延长设备的备用电池使用时间一样。


在本篇文章中,我们将测量广受欢迎的Wi-Fi和蓝牙微控制器单元ESP32在正常工作模式和深度睡眠模式下的电流消耗。此外,我们将测试差异并检查如何 ESP32置于深度睡眠模式。


设计需求

为此,我们将使用Espressif公司的基于ESP32的Devkit V4.0,它包含一个USB转UART桥接器以及其他ESP32引出线以便于连接。编程使用Arduino IDE 完成。

ESP32-based-Devkit-V4.0.jpg


本项目的要求如下——

1.  只需按一下按钮,它就会进入深度睡眠模式。

2.  按下另一个按钮,它将从深度睡眠模式中唤醒。

3.  为了确定ESP32的状态,LED会以1秒的开启时间闪烁。在睡眠模式期间,它将熄灭。


所需的组件

●    ESP32 Devkit开发板

●    LED指示灯

●    轻触开关

●    电阻

●    面包板

●    连接导线


ESP32睡眠模式电路图

使用按钮使ESP32进入睡眠状态的示意原理图如下所示。

ESP32-Sleep-Mode-Circuit-Diagram.png


原理图非常简单。它有两个按钮。睡眠按钮将使ESP32进入深度睡眠模式,另一个按钮用于将ESP32从睡眠模式唤醒。两个按钮分别连接在PIN 16和PIN 33。两个按钮在按下时都配置为低电平有效,因此需要连接上拉电阻。为了检查ESP 32是处于睡眠模式还是正常工作状态模式,LED连接到IO引脚 4。


ESP32睡眠模式概览

ESP32有多种不同的功耗模式,即工作模式、调制解调器睡眠模式、浅睡眠模式、深度睡眠模式和休眠模式。


在正常工作状态下,ESP32 以工作(Active)模式运行。在ESP32工作模式下,CPU、WiFi/BT硬件、RTC内存和RTC外设、ULP协处理器都被激活并根据工作负载工作。然而,在不同的电源模式下,将关闭一个或多个外设。要检查不同的电源模式操作,请按照下表-

硬件
活动模式
调制解调器睡眠模式
浅睡眠模式
深度睡眠模式
休眠模式
CPU
打开
打开
暂停
关闭
关闭
WiFi/BT
打开
关闭
关闭
关闭
关闭
RTC和RTC外设
打开
打开
打开
打开
关闭
ULP-Co处理器
打开
打开
打开
关闭
关闭

正如我们在上表中看到的,在ESP32深度睡眠模式下,通常称为ULP传感器监控模式 - CPU、WiFi/BT、RTC 内存和外设、ULP 协处理器都被关闭。仅开启RTC内存和RTC 外设。


在唤醒情况时,ESP32需要收到唤醒源的通知,该唤醒源会将ESP32从深度睡眠模式唤醒。但是,由于RTC外设已开启,ESP32可以通过启用RTC的GPIO唤醒。它可以通过外部唤醒中断引脚唤醒或使用定时器唤醒ESP32。在本文中,我们在引脚33上使用ext0唤醒。

跳转到指定楼层
风筝
发表于: 2021-9-6 15:15:16 | 显示全部楼层

编程ESP32进入深度睡眠模式

完整的程序可以在联系作者。程序使用Arduino IDE编写的,因此可以轻松适应您的要求。代码的说明如下。


首先在代码的开头,

  1. //Create a PushButton variable
  2. PushBnt pushBtn = {GPIO_NUM_16, 0, false};
  3. // define Led Pin
  4. uint8_t led_pin = GPIO_NUM_4;
  5. // define wake up pin
  6. uint8_t wakeUp_pin = GPIO_NUM_33;
复制代码

以上三行代码定义了唤醒引脚、LED引脚和睡眠模式的引脚号。

  1. void setup() {
  2.   // put your setup code here, to run once:
  3.   // set the serial port at 115200
  4.   Serial.begin(115200);
  5.   delay(1000);
  6.   // set the pushButton pin as input with internal PullUp
  7.   pinMode(pushBtn.pin, INPUT_PULLUP);
  8.   // set the Interrupt handler with the pushButton pin in Falling mode
  9.   attachInterrupt(pushBtn.pin, isr_handle, FALLING);
  10.   // set the Led pin as ouput
  11.   pinMode(led_pin, OUTPUT);
  12.   //create a task that will be executed in the blinkLed() function, with priority 1 and executed on core 0
  13.   xTaskCreate(
  14.               blinkLed,   /* Task function. */
  15.               "blinkLed",     /* name of task. */
  16.               1024*2,       /* Stack size of task */
  17.               NULL,        /* parameter of the task */
  18.               5,           /* priority of the task */
  19.               &taskBlinkled);      /* Task handle to keep track of created task */
  20.   delay(500);
  21.   //Configure Pin 33 as ext0 wake up source with LOW logic level
  22.   esp_sleep_enable_ext0_wakeup((gpio_num_t)wakeUp_pin, 0);
  23. }
复制代码

在setup()函数中,将中断引脚设置为下降沿有效模式

  1. attachInterrupt(pushBtn.pin, isr_handle, FALLING);
复制代码

因此,无论何时按下按键,电平都会从逻辑 1 (3.3V) 变为逻辑 0 (0V)。按钮引脚电压会下降,ESP32会识别出按钮被按下。代码还创建了一个闪烁LED的任务。

  1. xTaskCreate(
  2.               blinkLed,   /* Task function. */
  3.               "blinkLed",     /* name of task. */
  4.               1024*2,       /* Stack size of task */
  5.               NULL,        /* parameter of the task */
  6.               5,           /* priority of the task */
  7.               &taskBlinkled);      /* Task handle to keep track of created task */
  8.   delay(500);
复制代码

引脚33配置为ext0的外部唤醒源。

  1. esp_sleep_enable_ext0_wakeup((gpio_num_t)wakeUp_pin, 0);
复制代码

接下来,是while循环——

  1. void loop() {
  2.   // put your main code here, to run repeatedly:
  3.    if (pushBtn.pressed) {
  4.       Serial.printf("PushButton(%d) Pressed \n", pushBtn.pin);
  5.       Serial.printf("Suspend the 'blinkLed' Task \n");
  6.       // Suspend the blinkLed Task
  7.       vTaskSuspend( taskBlinkled );
  8.       digitalWrite(led_pin, LOW);   
  9.       Serial.printf("Going to sleep..... \n", pushBtn.pin);
  10.       pushBtn.pressed = false;
  11.       //Go to sleep now
  12.       esp_deep_sleep_start();
  13.   }
  14.   esp_sleep_wakeup_cause_t wakeupReason;
  15.   wakeupReason = esp_sleep_get_wakeup_cause();
  16.   switch(wakeupReason)
  17.   {
  18.     case ESP_SLEEP_WAKEUP_EXT0  : Serial.println("using external signal ext0 for WakeUp From sleep"); break;
  19.     case ESP_SLEEP_WAKEUP_EXT1  : Serial.println("using external signal ext1 for WakeUp From sleep"); break;
  20.     case ESP_SLEEP_WAKEUP_TIMER  : Serial.println("using Timer signal for WakeUp From sleep"); break;
  21.     case ESP_SLEEP_WAKEUP_TOUCHPAD  : Serial.println("using TouchPad signal for WakeUp From sleep"); break;
  22.     case ESP_SLEEP_WAKEUP_ULP  : Serial.println("using ULP signal for WakeUp From sleep"); break;
  23.     default : break;
  24.     Serial.printf("Resume the 'blinkLed' Task \n");
  25.     // restart the blinkLed Task
  26.     vTaskResume( taskBlinkled );
  27.   }
  28. }
复制代码

在loop函数中,不断检查是否按下了睡眠按钮。如果按下按钮,它将停止或LED闪烁任务并运行esp深度睡眠启动函数。

  1. esp_deep_sleep_start();
复制代码

这时如果按下ext0外部中断按钮,它会立即从深度睡眠模式中唤醒,并恢复LED闪烁任务。


最后,可以在下面的代码片段中看到LED闪烁函数,它将使LED 闪烁1000 毫秒。

  1. void blinkLed(void* param){
  2.   while(1){
  3.     static uint32_t pin_val = 0;
  4.     // toggle the pin value
  5.     pin_val ^= 1;
  6.     digitalWrite(led_pin, pin_val);
  7.     Serial.printf("Led ----------------- %s\n" , pin_val? "On" : "Off");
  8.     /* Simply toggle the LED every 1000ms or 1sec */
  9.      vTaskDelay( 1000 / portTICK_PERIOD_MS );
  10.   }
  11.   taskBlinkled = NULL;
  12.   vTaskDelete( NULL );
  13. }
复制代码

测试深度睡眠模式下的ESP32

该电路在面包板上搭建,并使用万用表测量电流。电路在正常工作模式下消耗的电流大约为58 mA,在深度睡眠模式下,电流大约为4.10 mA。下图显示了ESP32正常模式的功耗:

ESP32-Deep-Sleep-Mode.jpg


在深度睡眠模式下,功耗降至3.95mA左右,下图显示了ESP32深度睡眠模式下的功耗:

ESP32-Deep-Sleep-Mode-Testing.jpg


但是,在深度睡眠模式下,ESP32 的电流消耗接近 150 uA。 但是这个ESP32 Devkit开发板测量的电流消耗大约是4.10 mA。 这是由于CP2102和线性稳压器的原因。 这两个连接到5V电源线。 电源线上还有一个电源LED,它消耗大约2mA的电流。


因此,很容易识别出ESP32在深度睡眠模式条件下消耗的电流非常低,这对于电池供电的操设备非常有用。 如果您有任何问题,请在本帖下面进行回复。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 56 | 回复: 109



手机版|

GMT+8, 2024-12-22 02:05 , Processed in 0.169998 second(s), 10 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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