推挽和開漏是單片機的輸出模式,屬于I/O口配置的常見類型。
開漏(Open-Drain)和推挽(Push-Pull)是兩種根本不同的輸出電路結構,理解它們的區別是正確使用任何單片機(包括51和STM32)GPIO的關鍵。
一、核心比喻
推挽輸出 (Push-Pull):就像兩個人力氣很大的水手,一個專門負責從井里打水(推,輸出高電平),另一個專門負責把水倒掉(挽,輸出低電平)。他們能主動且有力地輸出明確的“有水”(1)或“沒水”(0)狀態。
形象:雙向主動,驅動能力強。
開漏輸出 (Open-Drain):就像只有一個負責倒水的水手,他能很用力地把水倒掉(輸出強低電平0),但他完全不會打水。當他不倒水時,輸出狀態是懸空的(高阻態),相當于“不表態”。這個“不表態”的狀態需要外部一個上拉電阻拉到“有水”(1)的狀態,才能真正形成高電平。
形象:只能主動拉低,不能主動拉高,需要外部幫助。
二、電路原理與區別
為了更直觀地理解,可以參考下面的簡化電路模型:
如圖所示,它們的根本區別在于:
推挽:內部有上下兩個MOS管,總是處于一個導通另一個截止的狀態,因此可以獨立、強效地輸出高電平和低電平。
開漏:內部只有下拉的MOS管(NMOS)。當這個管子導通時,輸出被強力拉到低電平(GND);當它截止時,輸出引腳與地斷開(“開路”或“漏極開路”),相當于斷開狀態,其電平由外部電路決定。
三、應用場景
基于以上根本區別,它們的使用場景完全不同:
什么時候用?推挽輸出?
推挽輸出是最常用的模式,用于絕大多數需要直接驅動負載和數字信號輸出的場景。
驅動LED、繼電器、蜂鳴器等器件:
因為推挽輸出高低電平均有較強的驅動能力(例如STM32引腳可輸出和吸收幾十mA電流),可以直接點亮LED或驅動小型繼電器。
數字通信協議(單向、高速):
如?SPI、I2S、USB、SDIO?等。這些協議需要清晰的、驅動能力強的波形來保證通信速度和穩定性。推挽輸出可以提供快速上升沿和下降沿。
生成PWM波:
驅動電機、舵機等都需要清晰的PWM波形,必須使用推挽輸出。
簡單總結:只要你需要引腳自己獨立、明確、有力地輸出高電平和低電平,就用推挽輸出。
什么時候用?開漏輸出?
開漏輸出主要用于需要?“線與”(Wire-AND)、電平轉換?和?雙向通信?的場景。
實現“線與”功能(最經典的用途):
多個開漏輸出的引腳可以直接連接在一起,共用一個上拉電阻。
規則:只要任何一個輸出腳主動輸出低電平(0),整個線路就是低電平(0)。只有當所有輸出腳都釋放(不輸出低電平,即高阻態)時,線路才被上拉電阻變為高電平(1)。
應用:I2C?總線是開漏輸出最典型的例子。I2C上的多個設備都可以通過拉低總線來發送信號,而不會因為一個設備輸出高電平另一個輸出低電平而產生短路沖突。這實現了多主機仲裁和雙向通信。
電平轉換(Voltage Level Shifting):
這是開漏輸出一個極其有用的特性。因為開漏引腳本身不產生高電平,高電平電壓完全由外部上拉電阻所連接的電源電壓(VCC)決定。
例子:STM32是3.3V供電,但需要和一個工作電壓為5V的設備通信。可以將STM32引腳設置為開漏模式,外部上拉電阻接到5V。當STM32輸出低電平(0)時,是0V;當STM32釋放總線(輸出1)時,線路被上拉到5V。這樣就實現了從3.3V到5V的電平轉換,非常簡單成本低。
驅動高于芯片電壓的設備:
原理同上。比如用3.3V單片機驅動一個5V的繼電器線圈,就可以使用開漏模式,外接5V上拉。
四、對比總結表
特性 | 推挽輸出 (Push-Pull) | 開漏輸出 (Open-Drain) |
---|---|---|
輸出能力 | 強,可主動輸出高電平和低電平 | 弱,只能主動輸出低電平,高電平靠外部上拉 |
輸出狀態 | 確定(永遠是0或1) | 不確定(不輸出時呈高阻態,電平由外部決定) |
速度 | 快,上升沿和下降沿都較陡峭 | 慢,上升沿依靠上拉電阻,電阻越大速度越慢 |
功耗 | 高低電平切換時存在瞬時導通電流,功耗相對較高 | 靜態功耗低,但上升沿慢可能導致動態功耗增加 |
關鍵應用 | 1. 驅動LED、繼電器等 2. SPI, I2S等高速總線 3. 產生PWM波 | 1.?I2C、One-Wire等支持“線與”的總線 2.?電平轉換 3. 驅動高于芯片電壓的設備 |
簡單決策流程:
驅動普通外設(LED、數碼管等)??->?推挽輸出
用在I2C總線上??->?開漏輸出?(注意:I2C協議必須用開漏模式!)
需要和不同電壓的器件通信??->?開漏輸出 + 外部上拉到目標電壓
不確定??-> 優先選擇推挽輸出,這是最通用和直接的模式。