이번에 간단한 MCU 회로에 대해서 공부하면서 Push-Pull과 Open-Drain 방식의 구조 차이에 대해서 이해할 수 있었다.
ㅤ
그런데 공부하면서 궁금증이 생겼다. 푸시풀이랑 오픈드레인이 옵션으로 분리되어 제공되고 있다는 것은 두 방식이 각각의 장단점이 있어서라고 생각이 드는데, 푸시풀과 오픈드레인의 장점이 무엇이고 어떤 상황에서 무엇을 활용하면 좋을 지에 대해 이번 글에서 알아보고자 한다.
ㅤ
우선 푸시풀과 오픈 드레인의 간단 비교

Push-Pull
- PMOS + NMOS로 구성
- LOW 출력 : PMOS로 수행
- HIGH 출력 : NMOS로 수행
ㅤ

Open-Drain
- NMOS로만 구성
- LOW 출력 : NMOS로 수행
- HIGH 출력 : 외부 풀업 저항 이용 (자체 출력 불가)
ㅤ
스위칭 속도
스위칭 속도는 푸시풀이 오픈드레인보다 빠르다!

ㅤ
푸시풀 회로에서는 LOW → HIGH 로 신호를 변환할 때 CMOS 쪽의 전압을 변경해주면 VDD에서 바로 Output Pin으로 전류를 공급할 수 있다. 이때 PMOS에 의해 걸리는 저항 값이 25$\Omega$ 정도이기 때문에 원활하게 전류를 공급해서 빠르게 충전하여 HIGH 상태까지 도달할 수 있다.
ㅤ
오픈드레인 회로에서는 LOW → HIGH 로 신호를 변환할 때 NMOS 쪽의 전압을 변경해주면 VDD에서 높은 풀업저항을 통과하여 전류가 흘러나온다. 이때 높은 임피던스(5k$\Omega$)로 인해 공급되는 전류가 약해 HIGH 까지 충전되어 도달하는데에 시간이 오래걸린다. 이 시간이 거의 1$\mu$s에 버금가는 정도인데, 6ns 정도 걸리는 푸시풀 방식보다 약 200배 정도 느리다.
ㅤ
HIGH → LOW 상황에서는 두 방식 다 NMOS에 전압을 가해 GND 쪽으로 충전된 전류를 흘려보내 방전시키기만 하면 LOW까지 전압이 떨어지니깐 NMOS를 변환하는데에 필요한 시간은 5ns 정도로 동일하다.
ㅤ
아래는 오픈 드레인에서 LOW→HIGH / HIGH→LOW 의 전압을 시간에 대한 그래프로 표현한 것이다.

ㅤ
여기에서 LOW→HIGH 까지 도달하는데 “충전” 이라는 용어를 사용하였음. 회로 (PCB 상의 도선)을 커패시터의 일종으로 봐야한다. 여기에서도 마법같이 0V → 3.3V 로 뿅하고 전압이 오르는게 아니라, 서서히 충전이 되고 전압이 차올라서 3.3V 까지 도달하여 HIGH 신호를 의미하게 되기 때문에! 전류가 많이 흐를수록 커패시터(회로 도선)의 충전속도는 빠르다. 요것을 “기생 커패시턴스”라고 부르는 듯 하다.
ㅤ
(아직 공부하지는 않았지만) 100kHz 정도의 주파수로 통신하는 I2C 통신 방식의 경우, 1초에 100,000 번의 신호를 전송한다. 신호의 전환(클럭 주기)이 10,000ns 마다 발생하므로 클럭 전환에 1,000ns 정도 걸리는 오픈드레인 방식을 사용하더라도 충분히 동작할 수 있다. 오히려 이럴 때는 푸시풀을 사용하는게 과할 수도 있다.
ㅤ
그러나, 10MHz 정도의 주파수로 통신하는 SPI 통신 방식의 경우, 1초에 10,000,000 번 신호를 전송해야 한다. 즉 신호의 전환(클럭 주기)이 100ns마다 발생해야 하는데, 이 경우에는 오픈 드레인 방식을 사용한다면 시간 내에 출력값 전환을 할 수 없다. 푸시풀 방식을 사용한다면 6ns 만에 신호 전환이 가능하기 때문에 통신 주파수에 맞게 신호를 충분히 만들어낼 수 있다.
ㅤ
1마이크로초 보다 더 빠른 신호 전환이 필요하다면 푸시풀 방식을 사용하자.
ㅤ
전류 공급
위에서 언급한 내용에 따라 전류 공급은 오픈 드레인 방식보다 푸시풀 방식이 더 효율적이라는 것을 이해할 수 있었을 것이다!
ㅤ
대신 오픈 드레인은 전류를 Sink 할 때 (내부 GND로 흘려보낼 때) 강하게 전류를 공급할 수 있다. 오픈드레인을 사용할 것이라면 내부로 전류를 Sink 할 때 (LOW 신호를 출력할 때) 소자에 전류를 공급하도록 회로를 구성해야한다.

