早期的51單片機,驅動能力很低。P1、P2和P3口只能驅動3個LSTTL輸入端,P0口可驅動8個。如果想要驅動更多的器件,就要用到“總線驅動芯片”。經常用的就是74LS244(單向)和74LS245(雙向)。
現在常用的 AT89C51 單片機引腳的輸出能力已經大多了,從 PDF 手冊文件中可查出:
單片機輸出低電平的時候,單個的引腳,向引腳灌入的最大電流為 10 mA;
一個 8 位的接口(P1、P2 以及 P3),灌入的總電流最大為 15 mA,P0 允許灌入的最大總電流為 26 mA;
全部的四個接口所允許的灌電流之和,最大為 71 mA。
但是當引腳輸出高電平的時候,它們的“拉電流”能力可就差多了,竟然還不到 1 mA。
單片機的輸出特性和很多常用的LS系列TTL器件的輸出特性是相同的,都有灌電流較大的特點。
實際上,現在常用的單片機IO引腳驅動能力,就和早期的單片機增加了“總線驅動芯片”的效果基本是相同的?,F在的單片機輸出低電平的時候,就已經可以直接驅動LED發(fā)光了。
上述的數值,也并非是不可逾越的破壞性極限數值。當略超過這些數值范圍的時候,單片機IO引腳的電壓,就會發(fā)生變化,造成“高電平不高”、“低電平不低”,這就會縮小外接器件的噪聲容限。如果環(huán)境再稍有干擾,外接器件就無法正確判定單片機送來的高、低電平,將會胡亂動作。
==================================
為了合理利用IO引腳的低電平能力強的特點,在外接耗電較大的器件(如LED數碼顯示器、繼電器等)的時候,應該優(yōu)先選用低電平輸出來驅動外部器件。使用IO口輸出高電平驅動負載,就是一個錯誤的選擇。
下圖是一個直接利用單片機IO引腳驅動LED的電路。
圖中P0口使用低電平驅動方式,只要加上約1K的限流電阻即可,甚至不需要常見的P0口上拉電阻。發(fā)光的段,每個引腳灌電流約為3mA,不發(fā)光的段,電流為0。即使各個段全都發(fā)光,電流也不超過P0所容許的電流,這是一個合理的驅動方式。
圖中P3口使用了高電平驅動方式,這就必須加上上拉電阻來幫助IO接口輸出電流。電阻也采用了1K,發(fā)光的段,LED上的電流約為3mA,不發(fā)光的段,電流則為5mA,灌入了單片機的IO引腳。
這種電路,給單片機IO引腳帶來了很大的電流,一個8位的接口最大有可能被灌入40mA的電流,遠遠超過了容許的數值。上拉電阻能夠增加大量不需要的電流,不僅會造成單片機工作不穩(wěn)定,還會導致電源效率的嚴重下降,發(fā)熱,紋波增大。這說明,高電平輸出、加上拉電阻,就是一個不合理的驅動方式。
如果只是一個引腳的電流取值稍大一些,還算可以;但是綜合考慮一個8位的接口,則每個引腳的電流就不要大于2~3mA。這樣來看,上拉電阻最小應該在1.8K~2.5K之間,不宜再小,以免總電流超過接口所容許的電流。
在網上看到一篇“51單片機P0口上拉電阻的深入研究”的文章,對上拉電阻的最小選擇,寫的很低,甚至說可以選200歐姆!呵呵,這會燒毀單片機引腳的。
==================================
驅動更大電流的負載,可以使用三極管來擴充電流,也可使用集成芯片ULN2003(或ULN2008),另外也可使用專用的驅動器件L298、各種型號的IGBT等等。
集成芯片的引腳比較密集,維修檢查較困難,更換的時候更是不便。做而論道比較喜歡使用三極管,它的耐壓和電流承受能力都遠遠超過集成芯片,在PCB上布線也很靈活方便。
8550(PNP)和8050(NPN):它們是一組可以配對使用的三極管,特點是集電極允許的電流很大,Icm竟然能達到1500mA!而且還不需要使用散熱片。它們的集電極反向擊穿電壓BVceo為25V,Pcm為0.5W。
2N5401(PNP)和2N5551(NPN):它們也是一組可以配對使用的三極管,它們的特點是耐壓比較高,集電極反向擊穿電壓BVceo可達160V!它們的最大集電極電流Icm為0.6A,Pcm為0.6W。
不同廠家的產品,參數會稍有不同。
==================================
下面以常見的繼電器為負載繼續(xù)說明驅動方法。繼電器線圈的驅動電流往往要有40mA以上,單片機的引腳肯定是不能承受了,必須用三極管來擴充輸出能力。
+5V的大電流負載,用8550(PNP型)驅動電路可見下圖。
P3.7輸出低電平的時候,在R1中形成Ib約有2mA,經過8550的放大,Ic足夠驅動繼電器了。
用這個電路,不僅可以驅動繼電器,也驅動蜂鳴器、揚聲器、多個LED等等,甚至驅動小型的直流電機,也是可以的。一般來說,電機的工作電流要大一些,只要不超過8550可以輸出的最大電流是1500mA即可。驅動電機時,圖中電阻R1的取值應該再小一些。
==================================
用這個電路,可以各種大電流負載,但是做而論道為什么單單要用繼電器,來說明問題呢?
因為在網上,發(fā)現很多不適當的繼電器驅動電路,這些電路都是一個特點,即使用了射極輸出電路結構。射極輸出電路要求輸入的動態(tài)范圍要大,而且輸出的電壓范圍永遠比輸入小0.7V。射極輸出電路就不能有效的利用+5V的電源,實際上,加到繼電器上的電壓,不足+4V,除非是使用4V的繼電器,否則這就是不穩(wěn)定的隱患。
做而論道給出的電路是共射極結構,有電壓放大能力,所以對輸入的要求較低,輸出動態(tài)范圍大。
==================================
對于大于+5V的負載,如+12V,上面的電路就不行了。
如果只是簡單的把電源由+5V改為+12V,那么單片機輸出的高、低電平,還是只有0~5V的變化幅度,這對8550射極的+12V來說,都是低電平。8550將不能截止。
對于大于+5V的負載,只能使用NPN型的8050三極管來驅動,先以單片機輸出高電平來驅動。電路如下:
==================================
在上述電路中,上拉電阻R2也會帶來無謂的電流,其害處前面已經討論過。
更重要的缺點是:在開機單片機復位后,自然輸出的高電平,會使繼電器吸合,或者是使電機轉動。(使用ULN2003等芯片擴充輸出電流的時候,也存在這個問題。)
雖然編程的時候,可以先進行接口的初始化,令其馬上就輸出0。但是每次開機,還是會有瞬間的大電流沖擊,這往往是不允許的。
改進一下,可以再加上個8550,進行倒相,這就可以讓單片機用輸出低電平來驅動負載。
上圖中倒相用的8550,也可以使用“光耦”器件,這樣一來,又增加了電氣隔離的功能,這就是最完美的單片機輸出驅動電路。電路見下圖。
圖中的4N25經過實際測量,當LED的電流大于等于4.5mA時,輸出端的光電管即可為Q4提供足夠的基極電流。所以圖中的R3,可以使用810~1K的電阻。
==================================
上述的各個電路,都是以擴充單片機的輸出電流為主題。其實,很多數字IC的輸出端,都存在擴充電流輸出能力的問題,這里給出的電路,是普遍適用的。
這里介紹的8050/8550可以輸出1500mA的電流,如果要求更大的輸出電流,一種方法更換三極管,另外也可以使用專用大功率驅動器件,如L298,固態(tài)繼電器,IGBT等等