마이크로컨트롤러 초저전력 (ULP) 모드: 슬립 모드로 에너지 절약하기

초저전력 (Ultra Low Power, ULP)이란 무엇인가?

초저전력 (ULP)은 에너지 절약을 위한 하드웨어 및 소프트웨어 기술 전반을 아우르는 포괄적인 용어입니다. 주된 목표는 실시간 시스템의 제약 조건을 만족하면서도 마이크로컨트롤러의 에너지 소비를 최대한 줄이는 것입니다.

이 스펙트럼의 가장 극단적인 예로는 혈당 측정기와 같은 배터리 구동 장치를 들 수 있습니다. 이런 놀라운 기술이 코인 셀 하나로 동작합니다. 이 장치는 실시간 클록 (RTC)을 유지하는 데에만 미세한 전력을 사용하며 슬립 상태를 유지합니다. 주 마이크로컨트롤러는 사용자의 입력에 반응하여 깨어나 측정을 수행하고, 디스플레이를 갱신하거나, PC와 통신하여 데이터를 다운로드합니다.

ULP는 STM32L562CEU6와 같은 고성능의 구성 자유도가 높은 프로세서가 등장하면서 점점 더 중요해지고 있습니다.

정의상, ULP는 에너지 소비와 배터리 수명이 마이크로컨트롤러의 성능만큼이나 중요하다는 인식입니다.


그림 1: STM32F767ZIT6 Cortex-M7 프로세서를 탑재한 STM32F767 Nucleo-144 기판의 이미지

기술 팁: 슬립 전류와 프로세서의 복잡도 사이에는 반비례 관계가 있는 것으로 보입니다. 소개된 Cortex-M7은 매우 복잡한 소자입니다. 일반적으로, 성능이 1/100인 소형 8비트 마이크로컨트롤러는 슬립 전류가 1/10 수준입니다. 그러나 유능한 엔지니어들이 끊임없이 기술을 발전시키고 있어서 예외도 있습니다. 오늘날, 일부 중급 32비트 마이크로컨트롤러는 8비트 마이크로컨트롤러와 동등한 수준에 도달하였습니다. 예를 들어, STM32L562CEU6 시리즈는 모든 기능을 끈 상태에서 17 nA의 소비 전류만을 필요로 합니다.

어떤 하드웨어가 ULP에 사용되나요?

논리 게이트의 에너지 소비는 보통 해당 게이트가 동작하는 속도에 좌우됩니다. 마이크로컨트롤러는 논리 게이트의 집합체이므로, 에너지 소비는 클록 속도와 직접적으로 관련됩니다. 예를 들어, 최신 32비트 ARM 프로세서는 코어가 216 MHz로 모든 기능을 처리하면 상당히 많은 전력을 소비할 것입니다. 동일한 코어를 32.768 kHz RTC 주파수로 전환하면 전력 소비가 줄어듭니다. 더 낮은 전력 소비를 위해 메인 CPU를 꺼버리고 일부 기능을 주변 장치로 옮길 수도 있습니다. 전용 32.768 kHz RTC 주변 장치가 좋은 예입니다. 그 밖의 예로는 워치독 타이머, 변화 감지 웨이크업 인터럽트, 직접 메모리 액세스 (DMA) 등이 있습니다.

기술 팁: 전류 소비는 종종 uA/MHz 단위로 표현됩니다. 이는 전류 소비와 클록 속도가 서로 밀접하게 관련되어 있음을 보여줍니다. 프로세서를 오버클록 해 본 적이 있다면 잘 알겠지만, 클록 속도가 높을수록 발열이 증가하고, 이는 결국 프로세서 손상으로 이어질 수 있습니다.

그림 1에 나와 있는 ST마이크로일렉트로닉스의 STM32F767ZIT6이 실제 예시입니다. 높은 온도에서 모든 주변 장치를 활성화 한 채 216 MHz로 동작하면 전류는 최대 258 mA에 이를 수 있습니다. 그러나 RTC를 제외한 모든 기능이 비활성화된 딥 슬립 모드에서는 전류가 770 nA까지 낮아질 수 있습니다 (주변 온도 25 °C, 1.7 VDC 전원 기준).

기술 팁: 슬립 모드는 단순한 온/오프 스위치가 아닙니다. 실제 동작 조건은 칩에 포함된 주변 장치의 수만큼 다양해집니다. 예를 들어, STM32F767ZIT6의 규격서는 다양한 모드를 설명하는 데 12 쪽이 넘는 분량을 할애하고 있습니다.

어떤 소프트웨어가 ULP에 사용되나요?

클록 속도를 변경하고 사용하지 않는 주변 장치를 비활성화하는 것은 ULP의 중요한 부분입니다. 그러나 이러한 작업이 자동으로 수행되지는 않습니다. 진정한 ULP를 구현하려면 프로그래머가 하드웨어를 직접 제어해야 합니다. 이를 위해서는 성능과 에너지 소비 간의 적절한 균형을 찾기 위해 응용 프로그램에 상당한 주의를 기울여야 합니다.

