← Articles

Open Drain (and Open Collector) vs. Push-Pull Outputs: What Your Textbook Left Out

Other

Misunderstanding open-drain outputs has quietly burned through FSAE teams' schedules and PCB budgets. This minor mistake is probably made by every team during their first year building an EV.

Rules References

There is probably no better example of where textbook theory deviates from practical fundamentals in a more time-consuming and costly way than the Open Drain Output. I estimate that misunderstanding this feature alone has probably cost every team at least one PCB respin. When you collect that lost time up among hundreds of teams internationally… that’s a lot of lessons hard-learned.

This article explains what open-drain means, why it exists, and how to use it. You’ll find open-drain outputs in comparators, logic ICs, and as an output arrangement of certain off-the-shelf modules.

In this article, I’ll use the term “Open Drain” to refer to “Open Collector” outputs as well. They are essentially the same - the only difference being the transistor technology.


The Output You Already Know: Push-Pull

In theory, an op-amp comparator output is a perfect voltage source. It drives whatever voltage it needs to, with zero output impedance. In practice, a real output stage uses two transistors wired in a complementary arrangement called push-pull.

The insides of a real comparator. The push-pull transistor pair allow the output to drive HIGH/LOW with low impedance.

When the output is driven high, the top transistor (the source transistor) turns on and actively pulls the output toward VDD. When driven low, the bottom transistor (the sink transistor) turns on and actively pulls toward GND. At any given time, one transistor is on and doing work while the other is off.

This is a strong, fast output. It can source and sink current, and it charges any capacitance on the output line quickly. For a standalone comparator or logic gate driving a single load, it works as theory predicts.


The Problem: What Happens When You Connect Two Push-Pull Outputs Together?

Suppose you have two logic gates, both with push-pull outputs, and you wire their outputs to the same net.

Gate A’s output goes high. Gate B’s output goes low. Gate A’s pull-up transistor is actively driving toward 5V. Gate B’s pull-down transistor is actively driving toward GND.

Both transistors are on simultaneously. VDD is connected to GND through two low-impedance switches. The result is sometimes called shoot-through: a large short-circuit current, heat, and potential destruction of one or both devices.

shoot-through current - don't do this

You cannot connect push-pull outputs together unless you know with certainty they will never be driven to opposite states simultaneously — which in most systems you cannot guarantee.


The Solution: Open Drain

An open-drain output removes the pull-up transistor entirely. All that remains is the pull-down transistor to GND.

An open-drain output has no means of driving the output high - it can only pull the output low.

When the open-drain output is driven low, the transistor turns on and pulls the output firmly to GND. When the output is released (driven high in logic terms), the transistor turns off and the output pin is simply disconnected from everything inside the IC. It floats.

To make that floating node actually reach a logic-high voltage, we add an external pull-up resistor connected from the output pin to a supply voltage of your choosing.

Sticking Point

This is where many teams run into trouble: Using an open-drain device as if it were a push-pull device. The circuit simply doesn’t function, and perhaps nobody knows why. Luckily, it’s relatively simple to bodge in a pull-up resistor if this ever happens to your team (and it’s caught).

Open-drain-output devices require a pull-up resistor to function

The output is now functional: it pulls low actively, and the resistor pulls high passively. The trade-off is that the rise time is no longer determined by a transistor actively charging the line - it is now determined by the RC time constant formed by the pull-up resistor and the capacitance of the net.

How an open-drain output works by pulling the output to ground. The output can't actively drive the output high, a pull-up resistor is needed for that

Note

The output is pulled up to VDD (positive logic supply) in these examples - but you can pull up to a different voltage within the device’s output rating - this allows you to translate between voltage levels (eg. 3.3V -> 5V) for free! See the Voltage Level Translation section for more.


Why This Matters: Two Great Applications

1. Wiring Multiple Outputs Together (Wire-AND)

With open-drain outputs, multiple devices can share a single signal line without conflict.

