본문 바로가기

ESPRESSIF/ESP32-C6

[ESP32-C6 SSM] ESP32C6 Deep Sleep Mode 테스트

 

 




ESP32C6 는 저전력 을 강조해서 선전하고 있는데 소모 전류 테스트를 해보자

 

우선 스펙을 확인하니 여전히 WiFi, BLE 모두 소모 전류가 상당히 크다. 아무래도 밧데리 구동 어플리케이션은 무리가 있어 보인다.

 








사용하지 않을때 슬립 모드로 들어가는 옵션을 사용하면 그나마 사용할 수 있을것 같다.

Deep-Sleep Mode에서 7uA로 ESP32(https://nexp.tistory.com/3757)보다 좋아진것 같다. 하지만 ESP32C3(https://nexp.tistory.com/3755 )보다는 높은것 같다.



ESP32C6 에서 Deep Sleep Mode에서 깨어나는 방법은 타이머 인터럽트나 LP_GPIO를 설정해서 깨어날 수 있다. 기존 ESP32에서는 RTC GPIO를 사용했는데 LP_GPIO로 변경된것 같다.

 

ESP32C6 LP_GPIO

 


우선 타이머 인터럽트를 이용하여 일정시간마다 깨어나는 코드를 테스트 해보자

 

#include <Arduino.h>

//us 단위로 타이머 설정
#define uS_TO_S_FACTOR 1000000ULL

//5초마다 깨어나도록 설정
#define TIME_TO_SLEEP  5
 
RTC_DATA_ATTR int bootCount = 0;

#define LED1Pin       GPIO_NUM_14


//슬립모드에서 깨어날때 소스 출력
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;
 
  wakeup_reason = esp_sleep_get_wakeup_cause();
 
  switch(wakeup_reason)
  {
    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
  }
}
 
void setup(){
  Serial.begin(115200);
  pinMode(LED1Pin, OUTPUT);  
  digitalWrite(LED1Pin, 0);
  delay(1000);
 
  //슬립모드에서 깨어날 때마다 카운트 값을 증가 하고 표시
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));
 
  //깨어날 때 소스 출력
  print_wakeup_reason();
 
  //타이머 인터럽트로 설정된 시간후 깨어 나도록 설정
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
  " Seconds");
 
  Serial.println("Going to sleep now");
  //슬립모드에서 깨어 났다면 주변 페리들을 재 설정할 필요가 있다.
  Serial.flush();
  
  digitalWrite(LED1Pin, 1);
  //슬립모드 진입
  esp_deep_sleep_start();
  Serial.println("This will never be printed");
}
 
void loop(){
  //This is not going to be called
}

 

테스트 결과 9uA로 측정된다.


 

ESP32C6에서 Deep Sleep Mode 에서 깨어나는 또다른 방법으로 LP_GPIO를 사용할 수 있다.

#include <Arduino.h>

#define LED1_PIN       14 
#define INTERRUPT_PIN 6
RTC_DATA_ATTR int bootCount = 0;


void print_wakeup_reason() {
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch (wakeup_reason) {
    case ESP_SLEEP_WAKEUP_EXT0:
      Serial.println("Wakeup caused by external signal using RTC_IO");
      break;
    case ESP_SLEEP_WAKEUP_EXT1:
      Serial.println("Wakeup caused by external signal using RTC_CNTL");
      break;
    case ESP_SLEEP_WAKEUP_TIMER:
      Serial.println("Wakeup caused by timer");
      break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD:
      Serial.println("Wakeup caused by touchpad");
      break;
    case ESP_SLEEP_WAKEUP_ULP:
      Serial.println("Wakeup caused by ULP program");
      break;
    default:
      Serial.printf("Wakeup was not caused by deep sleep: %d\n", wakeup_reason);
      break;
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);

  pinMode(LED1_PIN, OUTPUT);
  digitalWrite(LED1_PIN, LOW);

  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));

  //print_wakeup_reason();

  Serial.println("Starting");
  delay(2000);
  
  for(int i=3; i!=0; i--){
      Serial.println(i);
      delay(1000);
  }

  Serial.println("Going to sleep now");
  //pinMode(INTERRUPT_PIN, INPUT_PULLUP);
  //esp_deep_sleep_enable_gpio_wakeup(1 << INTERRUPT_PIN, ESP_GPIO_WAKEUP_GPIO_LOW);

  pinMode(INTERRUPT_PIN, INPUT);
  esp_deep_sleep_enable_gpio_wakeup(1 << INTERRUPT_PIN, ESP_GPIO_WAKEUP_GPIO_HIGH);
  
  esp_deep_sleep_start();
 
  Serial.println("This will never be printed");
}

void loop() { }

 

 

슬립모드에서는 9uA 로 측정되고 스위치를 누를때 마다 깨어나고 LED가 동작하게 된다. 일반 GPIO는 전류가 Off 되지만 LP_GPIO는 유지가 된다. 풀업일 경우 소모 전류가 클것으로 예상했는데... 풀업이나 풀다운이나 동일한 전류를 소모 하는것을 확인 할 수 있다.

반응형