본문 바로가기
  • Masacorgi 's Dev Bloggg
TIL/Embedded

[임베디드] 전원 관리와 Sleep 모드

by masacorgi 2025. 6. 15.

 

이번에는 실전 임베디드 시스템에서 배터리 수명을 늘리는 핵심 기술, 즉 Sleep 모드와 저전력 설계를 알아본다.
소형 IoT 기기를 오래 사용하려면 꼭 필요한 실무 기술이라고 한다.

 

 

1. 왜 전원 관리가 중요한가?

1.1 배터리 기반 IoT 기기의 현실

  • 항상 켜두면 전류 소모 ↑ → 배터리 수명 ↓
  • 예: 100mA로 24시간 동작 = 2.4Ah 필요 → 비효율적임

1.2 해결책 → Sleep 모드

  • 센서를 항상 감시하지 않고, 주기적으로 깨워서 동작 후 다시 Sleep으로 전환
  • 평균 소비 전류를 수 μA~mA 수준으로 낮춤

 

 

2. Sleep 모드의 종류 (Arduino/AVR 기준)

 

모드 소비전력 깨어나는 방식
Idle 낮음 타이머, 인터럽트
ADC Noise 더 낮음 ADC 완료 인터럽트 등
Power-down 매우 낮음 외부 인터럽트 (핀 등)
Standby RTC 기반 기기  

 

 

3. 실습 예제: Power-down 모드 + 외부 인터럽트로 깨어나기

3.1 준비 사항

  • Arduino + 버튼 스위치
  • 핀 D2에 버튼 입력
  • Low level interrupt로 깨어나기

3.2 예제 코드

#include <avr/sleep.h>

const int wakePin = 2; // 외부 인터럽트 핀 (INT0)

void setup() {
  pinMode(wakePin, INPUT_PULLUP);  // 풀업 저항 사용
  Serial.begin(9600);

  delay(1000);  // 부팅 안정 시간
  Serial.println("Sleep 준비 완료. 버튼을 누르면 깨어납니다.");

  attachInterrupt(digitalPinToInterrupt(wakePin), wakeUp, LOW); // LOW 신호로 인터럽트 발생
}

void loop() {
  Serial.println("Sleep 모드 진입...");
  delay(100);  // 메시지 출력 시간 확보

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();

  sleep_cpu();  // 실제 Sleep 진입 (여기서 잠듦)

  // 인터럽트 발생 후 이 아래로 복귀
  sleep_disable();
  Serial.println("깨어남! 측정 작업 수행 중...");
  delay(1000);  // 여기서 센서 읽기 등을 수행
}

void wakeUp() {
  // 깨어날 때 실행되는 ISR (Interrupt Service Routine)
}

 

 

4. 작동 흐름 요약

setup() → loop() → sleep_cpu() → (버튼 눌림) → wakeUp() 호출 → 센서 측정

 

5. 추가

슬립 모드는 “파워다운”만 있는 게 아니다!

슬립(Sleep) ≠ 파워오프(Power Off)

 

슬립은 MCU의 일부 기능만 꺼서 대기 상태로 만드는 것으로, 완전히 전원이 끊기는 “파워다운”과 다르다

 

* 슬립모드의 종류 (대표적인 저전력 모드들)

MCU마다 이름은 다르지만, 보통 다음과 같이 구분한다

모드 종류 특징
Idle CPU만 정지, 타이머·인터럽트 동작 가능
Sleep 일부 주변회로도 OFF, 특정 인터럽트로만 깨어남
Power-down 거의 모든 회로 OFF, 매우 적은 소비전력
Standby/Stop RAM 유지, 일부 타이머만 동작, RTC로 깨우기 가능

→ 대부분 Sleep ↔ Wakeup 구조로 순환 사용해.

 

* 슬립모드에서 깨어날 수 있는 방법들

꼭 버튼(외부 인터럽트) 말고도 다양한 방법으로 깨어날 수 있다.

 

Wake up - Source 설명
외부 인터럽트 (EXTI) 버튼, 센서 신호 등
RTC / 타이머 인터럽트 정해진 시간마다 기상 (예: 1초마다)
UART 인터럽트 시리얼 통신 수신 시 깨움
ADC 인터럽트 아날로그 값이 특정 기준을 넘으면
I2C/SPI 인터럽트 마스터에서 호출 시

 

 

// 타이머로 깨우기 예제

// 슬립모드 설정 (Power-down)
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();

// 타이머 인터럽트로 1초마다 깨어나도록 설정
// ex) Timer2, RTC 등 사용

sleep_cpu(); // 실제로 슬립 진입

// 여기서 인터럽트가 발생하면 깨어남

 

 

6. 전력 설계 팁

  • 센서도 Sleep을 지원하는지 여부 확인 (DHTxx, ESP32 등)
  • LED, LCD 같은 부하 회로 전원 차단 회로 추가
  • 모든 unused 핀을 Pull-down or Output으로 설정 (노이즈 방지)

 

 

6. 참고자료

 

'TIL > Embedded' 카테고리의 다른 글

[임베디드] 타이머와 인터럽트  (0) 2025.06.15
[임베디드] I2C, SPI 개념 정리  (0) 2025.06.15
[임베디드] 디지털 입출력 예시  (0) 2025.06.10
[임베디드] ADC란 무엇인가  (0) 2025.06.09
[임베디드] Mosquitto란?  (0) 2025.06.07