초저전력(ULP)이란 무엇인가?

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

스펙트럼의 가장 극단적인 예로는 혈당 측정기와 같은 배터리 구동 기기가 있다. 이러한 놀라운 기술의 기기는 코인 셀 배터리 하나로 동작한다.

이 기기는 실시간 클록(RTC)를 유지하기 위해 극히 미세한 전력만을 사용하며 슬립 상태를 유지한다. 주 마이크로컨트롤러는 사용자의 입력에 따라 깨어나 측정을 수행하고 디스플레이를 갱신하거나 데이터를 다운로드하기 위해 PC와 통신한다.

[그림1]에 소개된 STM32L562CEU6과 같은 고성능 및 구성의 자유도가 높은 프로세서가 보급되면서 ULP의 중요성이 점점 커지고 있다.

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

[그림1] STM32F767ZIT6 코어텍스-M7 프로세서를 탑재한 STM32F767 Nucleo-144 보드 [제공=ㄷ지키]
[그림1] STM32F767ZIT6 코어텍스-M7 프로세서를 탑재한 STM32F767 Nucleo-144 보드 [제공=디지키]

 

기술 팁= 절전 전류와 프로세서의 복잡도 사이에는 반비례 관계가 있는 것으로 보인다. 소개된 코어텍스-M7은 매우 복잡한 장치다. 경험적으로 성능이 1/100 수준인 소형 8비트 장치는 절전 전류가 약 1/10 수준이다. 물론 예외도 있으며 유능한 엔지니어들은 끊임없이 기술을 발전시키고 있다. 현재 일부 중급 32비트 마이크로컨트롤러는 8비트 마이크로컨트롤러와 동등한 수준에 도달했다. 대표적으로 STM32L562CEU6 시리즈는 전원이 모두 꺼진 상태에서 17nA의 전류만을 필요로 한다.

초저전력(ULP) 설계에 사용되는 하드웨어

논리 게이트의 에너지 소비는 해당 게이트의 동작 속도에 의해 좌우되는 경우가 많다는 점을 기억해야 한다. 마이크로컨트롤러는 수많은 논리 게이트로 구성돼 있으므로 에너지 소비는 클록 속도와 직접적으로 연관관다.

예를 들어 요즘 사용되는 32비트 ARM 프로세서는 코어가 216MHz로 최대 속도로 동작할 때 상당한 전력을 소모한다. 같은 코어라도 32.768kHz RTC 주파수로 전환하면 훨씬 낮은 전력으로 구동된다. 더 낮은 전력 소비를 위해 메인 CPU를 종료하고 일부 기능을 주변 장치로 이관할 수도 있다.

전용 32.768kHz RTC 주변 장치가 대표적인 예다. 그 밖의 예로는 워치독 타이머, 상태 변화 감지(wake-up on change) 인터럽트, 직접 메모리 액세스(DMA) 등이 있다.
 

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

실제 예로 [그림1]에 표시된 ST마이크로일렉트로닉스의 STM32F767ZIT6이 있다. 모든 주변 장치가 활성화된 상태에서 216MHz로 동작하고 온도가 상승하면 전류는 최대 258mA에 이를 수 있다.

반면 RTC를 제외한 모든 기능이 비활성화된 딥슬립 모드에서는 전류가 1.7VDC 전원에서 주변 온도 25°C 기준으로 최소 770nA까지 감소한다.
 

기술 팁= 슬립 모드는 단순한 전원 온·오프 스위치가 아니다. 실제 동작 조건은 칩에 포함된 주변 장치의 수만큼 다양하다. 예를 들어 소개된 STM32F767ZIT6의 데이터시트에서는 서로 다른 동작 모드를 설명하는 데 12쪽이 넘는 분량이 할애돼 있다.

ULP 설계에 사용되는 소프트웨어

클록 속도의 조절과 미사용 주변 장치의 비활성화는 ULP 설계의 중요한 요소다. 그러나 이러한 작업이 자동으로 수행되는 것은 아니다. 진정한 ULP를 구현하려면 하드웨어를 프로그래머가 직접 제어해야 한다. 이를 위해서는 성능과 전력 소비 사이에서 적절한 균형점을 찾기 위해 응용 프로그램에 세심한 주의를 기울여야 한다.

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

인터럽트 서비스 루틴(ISR)을 사용해 버튼 입력이나 하드웨어 타이머 오버플로우와 같은 실제 이벤트에 대응하면 전력 소비를 최소화할 수 있다. 각 ISR은 이벤트가 발생하면 트리거돼 짧은 코드 구간을 실행한 뒤 마이크로컨트롤러는 다시 슬립 상태로 돌아간다. 극단적인 예를 들면 코드는 다음과 같이 구성될 수 있다.

[제공=디지키]
[제공=디지키]

실제 프로그램은 코드 예시에서 제시된 것보다 훨씬 더 복잡할 수 있다. 그러나 목표는 여전히 슬립 시간을 최대화하는 데 있다.

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

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

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

개인적으로는 코드 단순화를 위해 모든 변수를 더블형(double)으로 통일하고 싶은 유혹이 든다. 그러나 부동소수점 연산에 따른 오버헤드가 크기 때문에 그렇게 하는 것은 효율적이지 않다. 메모리와 주고받는 불필요한 비트로 인한 데이터 이동 오버헤드 역시 마찬가지다.

대신 가능한 한 마이크로컨트롤러의 원자 폭(atomic width)에 맞춰 사용하는 것이 좋다. 예를 들어 32비트 장치에서는 uint32_t, 8비트 장치에서는 uint8_t를 사용하는 것이 바람직하다.

또 있으면 좋은(nice-to-have) 계산과 반드시 필요한(need-to-have) 계산 사이의 균형을 고려해야 한다. 이러한 코드 패턴은 종종 디버깅 과정에서 비롯되며 향후 필요할 가능성에 대비해 모든 중간 및 최종 계산 결과를 저장해 두는 경우가 많다. 불필요한 계산이나 후처리 과정을 줄이면 전력 소비를 줄일 수 있다.

이 점에 대해 “지나치게 영리해지려 하지 말라”고 경고한다. 코드 단순화가 지나치게 진행되면 프로그램의 이해와 문제 해결을 오히려 더 어렵게 만들 수 있다. 이에 대한 극단적인 예시가 어셈블리어 사용이다.

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

이것은 간단한 개념이다. 방을 나설 때 불을 끄는 것과 마찬가지로 미사용 주변 장치는 꺼두는 것이 좋다. 더 많은 프로그래밍 측면에서 약간의 세심함이 필요하지만 ISR을 통해 깨어나는 저전력 모드로 수신기를 두는 것과 같은 세부적인 기술적 접근들이 단순히 송수신(RX/TX) 섹션을 항상 켜 두는 것보다 더 바람직하다.

글을 맺으며

마이크로컨트롤러의 에너지 절약이라는 측면에서 이 글은 그야말로 빙산의 일각에 불과하다. 이 주제에 대해서는 이미 수많은 서적이 출간됐다. 계속해서 이야기를 나누어 주면 좋겠다.

원문은 DigiKey의 TechForum/Article을 참조하세요!

회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지
이 기사와 관련된 기사