微控制器IO引腳驅動能力的提高
早期的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。
微控制器的輸出特性和很多常用的LSTTL器件的輸出特性是相同的,都有灌電流較大的特點。
實際上,現在常用的微控制器IO引腳驅動能力,就和早期的微控制器增加了“匯流排驅動晶片”的效果基本是相同的。現在的微控制器輸出低電平的時候,就已經可以直接驅動LED發光了。
上述的數值,也並非是不可逾越的破壞性極限數值。
當略超過這些數值範圍的時候,微控制器IO引腳的電壓,就會發生變化,造成“高電平不高”、“低電平不低”,這就會縮小外接器件的噪聲容限。如果環境再稍有干擾,外接器件就無法正確判定微控制器送來的高、低電平,將會胡亂動作。
==================================
為了合理利用IO引腳的低電平能力強的特點,在外接耗電較大的器件(如LED數碼顯示器、繼電器等)的時候,應該優先選用低電平輸出來驅動外部器件。使用IO口輸出高電平驅動負載,就是一個錯誤的選擇。
下圖是一個直接利用微控制器IO引腳驅動LED的電路。
圖中P0口使用低電平驅動方式,只要加上約1K的限流電阻即可,甚至不需要常見的P0口上拉電阻。發光的段,每個引腳灌電流約為3mA,不發光的段,電流為0。即使各個段全都發光,電流也不超過P0所容許的電流,這是一個合理的驅動方式。
圖中P3口使用了高電平驅動方式,這就必須加上上拉電阻來幫助IO介面輸出電流。電阻也採用了1K,發光的段,LED上的電流約為3mA,不發光的段,電流則為5mA,灌入了微控制器的IO引腳。
這種電路,給微控制器IO引腳帶來了很大的電流,一個8位的介面最大有可能被灌入40mA的電流,遠遠超過了容許的數值。
上拉電阻能夠增加大量不需要的電流,不僅會造成微控制器工作不穩定,還會導致電源效率的嚴重下降,發熱,紋波增大。這說明,高電平輸出、加上拉電阻,就是一個不合理的驅動方式。
如果只是一個引腳的電流取值稍大一些,還算可以;但是綜合考慮一個8位的介面,則每個引腳的電流就不要大於2~3mA。
這樣來看,上拉電阻最小應該在1.8K~2.5K之間,不宜再小,以免總電流超過介面所容許的電流。
在網上看到一篇“51微控制器P0口上拉電阻的深入研究”的文章(http://hi.baidu.com/20070210030205/blog/item/95e5ab83a62d089df703a649.html),
對上拉電阻的最小選擇,寫的很低,甚至說可以選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。
不同廠家的產品,引數會稍有不同。
==================================
下面以常見的繼電器為負載繼續說明驅動方法。繼電器線圈的驅動電流往往要有40mA以上,微控制器的引腳肯定是不能承受了,必須用三極體來擴充輸出能力。
+5V的大電流負載,用8550(PNP型)驅動電路可見下圖。
P3.7輸出低電平的時候,在R1中形成Ib約有2mA,經過8550的放大,Ic足夠驅動繼電器了。
用這個電路,不僅可以驅動繼電器,也驅動蜂鳴器、揚聲器、多個LED等等,甚至驅動小型的直流電機,也是可以的。
一般來說,電機的工作電流要大一些,只要不超過8550可以輸出的最大電流是1500mA即可。驅動電機時,圖中電阻R1的取值應該再小一些。
此種電路經過多位網友的驗證,連結之一如下:
http://zhidao.baidu.com/question/126746121.html?fr=qrl&cid=203&index=3
==================================
用這個電路,可以各種大電流負載,但是做而論道為什麼單單要用繼電器,來說明問題呢?
因為在網上,發現很多不適當的繼電器驅動電路,比如:
http://hi.baidu.com/xu331019485/blog/item/4a7e548dd9e5871ab21bba7d.html
http://hi.baidu.com/wangnizone/blog/item/1cf31594733bd717d31b70b4.html
http://hi.baidu.com/brave%5Fxixi/blog/item/b18a133d81f6ec04baa16718.html
http://hi.baidu.com/x378719409/blog/item/f2bec611de89157bca80c488.html
這些電路都是一個特點,即使用了射極輸出電路結構。射極輸出電路要求輸入的動態範圍要大,而且輸出的電壓範圍永遠比輸入小0.7V。射極輸出電路就不能有效的利用+5V的電源,實際上,加到繼電器上的電壓,不足+4V,除非是使用4V的繼電器,否則這就是不穩定的隱患。
做而論道給出的電路是共射極結構,有電壓放大能力,所以對輸入的要求較低,輸出動態範圍大。
==================================
對於大於+5V的負載,如+12V,上面的電路就不行了。
如果只是簡單的把電源由+5V改為+12V,那麼微控制器輸出的高、低電平,還是隻有0~5V的變化幅度,這對8550射極的+12V來說,都是低電平。8550將不能截止。
對於大於+5V的負載,只能使用NPN型的8050三極體來驅動,先微控制器以輸出高電平來驅動。電路如下。
上述的電路,完全可以工作,也經過了多位網友的驗證,連結之一如下:
http://zhidao.baidu.com/question/132323883.html
==================================
在上述電路中,上拉電阻R2也會帶來無謂的電流,其害處前面已經討論過。
更重要的缺點是:在開機微控制器復位後,自然輸出的高電平,會使繼電器吸合,或者是使電機轉動。(使用ULN2003等晶片擴充輸出電流的時候,也存在這個問題。)
雖然程式設計的時候,可以先進行介面的初始化,令其馬上就輸出0。但是每次開機,還是會有瞬間的大電流衝擊,這往往是不允許的。
改進一下,可以再加上個8550,進行倒相,這就可以讓微控制器用輸出低電平來驅動負載。
上圖中倒相用的8550,也可以使用“光耦”器件,這樣一來,又增加了電氣隔離的功能,這就是最完美的微控制器輸出驅動電路。電路見下圖。
圖中的4N25經過實際測量,當LED的電流大於等於4.5mA時,輸出端的光電管即可為Q4提供足夠的基極電流。所以圖中的R3,可以使用810~1K的電阻。
==================================
上述的各個電路,都是以擴充微控制器的輸出電流為主題。其實,很多數字IC的輸出端,都存在擴充電流輸出能力的問題,這裡給出的電路,是普遍適用的。
這裡介紹的8050/8550可以輸出1500mA的電流,如果要求更大的輸出電流,一種方法更換三極體,另外也可以使用專用大功率驅動器件,如L298,固態繼電器,IGBT等等。這些器件做而論道都使用過,等以後再給大家介紹。