2019년 4월 19일 금요일

ESP32의 슬립모드와 전력소모 (ESP32 Sleep modes and their power consumption)

Original document : Insight into ESP32 Sleep Modes & Their Power Consumption


Inside ESP32 chip

ESP32의 전력관리에 대해 이해하기 위해 먼저 ESP32 칩 내부의 구조를 알 필요가 있다. 아래 그림은 ESP32 칩 내부의 기능별 블록 다이어그램이다.



ESP32칩에는 듀얼코어 32-bit 마이크로프로세서와 448KB의 ROM, 520KB의 SRAM과 4MB의 플래쉬가 들어 있다.

또한 WiFI, Bluetooth, Cryptographic accelerator, RTC 및 다양한 페리페럴을 가지고 있다.

ESP32 Power Modes


ESP32의 전력 관리 모드로는 다음의 5가지가 있다.
  • Active mode
  • Modem Sleep mode
  • Light Sleep mode
  • Deep Sleep mode
  • Hibernation mode
각 모드별로 서로 다른 특징과 소비전력 절약 기능을 가지고 있다. 각 모드에 대해 하나씩 확인해 보자.

Active mode

일반적으로 사용하는 모드이다. 이 모드에서는 칩의 모든 기능이 활성화 된다.

액티브 모드에서는 칩의 모든 기능(WiFi, 프로세서 코어, 블루투스 등)을 켜 놓기 때문에 동작시 240mA 이상의 전류를 소모할 수 있다. 또한 WiFi와 블루투스를 동시에 사용하는 경우 순간적으로 최대 790mA까지 전류를 소모하는 경우도 있음을 주의해야 한다.



ESP32 데이터쉬트를 보면 액티브 모드에서 RF가 동작시 전력소모는 다음과 같다.



확실히 가장 많은 전류를 소비하는 비효율적인 모드이다. 그러므로 전력소모를 줄이고 싶으면 기능을 사용하지 않는 경우 적절한 다른 전력 모드로 스위칭 해 필요없는 기능을 비활성화시켜 줘야만 한다.

Modem Sleep mode

이 모드에서는 WiFi, 블루투스, RF를 제외한 모든 부분이 활성화 된다. 이 모드에서 slow speed라면 약 3mA, high speed라면 약 20mA 정도의 전류를 소비한다.



WiFI/블루투스 연결을 유지하려면 CPU, WiFi, 블루투스, RF가 Association Sleep pattern이라는 미리 지정된 간격으로 깨어나야 한다.

이 sleep pattern동안 전원 모드는 active mode와 modem sleep mode를 왔다갔다 해야 한다.

ESP32가 스테이션 모드에서 공유기에 연결되었을 때만 modem sleep 모드에 들어갈 수 있다. 이 경우 DTIM beacon mechanism을 통해 공유기 연결을 유지한다.

전력 소비를 줄이기 위해 ESP32는 DTIM beacon interval 사이에는 WiFi 모듈을 비활성화 시키고 다음번 Beacon interval이 돌아오기 전에 자동으로 깨어나게 한다.

Sleep time은 공유기의 DTIM Beacon interval time에 의해 결정되는되 일반적으로 100ms ~ 1000ms 정도 된다.

Light Sleep mode

 Light sleep mode는 modem sleep mode와 비슷하고 association sleep pattern도 따른다. 차이점은 디지털 페리페럴, 대부분의 RAM, CPU가 clock-gated가 된다.


Light Sleep mode동안 CPU는 클럭펄스를 꺼 버림으로서 pause되지만 RTC와 ULP 코프로세서는 활성화 되어 있다. 그러므로 modem sleep mode보다도 더 전력소모를 줄여 약 0.8mA 정도의 전류를 소모한다.



Light Sleep mode로 들어가기 전에 ESP32는 내부상태를 저장하고 sleep에서 깨어나면 동작을 재개하는데 이를 Full RAM Retention이라 한다.

Wake-up 소스를 설정한 후 esp_light_sleep_start() 함수를 사용해 light sleep mode로 들어갈 수 있다.

Deep Sleep mode

Deep Sleep mode에서는 CPU, 대부분의 RAM과 모든 디지털 페리페럴이 꺼진다. 전원이 켜져 있는 부분은 RTC 컨트롤러, RTC 페리페럴(ULP 코프로세서를 포함), RTC 메모리 (slow & fast) 뿐이다.

이 경우 ULP 코프로세서가 켜져 있는 경우 약 0.15mA, 그렇지 않은 경우 10uA 정도의 전류만을 소비한다.



Deep Sleep mode동안 메인 CPU는 전원이 꺼져 있지만 ULP 코프로세서가 센서 값을 읽어 측정된 값에 따라 메인 시스템을 깨울 수 있다. 이런 sleep pattern은 ULP sensor-monitored pattern이라고 한다.

CPU뿐 아니고 칩의 메인 메모리도 전원이 꺼지기 때문에 메모리에 저장된 모든 내용은 사라지고 억세스 할 수 없다.

하지만 RTC 메모리는 전원이 유지되기 때문에 deep sleep mode에서도 내용이 유지되고 메인 프로세서가 깨어난 다음에 내용을 읽을 수 있다. 그렇기 때문에 ESP32가 WiFi와 블루투스를 끄기 전에 연결 데이터를 RTC 메모리에 저장하는 것이다.

그러므로 리부팅 후에 데이터를 사용하려면 전역변수를 선언할 때 RTC_DATA_ATTR attribute를 사용해 RTC 메모리에 저장해야 한다. 예를 들어 RTC_DATA_ATTR int bootCount = 0; 같이 해 주면 된다.

Deep Sleep mode에서는 RTC 모듈을 제외한 칩 전체의 전원이 꺼지기 때문에 RTC recovery memory에 들어 있지 않은 내용은 모두 사라지고 RESET으로 칩을 재시작한다. 즉 프로그램 실행은 다시 한번 맨 처음부터 다시 시작하게 된다는 의미이다.

* TIP
ESP32는 deep sleep에서 깨어날 때 deep sleep wake stub을 실행하는걸 지원한다. 이 함수는 칩이 깨어나자 마자 다른 어떤 코드 (정상적인 초기화 또는 부트로더 코드)보다 먼저 곧바로 실행된다. Wake stub 이 실행된 후에 칩은 sleep mode로 돌아가거나 또는 정상적으로 시작할 수 있다.

다른 sleep mode와 달리 시스템이 deep sleep mode로는 자동으로 들어갈 수 없다. Wake-up 소스를 설정한 후 esp_deep_sleep_start() 함수를 호출하면 곧바로 deep sleep mode로 들어가게 된다.

기본적으로 ESP32는 wake-up 소스에 필요 없는 모든 페리페럴의 전원을 자동으로 꺼 버리지만 옵션으로 모든 페리페럴들애 대해 전원을 끌지 여부를 결정할 수도 있다.

Hibernation mode

Deep Sleep mode와 다르게 Hibernation mode는 내부 8MHz 오실레이터와 ULP 코프로세서까지도 전원을 꺼 버린다. RTC recovery 메모리까지도 전원을 꺼 버리기 때문에 hibernation mode에서는 어떤 데이터도 보관할 수 없다.

Slow clock상의 RTC timer와 일부 RTC GPIO만 활성화 되어 있고 나머지는 모두 전원이 꺼진다. 활성화 된 부분이 hibernation mode에서 깨어나는걸 담당한다.

이 모드는 전력소비를 극단적으로 줄여 약 2.5uA의 전류를 소비한다.














댓글 없음:

댓글 쓰기