일반

Power Hold 회로 구현하기

Posted 2010. 01. 11 Updated 2021. 12. 28 Views 16487 Replies 4
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

휴대전화나 MP3, PMP등의 휴대용 전자기기를 보면 전원 스위치의 작동 방식이 독특하다는 점을 알 수 있다. 요컨데, 전원을 켤 때는 전원 버튼을 3초이상 길~게 눌러서 켜고, 끌 때도 역시 길게 눌러서 전원을 끄는 방식으로 동작한다.

이러한 전원 스위칭 방식은 슬라이딩 스위칭 방식보다 외관상 깔끔해 보이고,
(휴대전화 전원스위치가 요즘같은 푸시버튼방식이 아닌 슬라이드 스위치 방식이라면 외관상 지저분함을 피할 수 없을 것이다.)
전원이 차단될 때 그 주체를 사용자가 아닌 프로세서에 둠으로써
(하지만 사용자가 배터리에 손을 댄다면 전원 주체는 사용자에게 있다고 하겠다.. -_-ㆀ)
전원이 차단되기 전에 미리 수행할 작업을 처리할 수 있다는 장점이 있다.
(휴대전화의 경우 전원이 꺼지기 전에 '나 꺼진다.ㅂㅂ-_-' 하고 기지국에 알려주는 작업을 수행한다.)

이러한 방식은 요즘 출시되는 컴퓨터에도 적용되어 있다. 예전의 386, 486 시대의 컴퓨터는 푸시-락(Push-Lock; 한번 누르면 들어가서 고정되어 있고, 다시 누르면 원상복귀됨) 방식의 전원버튼을 사용해서 컴퓨터가 켜져 있더라도 전원만 누르면 언제든지 바로 깔끔하게 꺼지는 방식이었다.

하지만 요즘의 컴퓨터는 푸시버튼 방식으로, 컴퓨터가 작동중에 전원 버튼을 누르더라도 바로 틱 하고 꺼지지 않고, 자동으로 시스템 종료 절차를 밣으면서 전원이 꺼진다. (정확히는 전원버튼을 누르면 OS로 인터럽트가 전달되고, 이후 OS가 정상적인 시스템 종료 절차를 수행하는 것이다.)

이러한 방식의 전원 스위치를 구현하려면 어떻게 해야 할까...?
라는 질문에 답을 하는것이 이번 글의 핵심이다.

우선 스위치는 회로를 닫고 여는 ON/OFF 기능밖에 수행할 수 없으므로, 뭔가 스위치 주위에서 전원을 관리하는 부가 회로가 필요할 것임을 짐작할 수 있다.

또한, 전원을 끌 때 자세히 본 사람은 알겠지만, 3초간 계속 눌러서 전원을 끄더라도 바로 꺼지지 않는다. 나름 시스템 종료 과정을 밞으면서 마지막에는 제품의 로고 사진이라도 띄웠다가 전원이 꺼진다. 이로부터 다음 사실을 알 수 있다.

전원 관리의 주체는 일단 전원이 인가된 후에, 사용자가 배터리를 빼지 않는 한(-_-!) 프로세서가 갖고 있다. 즉, 전원을 켠 뒤에 배터리를 빼는 반칙을 하지 않으면서 전원을 끄려고 시도하더라도 프로세서가 허락해 주지 않으면 절대로 전원을 끌 수 없다. 배터리가 모두 소모되어서 자멸하는 상황까지 가지 않는 한에는..!!

자, 그렇다면 지금까지 한 내용을 정리해보자.

푸시버튼 방식의 전원을 구현하려면:

  1. 전원 스위치 근처에 뭔가 특별한 장치가 필요하다.
  2. 전원이 일단 켜진 다음에 전원관리 주체는 프로세서가 갖는다.

위와같이 동작하는 전원을 Power Hold 방식 전원이라고 한다. 그 이유인즉, 일단 전원이 인가된 이후에 프로세서에서 Power Hold 핀을 이용해 스위치가 열리더라도 계속 스스로 전원을 붙잡고(Hold)있는 방식으로 구현되기 때문이다.

자세한 사항은 다음 문단에 이어서 설명한다.