ㅤ
다만 유의할 점은, 무한히 큰 전류까지 모두 Sink 처리할 수 있는 것은 아니다. 메뉴얼에 따르면 I/O 핀 하나에서 처리할 수 있는 최대 sink 용량은 25mA 이며, 모든 sink가 합해서 270mA 보다 커지면 안된다.

ㅤ
만약 진심 큰 전압이나 전류를 흘려보내야 한다면, MCU 내부에서 내보내거나 흘려보낼 생각을 하지말고, MCU는 스위칭 신호만 처리하고 전류를 외부 Vdd → 외부 GND 로 흐르도록 하면서 제어할 회로를 생각해야 한다.

ㅤ
멀티드롭
하나의 공유 라인에 여러 개의 푸시풀 회로의 출력 / 여러 개의 오픈드레인 회로의 출력이 연결될 수 있을까.
ㅤ

만약 여러 푸시풀 회로의 출력이 하나의 공유 라인을 사용할 때, 서로 다른 신호의 출력이 있다면 Vdd 에서 나온 전류가 GND로 바로 연결되면서 쇼트가 발생할 수 있다. 물론 여기에서 PMOS와 NMOS가 약간의 저항 역할(합쳐서 50$\Omega$ 정도)을 해주긴 하지만, 전류가 과하게 흘러(3.3V와 50$\Omega$ 기준으로 66mA) 과전류로 인한 손상이 발생할 수 있다. 또 전력 낭비도 발생하고 결과 출력이 애매한 전압을 가지게 된다. 여러모로 안좋은 상황임.
ㅤ

이와 반대로 오픈드레인 방식의 출력을 하나의 공유 라인을 사용해 묶어주면, Vdd의 공급은 외부 풀업 저항을 이용하기 때문에 여러 회로에서 공유하게된다. 연결된 오픈드레인 회로 중에서 하나의 회로만 LOW 출력이고 나머지는 HIGH 이라고 하더라도 GND가 연결되어 LOW 출력을 보낸다. 만약 모든 연결된 회로가 HIGH를 출력한다면 Vdd 전압 HIGH가 그대로 출력으로 전달된다. 이게 OR 게이트와 동일하다!
ㅤ
만약 여러 장치가 하나의 라인을 공유하는 회로를 구성해야 한다면 오픈드레인 방식을 사용해야한다.
이게 I2C 통신에서 I2C 버스에 해당하는 회로 구성이라고 한다. 다음에 I2C 공부할 때 매우 유용하게 익힐 수 있을 것 같다. 여기에서는 당연히 오픈드레인을 써야지! 라고 생각해낼 수 있을 듯!
ㅤ
레벨 변환 (3.3V ↔ 5V)
우리가 사용하는 MCU는 3.3V 시스템이라, 내부 GPIO의 Vdd는 다 3.3V를 사용한다. 이때 외부의 장치와 신호를 주고받거나 통신을 해야하는데, 이 시스템이 5V 시스템이라면 어떻게 해야할까?
ㅤ