인터럽트 서비스 루틴 (ISR)을 통한 에너지 절약

버튼 입력이나 하드웨어 타이머 오버플로우와 같은 실제 이벤트 대응에 인터럽트 서비스 루틴 (ISR)을 사용하면 에너지 소비를 최소화할 수 있습니다. 이벤트에 의해 각 ISR이 트리거되어 짧은 코드가 실행된 후, 마이크로컨트롤러는 다시 슬립 모드로 돌아갑니다. 극단적인 예를 들자면, 코드는 다음과 같을 수 있습니다:


// My ISRs

main(){
    // Setup
   while(1){
      goToSleep();
   }
}

실제로는 코드 예시에서 제시된 것보다 프로그램은 훨씬 더 복잡합니다. 그러나 우리의 목표는 여전히 슬립 시간을 최대화하는 것입니다.

클록 속도 감소를 통한 에너지 절약

대부분의 마이크로컨트롤러는 동작 중에도 클록을 변경할 수 있는 강력한 클록 선택 회로를 갖추고 있습니다. 작업량에 맞춰 클록 속도를 조절하면 에너지를 절약할 수 있습니다. 어떤 경우에는 고속 클록이 필요하지만, 다른 경우에는 워치독 타이머나 RTC만으로도 충분합니다.

코드 단순화를 통한 에너지 절약

개인적으로는 코드 단순화를 위해 모든 변수를 double형으로 만들고 싶은 유혹을 느낍니다. 그러나 부동소수점 연산으로 인한 오버헤드를 감수할 필요가 없기 때문에 이는 잘못된 접근입니다. 또한 불필요한 비트를 메모리로 옮기고 다시 가져오는 데 드는 오버헤드 역시 마찬가지입니다.

대신 가능한 한 마이크로컨트롤러의 데이터 버스 폭에 맞춰 사용하는 것이 좋습니다. 예를 들어, 32 비트 MCU에서는 uint32_t를, 8 비트 MCU에서는 uint8_t를 사용해야 합니다.

또한 있으면 좋은 계산과 반드시 필요한 계산 사이의 균형을 고려해야 합니다. 이는 흔히 향후 필요할 경우에 대비해 모든 중간 및 최종 계산을 깔끔하게 저장하는 디버깅의 흔적이기에, 있으면 좋은 계산이나 후처리 사용을 없애면 에너지를 절약할 수 있습니다.

단, 주의할 점은 "너무 똑똑하게 굴지 말라"는 것입니다. 코드 단순화를 지나치게 하면 프로그램을 이해하고 해결하기 어려워집니다. 이에 대한 극단적인 예시가 어셈블리어 사용입니다.

불필요한 주변 장치 차단을 통한 에너지 절약

이 아이디어는 간단합니다. 방을 나설 때 불을 끄는 것처럼, 사용하지 않는 주변 장치를 끄면 됩니다. 프로그래밍 기술이 조금 더 필요하지만, 수신기의 RX 및 TX 부위를 그냥 켜두는 대신 ISR 웨이크업을 사용하는 저전력 모드로 설정하는 것과 같은 작은 것이면 됩니다.

글을 맺으며

이 글은 마이크로컨트롤러의 에너지 소비 절약이라는 방대한 주제 중 아주 작은 부분에 불과합니다. 이 주제에 대해서는 이미 수많은 서적이 출간되었습니다.

대화를 계속 이어나가고 싶으시다면, 아래에 여러분의 의견과 제안을 남겨 주시기 바랍니다.

감사합니다,

APDahlen

관련 정보

다음 링크를 통해 관련된 유용한 정보를 확인해 보시기 바랍니다:

저자 소개

미합중국 해안경비대(USCG) 소령(LCDR)으로 전역한 Aaron Dahlen은 디지키에서 애플리케이션 엔지니어로 근무하고 있습니다. 27년간의 군 복무 동안 기술자 및 엔지니어로서 쌓아온 그 만의 전자 및 자동화에 대한 지식은 12년간의 교단을 통해 (상호 연계되어) 더욱 향상되었습니다. 미네소타 주립대학, Mankato에서 전기공학 석사(MSEE) 학위를 받은 Dahlen은 ABET(Accreditation Board for Engineering and Technology, 미국 공학 기술 인증 위원회) 공인 전기공학 과정을 가르치고, EET(Electrical Engineering Technology, 전기공학 기술) 과정의 프로그램 조정관으로 일했으며, 군 전자 기술자에게 부품 수준의 수리에 대해 가르쳤습니다. 미네소타 주 북부의 집으로 돌아와 이런 류의 연구와 글쓰기를 즐기고 있습니다.



영문 원본: Microcontroller Ultra-Low Power (ULP) Mode: Save Energy with Sleep