1. 程式人生 > >微控制器I/O口推輓輸出與開漏輸出的區別(open-drain與push-pull)

微控制器I/O口推輓輸出與開漏輸出的區別(open-drain與push-pull)

推輓(push-pull):推輓輸出的器件是指輸出腳內部整合有一對互補的MOSFET,當Q1導通、Q2截止時輸出高電平;而當Q1截止導通、Q2導通時輸出低電平。一個導通另一個就截止。

集電極開路:輸出端相當於孤立三極體的集電極. 要得到高電平狀態需要上拉電阻才行. 適合於做電流型的驅動,其吸收電流的能力相對強(一般20ma以內)。

       1集電極開路輸出的結構

       1>  如圖1所示,右邊的那個三極體集電極什麼都不接,所以叫做集電極開路(左邊的三極體為反相之用,使輸入為“0”時,輸出也為“0”)。對於圖1,當左端的輸入為“0”時,前面的三極體截止(即集電極C跟發射極E之間相當於斷開),所以5V電源通過1K電阻加到右邊的三極體上,右邊的三極體導通(即相當於一個開關閉合);當左端的輸入為“1”時,前面的三極體導通,而後面的三極體截止(相當於開關斷開)。

微控制器IO口設定推輓和開漏的區別 - 冷水泡茶 - 冷水泡茶

 

我們將圖1簡化成圖2的樣子。圖2中的開關受軟體控制,“1”時開關閉合時,輸出直接接地,所以輸出電平為0。"0"時當開關斷開時,則輸出端懸空了,即高阻態(順便了解下高阻態)。這時電平狀態未知,如果後面一個電阻負載(即使很輕的負載)到地,那麼輸出端的電平就被這個負載拉到低電平了,所以這個電路是不能輸出高電平的。

2> 圖三是集電極開路加上拉電阻的情況。圖三中那個1k的電阻即是上拉電阻。如果開關閉合,則有電流從1k電阻及開關上流過,但由於開關閉和時電阻為0(方便我們的討論,實際情況中開關電阻不為0,另外對於三極體還存在飽和壓降),所以在開關上的電壓為0,即輸出電平為0

如果開關斷開,則由於開關電阻為無窮大(同上,不考慮實際中的漏電流),所以流過的電流為0,因此在1k電阻上的壓降也為0,所以輸出端的電壓就是5v了,這樣就能輸出高電平了

        關於上拉電阻的選擇問題。我們從圖三知道,這個輸出的內阻是比較大的(即1kω),如果接一個電阻為r的負載,通過分壓計算,就可以算得最後的輸出電壓為5*r/(r+1000)伏,即5/(1+1000/r)伏。所以,如果要達到一定的電壓的話,r就不能太小。如果r真的太小,而導致輸出電壓不夠的話,那我們只有通過減小那個1k的上拉電阻來增加驅動能力。但是,上拉電阻又不能取得太小,因為當開關閉合時,將產生電流,由於開關能流過的電流是有限的,因此限制了上拉電阻的取值,另外還需要考慮到,當輸出低電平時,負載可能還會給提供一部分電流從開關流過,因此要綜合這些電流考慮來選擇合適的上拉電阻。

如果我們將一個讀資料用的輸入端接在輸出端,這樣就是一個io口了(51的io口就是這樣的結構,其中p0口內部不帶上拉,而其它三個口帶內部上拉),當我們要使用輸入功能時,只要將輸出口設定為1即可,這樣就相當於那個開關斷開,而對於p0口來說,就是高阻態了。

3> 對於漏極開路(OD)輸出,跟集電極開路輸出是十分類似的。將上面的三極體換成場效電晶體即可。這樣集電極就變成了漏極,OC就變成了OD,原理分析是一樣的。

2 推輓輸出