예전부터 푸시버튼 방식의 전원부를 구현해 보려다가 기회가 없어서 생각만 해 두었는데, 이번 기회에 사용할 일이 생겨서 자세히 정리해 보려고 한다.

사용한 전원 전압은 9V이며, 구동 로직은 5V로직이다. 전원 정류에 사용한 소자는 스위칭 레귤레이터인 LM2575-5V로써, Active Low(Low전압이 인가되었을 때 작동) 방식의 Enable 핀을 포함한다.

LM2575_5.gif   
LM2575 스위칭 레귤레이터
 

이후 설명할 회로는 이에 맞춰서 제작되었지만, 저항값 정도만 조정하면 다른 전압의 회로에서도 사용할 수 있다.

완성된 Power Hold회로는 다음과 같다.

PWRHD_Circuit.gif

BAT는 9V 전지의 (+) 단자에 직접 연결되고, DVCC는 레귤레이터에의 5V 출력핀과 연결된다. #PWR_EN 단자는 레귤레이터의 Enable 핀에 연결되고, #PWR_HD 단자와 #PWR_SW 단자는 각각 전원관리 프로세서의 출력과 입력 핀에 연결된다.

여기서 단자 기호 앞의 '#' 표시는 해당 단자가 Low일 때 작동(Active Low)한다는 의미이다.

 

[2016.03.19 추가] 단, 이 회로에서는 MCU로부터 받는 신호핀인 #PWR_HD에 BAT의 풀업 전압이 그대로 걸리기 때문에 DVCC와 VBATT의 차이가 클 경우 MCU에 무리가 갈 수 있습니다. 이것이 문제가 되는 경우, 다음과 같이 Level Transceiver가 추가된 형태의 Power Hold 회로를 사용하면 됩니다.

power hold (active low) - with level transceiver.png
▲ Level Transceiver 보호회로가 추가된 Active Low방식 Power Hold 회로

 

이해를 돕기 위한 레귤레이터 부분의 회로도는 다음과 같다.

PWRHD_Regulator.gif

동일한 레귤레이터를 두 개 병렬로 연결하여 각각 5V를 출력하고 있는데, 모터를 구동하는 회로를 구현하기 위해 레귤레이터단에서 전원을 분리한 것이다. 헷갈린다면 아랫부분의 레귤레이터는 없다고 생각해도 된다.

#PWR_EN핀이 두 갈래로 갈라져서 각각의 레귤레이터의 Enable 핀으로 연결되고 있음을 알 수 있다. 레귤레이터의 Enable 핀에 Low Level의 신호(LM2575의 경우 1.4V 미만)가 인가되면 OUT 핀으로 정전압이 출력된다.

우선, 위쪽의 Power Hold회로를 보자.

분명 푸시버튼 방식의 SPST(Single Pole Single Throw) 택트 스위치 하나만을 사용하였다. 즉, 이것이 전원스위치이다. 두 개의 다이오드와 PNP타입의 범용 트랜지스터 하나 외에는 별로 특이한점이 없어 보인다. 나머지 10k와 100k 저항은 모두 풀업(Pull-Up)저항이다.

위 두 회로를 빵판에 실제로 구현해서 실험해 보았다. 이 실험과정을 봐 가면서 작동 원리를 설명할 것이다.

P100111001.jpg

프로세서 내부에 해당하는 #PWR_HD단자는 슬라이드 스위치를 사용하여 대체하였다.
슬라이드 스위치를 위로 올리면 GND와 연결되고, 아래로 내리면 레귤레이터의 출력단자(5V)와 연결된다. (※주의)
(즉, 위로 올렸을때 Power Hold 설정이고, 아래로 내렸을 때 Power Hold 해제이다.)

실제 프로세서를 사용하면 더 좋지만, 핀의 로직레벨을 표시하는데는 슬라이드 스위치가 더 좋기 때문에 설명을 위해 이와 같이 구현하였다. 하지만 실제 작동 방식은 프로세서를 사용할때와 별반 차이가 없다.

#PWR_SW 단자의 경우 그 로직 레벨을 확인할 수 없으므로 LED를 달아 두었다. High 상태이면 불이 꺼지고, Low 상태이면 불이 켜진다.

레귤레이터 작동 표시등은 레귤레이터의 출력핀과 연결되어 있다.

 

