單片機(jī)I/O口推挽輸出與開漏輸出的區(qū)別
推挽(push-pull):推挽輸出的器件是指輸出腳內(nèi)部集成有一對互補(bǔ)的MOSFET,當(dāng)Q1導(dǎo)通、Q2截止時輸出高電平;而當(dāng)Q1截止導(dǎo)通、Q2導(dǎo)通時輸出低電平。一個導(dǎo)通另一個就截止。
集電極開路:輸出端相當(dāng)于孤立三極管的集電極. 要得到高電平狀態(tài)需要上拉電阻才行. 適合于做電流型的驅(qū)動,其吸收電流的能力相對強(qiáng)(一般20ma以內(nèi))。
1集電極開路輸出的結(jié)構(gòu)
1> 如圖1所示,右邊的那個三極管集電極什么都不接,所以叫做集電極開路(左邊的三極管為反相之用,使輸入為“0”時,輸出也為“0”)。對于圖1,當(dāng)左端的輸入為“0”時,前面的三極管截止(即集電極C跟發(fā)射極E之間相當(dāng)于斷開),所以5V電源通過1K電阻加到右邊的三極管上,右邊的三極管導(dǎo)通(即相當(dāng)于一個開關(guān)閉合);當(dāng)左端的輸入為“1”時,前面的三極管導(dǎo)通,而后面的三極管截止(相當(dāng)于開關(guān)斷開)。
我們將圖1簡化成圖2的樣子。圖2中的開關(guān)受軟件控制,“1”時開關(guān)閉合時,輸出直接接地,所以輸出電平為0。"0"時當(dāng)開關(guān)斷開時,則輸出端懸空了,即高阻態(tài)(順便了解下高阻態(tài))。這時電平狀態(tài)未知,如果后面一個電阻負(fù)載(即使很輕的負(fù)載)到地,那么輸出端的電平就被這個負(fù)載拉到低電平了,所以這個電路是不能輸出高電平的。
2> 圖三是集電極開路加上拉電阻的情況。圖三中那個1k的電阻即是上拉電阻。如果開關(guān)閉合,則有電流從1k電阻及開關(guān)上流過,但由于開關(guān)閉和時電阻為0(方便我們的討論,實際情況中開關(guān)電阻不為0,另外對于三極管還存在飽和壓降),所以在開關(guān)上的電壓為0,即輸出電平為0。如果開關(guān)斷開,則由于開關(guān)電阻為無窮大(同上,不考慮實際中的漏電流),所以流過的電流為0,因此在1k電阻上的壓降也為0,所以輸出端的電壓就是5v了,這樣就能輸出高電平了。
關(guān)于上拉電阻的選擇問題。我們從圖三知道,這個輸出的內(nèi)阻是比較大的(即1kω),如果接一個電阻為r的負(fù)載,通過分壓計算,就可以算得最后的輸出電壓為5*r/(r+1000)伏,即5/(1+1000/r)伏。所以,如果要達(dá)到一定的電壓的話,r就不能太小。如果r真的太小,而導(dǎo)致輸出電壓不夠的話,那我們只有通過減小那個1k的上拉電阻來增加驅(qū)動能力。但是,上拉電阻又不能取得太小,因為當(dāng)開關(guān)閉合時,將產(chǎn)生電流,由于開關(guān)能流過的電流是有限的,因此限制了上拉電阻的取值,另外還需要考慮到,當(dāng)輸出低電平時,負(fù)載可能還會給提供一部分電流從開關(guān)流過,因此要綜合這些電流考慮來選擇合適的上拉電阻。
如果我們將一個讀數(shù)據(jù)用的輸入端接在輸出端,這樣就是一個io口了(51的io口就是這樣的結(jié)構(gòu),其中p0口內(nèi)部不帶上拉,而其它三個口帶內(nèi)部上拉),當(dāng)我們要使用輸入功能時,只要將輸出口設(shè)置為1即可,這樣就相當(dāng)于那個開關(guān)斷開,而對于p0口來說,就是高阻態(tài)了。
3> 對于漏極開路(OD)輸出,跟集電極開路輸出是十分類似的。將上面的三極管換成場效應(yīng)管即可。這樣集電極就變成了漏極,OC就變成了OD,原理分析是一樣的。
2 推挽輸出
推挽輸出的結(jié)構(gòu)就是把上面的上拉電阻也換成一個開關(guān),當(dāng)要輸出高電平時,上面的開關(guān)通,下面的開關(guān)斷;而要輸出低電平時,則剛好相反。比起OC或者OD來說,這樣的推挽結(jié)構(gòu)高、低電平驅(qū)動能力都很強(qiáng)。如果兩個輸出不同電平的輸出口接在一起的話,就會產(chǎn)生很大的電流,有可能將輸出口燒壞。而上面說的OC或OD輸出則不會有這樣的情況,因為上拉電阻提供的電流比較小。如果是推挽輸出的要設(shè)置為高阻態(tài)時,則兩個開關(guān)必須同時斷開(或者在輸出口上使用一個傳輸門),這樣可作為輸入狀態(tài),AVR單片機(jī)的一些IO口就是這種結(jié)構(gòu)。
一般情況下我們在電路設(shè)計編程過程中設(shè)置單片機(jī),大多是按照固有的模式去做的,做了幾年這一行了,也沒碰到過什么問題。昨天就遇到了這樣一個問題,電路結(jié)構(gòu)如圖一,在這種情況下STC單片機(jī)與410單片機(jī)通訊是沒問題的但是與PC就無法通訊了,STC收不到PC的命令,以前410的位置是用的STC的片子一直沒問題,我想也許是驅(qū)動能力不夠,在410TX端加了上拉,不過沒起作用。用示波器監(jiān)視串口得到面的波形如圖二:
這說明sp3232下拉得不夠,于是加了下拉,還是沒起作用。又把410端口內(nèi)部的上拉去掉,結(jié)果還是一樣。最后請教老師,在410程序里將TX的工作方式由推挽式改為開漏式,一切ok~!
附另外一篇文章:http://www.9mcu.com/9mcubbs/forum.php?mod=viewthread&tid=1353講的也挺好
GPIO的推挽輸出和開漏輸出(open-drain與push-pull)
GPIO的功能,簡單說就是可以根據(jù)自己的需要去配置為輸入或輸出。但是在配置GPIO管腳的時候,常會見到兩種模式:開漏(open-drain,漏極開路)和推挽(push-pull)。
對此兩種模式,有何區(qū)別和聯(lián)系,下面整理了一些資料,來詳細(xì)解釋一下:
圖表 1 Push-Pull對比Open-Drain
對于GPIO的模式的設(shè)置,在不考慮是否需要額外的上拉電阻的情況下,是設(shè)置為open-drain還是push-pull,說到底,還是個權(quán)衡的問題:
如果你想要電平轉(zhuǎn)換速度快的話,那么就選push-pull,但是缺點(diǎn)是功耗相對會大些。
如果你想要功耗低,且同時具有“線與”的功能,那么就用open-drain的模式。(同時注意GPIO硬件模塊內(nèi)部是否有上拉電阻,如果沒有,需要硬件電路上添加額外的上拉電阻)
正所謂,轉(zhuǎn)換速度與功耗,是魚與熊掌,二則不可兼得焉。
擴(kuò)展閱讀:PIC單片機(jī)的抗干擾能力強(qiáng)還是AVR單片機(jī)的強(qiáng)?
編輯:admin 最后修改時間:2018-05-22