If all devices release the line, the pull-up resistor holds it high. If any device asserts its pull-down transistor, the line goes low - regardless of what the other devices are doing. We essentially get an AND gate for free when we join the outputs!

wire-AND logic using gates with open drain outputs

This architecture is called wire-AND (or wire-OR depending on the active polarity convention). In the graphic above, the Output is only HIGH when it is between the two reference voltages: Output = (Input > Vref_lo AND Input < Vref_hi) If either condition is not met, one of the comparators will be actively pulling the Output LOW.

Aside

This is the foundation of the I²C bus, used everywhere in embedded systems. Every device on an I²C bus has an open-drain output on the SDA and SCL lines. Any device can hold the bus low without damaging any other device. This is also how shared interrupt lines work: Multiple peripherals connect their INT pins to a single microcontroller GPIO, and any one of them can assert the line.

2. Voltage Level Translation

The pull-up resistor connects to whatever voltage you want the logic-high to be - independent of the IC’s own supply voltage.

Consider a 3.3 V microcontroller driving a legacy 5 V peripheral that needs a 5 V logic-high to recognise a valid signal. With a push-pull output, the micro drives its high to 3.3 V. That may not meet the 5 V device’s input threshold.

With an open-drain output on the 3.3 V device and a pull-up resistor to 5 V, the line sits at 5 V when released and is pulled to GND by the 3.3 V device when asserted. The 3.3 V device’s transistor only ever sees GND on its drain when it is on - the pull-up resistor handles the high-side voltage entirely.

open-drain as a logic level shift-up from 3.3 to 5V

Don’t be naive though. When the transistor is off, its drain is floating up to the pull-up voltage. The transistor is not conducting, but the rail voltage is still present at the drain. A 3.3 V logic-level IC pulled up to 12 V is almost certainly out-of-spec, regardless of how low the current is.

Before choosing the pull-up voltage, check two things in the datasheet: the output pin’s maximum rated voltage (sometimes labelled as an I/O absolute maximum, sometimes a dedicated open-drain output voltage spec), and whether the device is explicitly described as tolerant of higher voltages. “Open-drain” means the device will not actively drive the high side - it does not mean the output transistor can withstand an arbitrarily high drain voltage.


Why Comparator Outputs Are Often Open Drain

You will notice that many dedicated comparator ICs (eg. LM393) specify an open-drain (or open-collector) output, even though in your textbook a comparator output swings between the rails just like a rail-to-rail op-amp.

This is deliberate. Comparators are commonly used to interface between different voltage domains, to drive indicator LEDs directly, or to have multiple comparator outputs wire-ANDed for window detection circuits. An open-drain output makes all of these applications straightforward, at the tiny cost of adding one external resistor.

window comparators make use of the open-drain output to create an elegant voltage sensing solution


Trade-Offs to Manage: Speed and Power

Driving the output passively-high through a resistor does have some caveats:

Rise time is set by R × C, where C is the total capacitance on the net: trace capacitance, input capacitances of every connected device, ESD structures. A large pull-up resistor means a slow rise time. On a fast bus this causes signal integrity problems. In FSAE most logic signals are used for status/error detection so this is generally not a big deal.

Quiescent current flows through the pull-up whenever the line is held low. A low value pull-up means more current wasted every time a device asserts the line.

These two caveats are usually not a deal breaker, since logic signals in an FSAE build are usually capturing the status of a system eg. BSPD checking brake pressure plausibility is not a 1MHz signal that needs accurate capture. It would be remiss to not include at least some discussion about these tradeoffs though - keep them in the back of your mind if you’re going down a troubleshooting rabbit hole.


Summary

Push-PullOpen-Drain
High-side driverActive transistor inside ICExternal pull-up resistor
Drive strength (high)Strong, fastDetermined by R and C
Drive strength (low)Strong, fastStrong, fast
Wire multiple outputs togetherNo! shoot-through!Yes
Logic-high voltageSet by IC supplySet by pull-up voltage
Typical useStandalone signal driverStandalone, Shared bus, level translation

Related Blocks