ㅤ
기본적으로 Push-Pull 회로에서는 GPIO핀(SoC) 내부의 Vdd에서 전원을 공급받아 HIGH 전압을 제공하기 때문에, 낼 수 있는 전압은 3.3V가 최대이다. 3.3V를 5V 장치에게 전달하면 이걸 그냥 ‘애매한 전압’ 정도로 판단하고만다. 그래서 푸시풀 회로는 5V 시스템과의 통신에서 사용할 수 없다. (물론 외부에 CMOS를 놓고 회로를 구성한다면 되겠지만…)
ㅤ
Open-Drain 회로에서는 외부에 따로 풀업회로 Vdd를 두고 사용하는 방식이기 때문에, 여기에서 사용하는 외부 Vdd를 5V를 사용하면 HIGH 신호로 5V를 전달할 수 있게된다. LOW 신호에 대해서는 NMOS Gate에 전압을 가하면 GND 쪽으로 전압이 빠지게 되는데, NMOS 회로는 20V까지도 전압을 버틸 수 있기 때문에 5V 전압이 들어온다고 해서 큰 문제가 되지는 않는다.
ㅤ
5V 시스템과 신호를 주고받아야 한다면 오픈 드레인을 사용해야 한다!
ㅤ
푸시풀과 오픈드레인은 출력과 관련된 회로. 그렇다면 입력은 어떻까? 3.3V 시스템 MCU에 5V 입력이 들어오면 문제가 발생할 수도 있을 것 같은데, 어떻게 처리하고 있는지가 궁금하다!
ㅤ
이게 궁금해서 다큐먼트들을 찾아봤는데, 놀랍게도 이미 본 적 있는 키워드들이였다! GPIO를 공부할 때 이 그림을 펼쳐놓고 분석을 했었는데, 제목을 보니 “Five-Volt Tolerance Port” 라고 떡하니 적혀있었다 ㅋㅋㅋ. 앞으로 문서에서처럼 Five-volt Tolerant 에 대해서 FT 라고 표현하겠다.

ㅤ
여기에서 $V_{DD_FT}$ 와 Protection Diode, Schmitt Trigger 가 5V Tolerant를 위해 동작한다.
- 슈미츠 트리거
- FT Pin에 붙어있는 슈미츠 트리거는 5V까지 받을 수 있도록 설계가 되어있고, 3.3V와 5V 모두 High로 처리하도록 설계되었다.
- 애초에 HIGH는 특정 전압이 아니라, “몇 V 이상인가?”를 기준으로 분류하기 때문에, 3.3V 시스템을 기준으로 5V는 모두 HIGH 영역에 속해서 이 전압을 소화할 수만 있다면 문제가 없다. LOW 신호도 0V니깐 호환됨. (3.3V 신호 → 5V 시스템 이였다면 문제가 되었겠지만)
- FT의 슈미츠 트리거는 대략 7V 까지 버틸 수 있게 설계되었다(고 본 것 같음). 7V가 되기 전에 Protection 처리가 된다.
- $V_{DD_FT}$ 와 Protection Diode
- 5V 정도의 신호야 그냥 안으로 흘려보내지만, 순간적으로 들어오는 높은 전압은 회로를 망가트릴 수 있기 때문에 보호 조치를 해주어야 한다. 그리고 $V_{DD_FT}$는 입력되는 높은 전압으로부터 소자들을 보호하기 위해 존재한다.
- $V_{DD_FT}$가 5.5V 의 전압을 가지고 있다고 하자. 그리고 Diode에 전류가 흐르기 위해서는 0.7V 정도의 전압이 걸린다고 해보자.
- 그러면 I/O 핀으로 6.2V 이상의 전류가 흘러들어오면 그 이상으로 전압이 상승하려고 하면 다이오드의 전압차가 0.7V가 되면서 (다이오드 Turn On!) Protection Diode 쪽으로 흘러서 $V_{DD_FT}$ 에 의해 유입되는 신호의 전압이 6.2V 이상으로 오르지 못하도록 한다.
- 위 과정으로 동작하는 전압 클램핑 덕분에 내부 전압이 위험한 전압 범위 내에 아슬아슬하게 유지하여 회로의 손상을 방지한다.
ㅤ
지속적으로 높은 전압이 입력으로 들어온다면 열 발생 등의 문제로 회로가 손상될 수 있다!! + Vdd로 전류가 들어가면서 회로 전체가 와르르맨션이 될 수도 있다. (물론 $V_{DD_FT}$는 별개라고 아래에 달려있긴 한데, 그래도 보드는 하나의 보드니깐)
ㅤ
그리고 문서에도 입출력에 대해서 허용되는 전압에 대해서 작성해뒀다. 웃긴건 FT pin 으로 들어오는 최대전압은 꼭 지켜달라고 되어있다 ㅋㅋㅋㅋ. 최대치는 VDD+3.6V 라고 되어있는 것으로 보인다. 우리 시스템의 Vdd가 3.3V 이니깐, 대략 7V까지가 최대로 GPIO Pin으로 넣을 수 있는 전압이다. 주의할 점은 FT 처리가 되어있지 않은 GPIO핀인 TTa 핀은 4V 라는 것.