이제, 메인전원이 차단된 초기상태부터 한 단계씩 생각해보자.

 

1. 초기 상태(전원 OFF)

P100111002.jpg

초기에 Power Hold회로에서 BAT에만 9V가 인가되어 있다. (DVCC는 High-Impedance 상태이다.) 트랜지스터 Q1의 베이스가 100k 저항을 통해 풀업되어 있으므로 Q1은 OFF 상태이고, 따라서 #PWR_EN도 100k 저항에 의해 풀업되어 High신호가 출력된다. 레귤레이터는 Enable 핀에 High신호가 인가되었으므로 작동을 하지 않는다.

 

2. 전원 인가 과도기(Power Hold 설정 이전)

P100111003.jpg

전원 스위치를 누르면, 다이오드 D2를 통해 GND방향으로 전류가 흐르고, #PWR_EN에는 Low신호가 인가된다. (물론, D1을 통해서도 전류가 흘러 #PWR_SW에도 LOW신호가 인가되지만, 이것은 이 시기에 중요하지 않으므로 설명을 생략한다.)

레귤레이터가 작동을 시작하고, 프로세서에 전원이 인가되어 부팅이 시작된다. 하지만 아직 Power Hold가 설정되지 않았으므로(빨간색 박스) 전원 스위치에서 손을 떼면 메인전원이 곧 꺼진다. 이는 상용 기기에서 전원 버튼을 눌렀다가 일정 시간 이상 지나지 않았을 때 꺼지는 현상과 동일하다.

프로세서가 완전히 부팅되고 운영체제(혹은 펌웨어)가 완전히 로드되어 Power Hold핀의 제어권을 확보하기 전까지는 이 핀에 아무런 출력도 내보낼 수가 없기 때문이다.

 

3. Power Hold 설정 직후

P100111004.jpg

프로세서의 부팅이 완료되면 #PWR_HD단자를 통해 Low신호를 인가하여 Power Hold를 설정한다.
아직 위 2의 상황과 별다른 차이점은 보이지 않지만, 한 가지 중요한 차이점이 생겼다. 전원 스위치를 떼더라도 지속적으로 전원이 인가된다는 점이다.

 

4. 안정적 전원 공급기

P100111005.jpg

전원 스위치에서 손을 떼고 나서도 이와같이 레귤레이터가 지속적으로 동작한다.

회로를 다시 살펴보면, #PWR_HD단자에 Low신호가 인가되어 트랜지스터 Q1이 ON상태가 되고,
이미터에서 컬렉터로 전류가 흐르면서 #PWR_EN단자에 Low신호가 지속적으로 인가되어 레귤레이터가 작동한다.

 

5. 전원 차단 과도기(Power Hold 해제 이전)

P100111006.jpg

전원을 끄려고 전원 스위치를 누른 직후의 상황이다. 왼쪽 동그라미 안의 #PWR_SW 단자 표시등이 켜졌다. 이는 이 단자에 Low신호가 인가되고 있다는 표시이다. 이 단자는 프로세서의 입력 핀(주로 인터럽트 핀)과 연결되어 있고, 프로세서에서는 전원 버튼이 눌렸다는 사실을 알 수 있다.

전원 버튼이 눌렸다는 사실을 감지한 MCU는 전원을 끄기 위한 '시스템 종료' 과정을 밟기 시작한다. 물론, 이 상태에서 바로 전원 차단 과정을 시작하지 않고 일정 시간 기다렸다가 시작할 수도 있는데, 이는 전원을 끌 때 버튼을 길게 누르는 과정을 구현한 것이라고 볼 수 있다.

이 상태에서 전원 버튼에서 손을 떼더라도 아직 MCU가 #PWR_HD핀을 Low신호로 계속 유지하고 있으므로 메인 전원은 꺼지지 않는다.

회로도상으로 다시 한 번 살펴보면, SW1이 닫히면서 D1을 통해 GND로 전류가 흐르고, #PWR_SW단자로 Low신호가 인가되어 MCU에서는 '아, 전원 스위치가 눌렸구나!'라는 사실을 알 수 있다.

 

6. Power Hold 해제 직후

P100111007.jpg