推輓輸出的結構就是把上面的上拉電阻也換成一個開關,當要輸出高電平時,上面的開關通,下面的開關斷;而要輸出低電平時,則剛好相反。比起OC或者OD來說,這樣的推輓結構高、低電平驅動能力都很強。如果兩個輸出不同電平的輸出口接在一起的話,就會產生很大的電流,有可能將輸出口燒壞。而上面說的OC或OD輸出則不會有這樣的情況,因為上拉電阻提供的電流比較小。如果是推輓輸出的要設定為高阻態時,則兩個開關必須同時斷開(或者在輸出口上使用一個傳輸門),這樣可作為輸入狀態,AVR微控制器的一些IO口就是這種結構。

一般情況下我們在電路設計程式設計過程中設定微控制器,大多是按照固有的模式去做的,做了幾年這一行了,也沒碰到過什麼問題。昨天就遇到了這樣一個問題,電路結構如圖一,在這種情況下STC微控制器與410微控制器通訊是沒問題的但是與PC就無法通訊了,STC收不到PC的命令,以前410的位置是用的STC的片子一直沒問題,我想也許是驅動能力不夠,在410TX端加了上拉,不過沒起作用。用示波器監視串列埠得到面的波形如圖二:

這說明sp3232下拉得不夠,於是加了下拉,還是沒起作用。又把410埠內部的上拉去掉,結果還是一樣。最後請教老師,在410程式裡將TX的工作方式由推輓式改為開漏式,一切ok~!

 

附另外一篇文章:http://www.9mcu.com/9mcubbs/forum.php?mod=viewthread&tid=1353講的也挺好

 

GPIO的推輓輸出和開漏輸出(open-drain與push-pull) 


GPIO的功能,簡單說就是可以根據自己的需要去配置為輸入或輸出。但是在配置GPIO管腳的時候,常會見到兩種模式:開漏(open-drain,漏極開路)和推輓(push-pull)。

對此兩種模式,有何區別和聯絡,下面整理了一些資料,來詳細解釋一下:

 

 

圖表 1 Push-Pull對比Open-Drain

 

  Push-Pull推輓輸出 Open-Drain開漏輸出
原理 輸出的器件是指輸出腳內部整合有一對互補的MOSFET,當Q1導通、Q2截止時輸出高電平;而當Q1截止導通、Q2導通時輸出低電平 開漏電路就是指以MOSFET的漏極為輸出的電路。指內部輸出和地之間有個N溝道的MOSFET(Q1),這些器件可以用於電平轉換的應用。輸出電壓由Vcc'決定。Vcc'可以大於輸入高電平電壓VCC(up-translate)也可以低於輸入高電平電壓VCC(down-translate)。
某老外的更加透徹的解釋 Push-pull輸出,實際上內部是用了兩個電晶體(transistor),此處分別稱為top transistor和bottom transistor。通過開關對應的電晶體,輸出對應的電平。top transistor開啟(bottom transistor關閉),輸出為高電平;bottom transistor開啟(top transistor關閉),輸出低電平。Push-pull即能夠漏電流(sink current),又可以集電流(source current)。其也許有,也許沒有另外一個狀態:高阻抗(high impedance)狀態。除非Push-pull需要支援額外的高阻抗狀態,否則不需要額外的上拉電阻。 Open-drain輸出,則是比push-pull少了個top transistor,只有那個bottom transistor。(就像push-pull中的那樣)當bottom transistor關閉,則輸出為高電平。此處沒法輸出高電平,想要輸出高電平,必須外部再接一個上拉電阻(pull-up resistor)。Open-drain只能夠漏電流(sink current),如果想要集電流(source current),則需要加一個上拉電阻。
常見的GPIO的模式可以配置為open-drain或push-pull,具體實現上,常為通過配置對應的暫存器的某些位來配置為open-drain或是push-pull。當我們通過CPU去設定那些GPIO的配置暫存器的某位(bit)的時候,其GPIO硬體IC內部的實現是,會去開啟或關閉對應的top transistor。相應地,如果設定為了open-d模式的話,是需要上拉電阻才能實現,也能夠輸出高電平的。因此,如果硬體內部(internal)本身包含了對應的上拉電阻的話,此時會去關閉或開啟對應的上拉電阻。如果GPIO硬體IC內部沒有對應的上拉電阻的話,那麼你的硬體電路中,必須自己提供對應的外部(external)的上拉電阻。而push-pull輸出的優勢是速度快,因為線路(line)是以兩種方式驅動的。而帶了上拉電阻的線路,即使以最快的速度去提升電壓,最快也要一個常量的R×C的時間。其中R是電阻,C是寄生電容(parasitic capacitance),包括了pin腳的電容和板子的電容。但是,push-pull相對的缺點是往往需要消耗更多的電流,即功耗相對大。而open-drain所消耗的電流相對較小,由電阻R所限制,而R不能太小,因為當輸出為低電平的時候,需要sink更低的transistor,這意味著更高的功耗。(此段原文:because the lower transistor has to sink that current when the output is low; that means higher power consumption.)而open-drain的好處之一是,允許你cshort(?)多個open-drain的電路,公用一個上拉電阻,此種做法稱為wired-OR連線,此時可以通過拉低任何一個IO的pin腳使得輸出為低電平。為了輸出高電平,則所有的都輸出高電平。此種邏輯,就是“線與”的功能,可以不需要額外的門(gate)電路來實現此部分邏輯。
原理圖 圖表 2 push-pull原理圖 圖表 3 open-drain原理圖
 