ㅤ
그렇다면 왜 모든 GPIO 핀에 5V에 대한 보호 조치를 하지 않았는가? 에 대해 궁금해서 찾아봤다.
- FT를 위해서는 3.3V 시스템보다 큰 트렌지스터를 사용해야한다. 근데 이게 트랜지스터의 크기가 커진다는건 누설전류가 많아진다는 것을 의미한다. 즉, 전력 소비가 늘어나기 때문에 저전력 시스템에서는 불리하다.
- 아날로그 데이터를 다루는 ADC 기능은 정밀해야한다. 그런데 FT를 위한 트랜지스터에서는 누설전류가 비교적 크게 발생하기 때문에 아날로그 값들이 영향을 받기 쉽다.
- 5V 시스템과 연결해야하는 핀은 I2C 통신, SPI 통신 같은 다른 시스템과 신호를 주고받는 기능을 위한 핀들이다. 모든 핀이 FT 특성을 가져야할 필요는 없다.
- 트랜지스터의 크기가 크다는 것은 차지하는 공간과 부품 크기가 커진다는 것이고, 비용 증가로 이어진다.
ㅤ
결국 Cost 문제!
ㅤ
전력 효율
푸시풀 방식은 Vdd로부터 전류를 큰 저항을 거치지 않고 바로 출력으로 공급할 수 있다. 이와 반대로 오픈드레인 방식은 Vdd로부터 5k$\Omega$ 상당의 큰 저항값을 가지는 풀업 저항을 거쳐 전류를 공급해야한다.
ㅤ
푸시풀에서 HIGH / LOW를 유지하고자 한다면 그냥 NMOS와 CMOS에 전압을 제공하기만 하면 되므로 정적 전류가 거의 없다. 있어봤자 NMOS와 CMOS가 어쩔 수 없이 가지는 저항 수치 정도.
ㅤ
오픈드레인에서는 HIGH 를 유지한다면 Vdd에서 풀업 저항을 거쳐 전류를 공급하게 되면서 정적 전류가 풀업저항에 의해 발생하게 된다. LOW를 유지한다고 해도 Vdd에서 풀업 저항을 거쳐 GND 쪽으로 전류가 빠지게 된다. 여기에서도 정적 전류가 발생한다.
ㅤ
즉, 푸시풀 방식이 전력 효율 면에서는 오픈드레인보다 더 뛰어나다. 오픈 드레인은 지속적으로 전류를 소비한다.
ㅤ
20251104 추가+)
다시 생각해보고 있는데, 푸시풀에서도 Vdd에서 전류가 밖으로 나가거나 안으로 들어오는게 아닌가? Vdd와 GND로 전류가 흐른다는 측면에서는 오픈드레인이나 푸시풀이나 동일한 것 같다. 다만 흐를 때 저항값이 푸시풀보다 오픈드레인 쪽이 더 크기 때문에 푸시풀의 효율이 좋다고 생각해야 할 것 같다.
정리하자면
- 스위칭 속도 - 스위칭 속도가 빨라야 한다 : Push-Pull
- 전류 공급 - 충분한 전류를 사용할 수 있어야 한다 : Push-Pull / 외부 전원으로부터 Sink를 쓴다면 Open-Drain
- 멀티 드롭 - 여러 노드가 동시에 연결될 수 있어야 한다 : Open-Drain
- 레벨 변환 - 5V와 통신해야한다 : Open-Drain
- 전력 효율 - 정적 전류가 적어야한다 : Push-Pull
ㅤ
대략적으로 요약하자면, 전류를 적게 사용하고 빠르게 동작해야 하는 회로라면 푸시풀을 사용하자. 5V로 올려야 한다거나 여러 노드가 물려야 한다거나 외부에서 전원을 끌어온다거나 하는 복잡한 상황 (거의 통신?) 이라면 오픈드레인을 사용하자.
'Embedded System > MCU' 카테고리의 다른 글
| [MCU] Basic Timer (2) | 2025.11.07 |
|---|---|
| [MCU] SysTick 타이머 (2) | 2025.11.04 |
| [MCU] 풀업, 풀다운 저항은 MOSFET인가? (0) | 2025.11.02 |
| [MCU] V=IR과 기본 임피던스부터 풀업과 풀다운, 푸시풀과 오픈드레인까지 (0) | 2025.11.02 |
| [MCU] UART 구조와 이해 (0) | 2025.10.30 |