프로세서에서 전원 차단을 위한 사전 프로세스를 모두 마치면(휴대폰의 경우 기지국으로 '나 꺼질께~^^'라는 메시지를 보낸 후) #PWR_HD핀에 High신호를 인가하여 전원이 차단될 준비를 한다. 하지만, 아직 전원 스위치가 눌려 있는 상태이므로 레귤레이터는 계속 작동하고, 메인전원도 차단되지 않는다.

회로도상으로 다시 한 번 살펴보면, 프로세서에서 #PWR_HD핀에 High신호를 인가하여 트랜지스터 Q1이 OFF상태가 되지만, SW1이 아직 닫혀 있으므로 다이오드 D2를 통해 GND로 전류가 흐르고, #PWR_EN단자에는 Low신호가 계속 인가된다. 따라서 레귤레이터는 계속 작동하고 있게 된다.

 

7. 메인전원 차단기

P100111008.jpg

#PWR_HD단자에 High신호가 인가된 이후 전원 스위치에서 손을 떼면 비로소 메인 전원이 차단된다. 회로도상으로 다시 살펴 보면, 6번 과정 이후 SW1이 열리면서 다이오드 D2에서 GND로 흐르던 전류가 차단된다. 동시에 #PWR_EN핀은 100k저항에 의한 풀업 상태로 되돌아가면서 High신호가 인가되고, 레귤레이터의 전원이 꺼진다. (BAT의 경우 배터리에 직접 연결되어 있으므로 레귤레이터의 작동 여부와는 관련이 없다.) 레귤레이터가 꺼지면 DVCC로 인가되던 로직전원 5V가 더 이상 공급되지 않으므로, 프로세서를 포함한 기기 전체의 전원이 차단된다. 


이상이 Power Hold 방식을 적용한 전원 회로의 전원 인가부터 차단까지의 과정을 기술한 것이다. 사용한 레귤레이터가 Active Low 방식이라 약간의 혼란이 있을수는 있으나, Active High 방식의 레귤레이터를 사용하더라도 이와 크게 다르지 않다.

Enable핀이 Active High 방식(Enable핀에 High신호가 인가될 때 레귤레이터가 작동)의 레귤레이터를 채택한 경우, 위 회로도에서 Q1를 NPN타입 TR로 교체하고, D1과 D2의 방향을 바꾸며, GND는 DVCC혹은 BAT으로, 각 신호선의 풀업은 풀다운으로 바꿔 주면 된다. 이 경우 모든 신호의 Active Level이 반전되게 된다. 즉, 스위치를 누르면 PWR_SW(Active High이므로 '#'을 쓰지 않았다.)단자에 High신호가 인가되고, PWR_HD단자에 High신호를 인가하여 Power Hold를 수행한다.

지금 시간이 너무 늦어서 Active High 방식의 회로도를 그릴 수는 없지만,
나중이 시간이 된다면 이것도 설계하고 테스트해서 업데이트 하도록 할 것이다.

마지막으로, 위 회로도는 트랜지스터 Q1을 제거하고 #PWR_HD단자를 #PWR_EN단자에 직접 연결함으로써 같은 동작의 회로를 구현할 수 있다. 이 경우 회로를 단순화 할 수 있는 장점이 있지만 #PWR_HD단자로 흐르는 전류가 많아지면서 프로세서에 무리가 갈 수 있다. 즉, #PWR_EN핀에 레귤레이터를 여러 개 병렬로 연결하여 구동하는데 제약이 따르게 된다.

 

[2016.03.19 추가] 다음은 Active High 방식의 Regulator일 경우 Power Hold회로를 구성하는 예시를 나타낸 것입니다. 일반적인 전압 상황에서 사용할 수 있도록 DVCC와 VBATT의 전압 레벨을 상호 전환하기 위한 Level Transceiver 회로를 추가해 두었습니다. MCU의 I/O핀에 VBATT 전압을 그대로 인가해도 문제가 되지 않는 경우, Level Transceiver 회로들을 모두 Pull-down으로 대체해 줘도 무방합니다.

power hold (active high) - with level transceiver.png
▲ Active High방식 Power Hold 회로 예시

 

Epilogue