圖表 4 open-drain“線與”功能
優點 (1)可以吸電流,也可以貫電流;(2)和開漏輸出相比,push-pull的高低電平由IC的電源低定,不能簡單的做邏輯操作等。 (1)
對於各種電壓節點間的電平轉換非常有用,可以用於各種電壓節點的Up-translate和down-translate轉換
(2)可以將多個開漏輸出的Pin腳,連線到一條線上,形成“與邏輯”關係,即“線與”功能,任意一個變低後,開漏線上的邏輯就為0了。這也是I2C,SMBus等匯流排判斷匯流排佔用狀態的原理。(3)利用 外部電路的驅動能力,減少IC內部的驅動。當IC內部MOSFET導通時,驅動電流是從外部的VCC流經R pull-up ,MOSFET到GND。IC內部僅需很下的柵極驅動電流。(4)可以利用改變上拉電源的電壓,改變傳輸電平:圖表 5 open-drain輸出電平的原理
IC的邏輯電平由電源Vcc1決定,而輸出高電平則由Vcc2決定。這樣我們就可以用低電平邏輯控制輸出高電平邏輯了。
缺點 一條總線上只能有一個push-pull輸出的器件;
開漏Pin不連線外部的上拉電阻,則只能輸出低電平。當輸出電平為低時,N溝道三極體是導通的,這樣在Vcc'和GND之間有一個持續的電流流過上拉電阻R和三極體Q1。這會影響整個系統的功耗。採用較大值的上拉電阻可以減小電流。但是,但是大的阻值會使輸出訊號的上升時間變慢。即上拉電阻R pull-up的阻值 決定了邏輯電平轉換的沿的速度
。阻值越大,速度越低功耗越小。反之亦然。
特點 在CMOS電路里面應該叫CMOS輸出更合適,因為在CMOS裡面的push-pull輸出能力不可能做得雙極那麼大。輸出能力看IC內部輸出極N管P管的面積。push-pull是現在CMOS電路里面用得最多的輸出級設計方式。  

【open-drain和push-pull的總結】
對於GPIO的模式的設定,在不考慮是否需要額外的上拉電阻的情況下,是設定為open-drain還是push-pull,說到底,還是個權衡的問題:
如果你想要電平轉換速度快的話,那麼就選push-pull,但是缺點是功耗相對會大些。
如果你想要功耗低,且同時具有“線與”的功能,那麼就用open-drain的模式。(同時注意GPIO硬體模組內部是否有上拉電阻,如果沒有,需要硬體電路上新增額外的上拉電阻)
正所謂,轉換速度與功耗,是魚與熊掌,二則不可兼得焉。