مدیریت توان مصرفی در اینترنت اشیا از اهمیت بسیار بالایی برخوردار است . اینکه گره های ارتباطی پرتابلی داشته باشید که روز ها و ماه ها تنها با یک باتری بتوانند دیتا را مخابره کننده تنها از طریق مدیریت توان مصرفی گره ها عملی می شود . در این آموزش به مد های کاری ماژول های ESP32 می پردازیم و اینکه چطوری ماژول را به هر کدام از حالت های مصرفی ببریم و یا از حالتی خاص خارج کنیم . به طور کلی ماژول ESP32 دارای 5 مد کاری (مصرف انرژی ) می باشند که در جدول زیر نشان داده شده است .

در اینجا به تشریح هر قسمت و نحوه فعال سازی آن می پردازیم .

اولین مد در مصرف انرژی ، حالت اکتیو هست . این مد خود شامل چندین حالت مختلف می باشد اما به طور کلی در این حالت ماژول جریانی بین 50mA تا 250mA مصرف میکند . در حالت اکتیو علاوه بر کلیه قسمت های ماژول ، مودم های وایفای و بلوتوث ماژول فعال می باشند لذا جریان مصرفی ماژول بسیار بالا می باشد . در گره های پرتابل تنها در حالت های خاص و یا در زمان های خاصی قسمت های وایفای ماژول فعال شده و پس از مخابره دیتا خاموش می شوند .

در تصویر زیر قسمت های فعال در حالت اکتیو نشان داده شده است :

حالت دوم Modem sleep می باشد . در این حالت قسمت های ارتباط بلوتوث و وایفای خاموش هستند لذا جریان مصرفی ماژول در این حالت به مراتب پایین تر از حالت اکتیو می باشد . به طور معمول هر گونه پردازش و محاسبات مورد نیاز در این حالت صورت میگیرد و پس از آن مودم ها فعال شده و دیتا مخابره می شود .

در تصویر پایین ناحیه های فعال در این حالت نشان داده شده است :

 

حالت بعدی Light sleep یا خواب سبک می باشد . این حالت مشابه حالت قبل است با این تفاوت که در این حالت CPU در حالت خواب قرارد داشته و تنها پالس ساعت آن فعال است . با ورودی CPU بهاین حالت کلیه فعالیت های CPU متوقف شده و پس از برگشت به حالت فعال ، CPU کار خود را از همان نقطه ای که بود اجرا می کند .

با استفاده از تابع زیر می توان وارد این حالت شد :

esp_light_sleep_start()

در تصویر زیر می توانید قسمت های مختلف را در حالت Light sleep ببینید :

حالت بعدی Deep slepp یا همان خواب عمیق است . در این حالت تنها واحد RTC و ULP فعال اند . می توان ULP را یک CPU دیگر در نظر گرفت که به قسمت های مختلف RAM و حتی CPU دسترسی دارد . ULP ساختاری مشابه CPU دارد حتی آپ کد های اختصاصی خودشو داره . در حالت Deep Sleepمی توان از طریق RTC یا ULP  قسمت های دیگر را فعال کرد .ULP یک پردازنده فوق کم مصرف است که می توانید از آن برای اجرای کار های دیگری به موازات CPU استفاده کنید . در اوابل معرفی هسته ESP32 برای آردوینو ، آردوینو IDE امکان کامپایل کد های ULP را نداشت اما جدیدا کتابخانه هایی برای راه اندازی و به کار گیری ULP ارائه شده است که می توانید از این واحد در آردوینو IDE هم استفاده کنید .

در کد زیر LED متصل به GPIO 4  به حالت چشمک زن در می آید . این کار توسط واحد ULP و جدا از CPU صورت میگیرد :

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "driver/gpio.h"
#include "esp32/ulp.h"
#include "ulp_main.h"
#include "driver/rtc_io.h"

extern const uint8_t bin_start[] asm("_binary_ulp_main_bin_start");
extern const uint8_t bin_end[]   asm("_binary_ulp_main_bin_end");

void app_main() {
  /* Init GPIO 4 (blue), which will be driven by the main core */
  gpio_config_t io_conf;
  io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
  io_conf.mode = GPIO_MODE_OUTPUT;
  io_conf.pin_bit_mask = GPIO_SEL_4;
  io_conf.pull_down_en = 0;
  io_conf.pull_up_en = 0;
  gpio_config(&io_conf);

  /* Init GPIO2 (RTC_GPIO 12, green) which will be driven by ULP */
  rtc_gpio_init(2);
  rtc_gpio_set_direction(2, RTC_GPIO_MODE_OUTPUT_ONLY);
  rtc_gpio_set_level(2,0);

  vTaskDelay(1000/portTICK_PERIOD_MS);

  /* Start ULP program */
  ESP_ERROR_CHECK( ulp_load_binary(0, bin_start, (bin_end - bin_start) / sizeof(uint32_t)));
  ESP_ERROR_CHECK( ulp_run(&ulp_entry - RTC_SLOW_MEM) );

  bool s = false;
  for (;;) {
    s = !s;
    gpio_set_level(4, (s ? 1 : 0));
    vTaskDelay(1000/portTICK_PERIOD_MS);
  }
}

همانطور که از کد های فوق مشخص است راه اندازی و به کار گیری ULP کار ساده ای نیست و برای افراد مبتدی توصیه نمی گررد . به کار گیری ULP نیاز به اشراف کامل بر معماری ESP32 و همچنین کتابخانه های ULP دارد . ULP می تواند به RAM ، واحد I2C ،UART و… دسترسی داشته باشد .

تصویر زیر مربوط به حالت Light Sleep می باشد :

 

حالت کاری بعدی در ESP32 مد Hibernation mode یا به اصتلاح خواب زمستانی می باشد . در این حالت حتی ULP هم خاموش اند . تنها واحدی که در این مد کاری فعال است واحد RTC می باشد .

تصویر زیر مد کاری Hibernation mode را نشان می دهد :

در این حالت تنها اسیلاتور فراکانس پایین RTC و چنتاز از GPIO ها مربوط به I2C فعال هستند . در این حالت کریستال 8MHz داخلی هم غیر فعال شده و کلیه داده های RAM از بین می رود . با خروج از این حالت CPU کار خود را از اول شروع میکند .

 

در این آموزش تنها به مد های کاری ESP32 پرداختیم . در مقالات بعدی نحوه ورود به هر حالت توضیح داده خواهد شد .

 

منبع : https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/#:~:text=ESP32%20Sleep%20mode%20is%20a,it%20to%20retain%20its%20data.

 

 

Tags:
About Author: USER_4