이렇게 다 만들고 나서 테스트를 하면서 깨달은 사실인데, 한 가지 문제점이 있었다. 전원을 끄려고 스위치를 길게 누르고 프로세서에서 #PWR_HD 신호를 High로 만들어 Power Hold를 해제 하더라도, 푸시스위치를 떼지 않으면 전원이 계속 들어와 있다는 것이다.

분명 예전에 I-Station V43 PMP를 사용할 때, 전원을 끄려고 스위치를 OFF쪽으로 길게 밀면 나름 시스템종료 동작을 수행한 뒤 화면이 꺼지고 하드디스크 전원이 나가면서 PMP의 전원이 차단되었다. 나는 이것까지 구현하고 싶어졌다 - 프로세서에서 Power Hold를 해제하면 푸시버튼의 상태에 관계없이 회로 전체의 전원이 깔끔하게 나가버리는것..

위에서 구현한 회로에 뭔가 약간의 변형을 하면 될 수 있을것 같았다. 나는 #PWR_HD 핀에 다이오드를 달아보기도 하고, 트랜지스터의 Emitter와 Base를 쇼트시켜보기도 했다. 하지만 여전히 허당일 뿐... 오히려 회로는 두 레귤레이터중 하나는 켜지고 다른 하나는 꺼지는 등 이상한 동작을 보였다.

문득, 예전 PMP의 전원이 꺼질때 동작을 자세히 떠올려 보았다.

'프로세서에서 필요한 작업을 완료 하고... LCD의 전원을 차단하고... 그리고, 하드디스크를 끈다...'

문득 스친 생각이, PMP를 비롯한 휴대용 기기는 전원소비 관리가 상당히 중요하기 때문에 프로세서(혹은 전원관리 모듈)에서 각각의 파트에 흐르는 전원을 독립적으로 관리한다는 것이었다.

'그렇다면 메인전원이 차단되지 않는 한 주변 장치들의 밥줄은 프로세서 쥐락펴락한다...'

'메인전원이 차단되지 않는 한 말이지...'

'메인전원이 차단...[!!!]'

'아, 그래! 혹시...'

문득 스친 생각. 일단 눈 앞에 있는 내 휴대전화를 들었다. 그리고는 전원 버튼을 꾹 누르고 계속 기다려봤다. 진동이 울리면서, '생각대로 팅'의 T가 리본이 풀리면서 LCD가 꺼졌다. 그래도 계속 누르고 있었다. 그런데, 역시나 예상대로 전원을 끌 때 소울키패드에 희미한 회색으로 디스플레이되던

Anycall
www.anycall.com

이라는 문구는 사라지지 않고 계속 디스플레이되고 있었다. 한참 뒤에 전원 버튼에서 손을 떼니 비로소 소울키패드의 문구가 사라졌다.

바로 그것이다.

전원을 끌 때 사용자가 전원 버튼에서 손을 떼지 않으면 전원이 완전히 꺼지지 않는 것이다. 앞에서 언급했듯이, 모바일 기기의 전원은 프로세서에서 관리한다. 메인 전원이 들어와 있더라도 프로세서가 각 모듈의 전원을 켜지 않으면 겉보기로는 꺼진 것과 다름없게 보이게 된다.

즉, 전원을 끌 때 프로세서는 각 모듈의 전원을 차단하고 나서 사용자에게 '전원이 완전히 꺼진 척'을 하고 있으면 사용자가 전원 버튼을 떼면서 비로소 메인 전원까지 깔끔하게 차단되는 것이다. 상식적으로 생각해봐도 기기가 완전히 꺼졌는데도(실제로는 그저 그렇게 보일 뿐...) 여전히 계속 전원 버튼을 누르고 있는 사람은 없을 것이다.

그렇게 큰 논의가 될 만한 안건은 아니었지만, 문득 들었던 생각에 나도모르게 마치 큰 깨달음을 얻은 것처럼 기뻐했다..ㅎ 내가 이런 결론을 내림으로써 약 한시간동안 진행되던 '전원 완전히 차단'회로 구현은 접어두고 정리를 한 뒤 학숙으로 돌아왔다.

결론은 내가 전원 끄는 과정에서 할 것이라고는 모든 장치가 마치 '꺼진것 처럼' 살짝 위장해 두고, Power Hold를 해제한 뒤 사용자가 알아서 메인전원을 차단할 때까지 기다려주면 되는것이다.