也談LED驅動(dòng)
——
LED:本文所說(shuō)的LED主要是指下列幾種:
7-段數碼LED,分共陰和共陽(yáng)兩種,原理圖見(jiàn)1和2;
常用nxm LED點(diǎn)陣:如8x8 LED 點(diǎn)陣模塊、5x7 LED點(diǎn)陣模塊等,其也分為共陰和共陽(yáng)兩種;
單個(gè)LED管。
所謂共陰極,即是將所有LED的陰極連接到一起,而共陽(yáng)極則相反,所有的陽(yáng)極被連接到了一起。但不管哪種結構,其顯示設計的原理基本相同,唯一的是其驅動(dòng)的電路的設計有所差異,一般共陰極采用推(Push)電流的方式來(lái)驅動(dòng),而共陽(yáng)極結構則采用拉(Pull)電流的方式來(lái)驅動(dòng)。
根據LED顯示的硬件設計方法的不同,LED顯示驅動(dòng)分為靜態(tài)法和動(dòng)態(tài)法兩大類(lèi),其具體的說(shuō)明和編程方法分述如下:
1.靜態(tài)顯示驅動(dòng)法:
所謂靜態(tài)顯示驅動(dòng)法,即是指每一個(gè)LED燈分別對應一個(gè)獨立的IO驅動(dòng)口;其點(diǎn)亮和關(guān)閉由該IO來(lái)對其進(jìn)行控制,互不干擾,見(jiàn)圖3(注:對于IO驅動(dòng)能力弱的MCU,必須增加外部的驅動(dòng)芯片或驅動(dòng)三極管等器件)。此種設計一般應用在對單個(gè)LED的驅動(dòng)或LED數量較少,且所選的MCU IO比較充裕的情況下。比如一些項目的LED指示燈、產(chǎn)品的設計中只有一個(gè)7-段LED碼需要顯示等。
由于每一個(gè)LED均由獨立的IO口來(lái)控制,因此此種顯示驅動(dòng)的軟件設計比較簡(jiǎn)單明了,無(wú)需特別的處理,在需要點(diǎn)亮和關(guān)閉時(shí)設置相應的IO輸出口的電平即可(即“0”或“1”,具體須根據驅動(dòng)電路的設計來(lái)決定)。
圖 3
優(yōu)點(diǎn):電路設計簡(jiǎn)單,編程簡(jiǎn)單,而且LED的亮度控制容易,只需在驅動(dòng)端增加相應的電流調節電阻即可方便地實(shí)現亮度的調節(對于存在獨立驅動(dòng)的設計,還可以通過(guò)調整驅動(dòng)電壓來(lái)達到亮度的調節)。
缺點(diǎn):由于每一個(gè)LED燈需要一個(gè)IO口,因此對IO口的需求較大,不易實(shí)現大數量的LED驅動(dòng)和顯示,擴展性能差。
2. 動(dòng)態(tài)的顯示驅動(dòng)法:
與靜態(tài)顯示方法不同,動(dòng)態(tài)LED顯示的設計方法是將不同LED模塊的所有的LED的驅動(dòng)端一對一地連接到一起,見(jiàn)圖4,而將其公共極(陰極或陽(yáng)極)分別由不同的IO口來(lái)驅動(dòng)(主要針對7-段碼和LED點(diǎn)陣模塊)。在此,我們稱(chēng)其公共極為掃描線(xiàn)或地址線(xiàn)(因此種連接方法類(lèi)似于存儲器的內部連接,每個(gè)LED點(diǎn)相當與Memory中的一個(gè)Bit),不同的LED模塊(類(lèi)似于Memory中的一個(gè)Byte)用不同的掃描線(xiàn)地址線(xiàn)來(lái)進(jìn)行選定。
由于所有的LED模塊公用了驅動(dòng)端,因此LED的驅動(dòng)不再像靜態(tài)法一樣為每個(gè)LED所獨享,因此其驅動(dòng)的設計方法也與靜態(tài)法完全不同,需要采用分時(shí)掃描(也稱(chēng)動(dòng)態(tài)掃描)方法來(lái)實(shí)現對所有LED的顯示驅動(dòng),其原理如下(以圖4為例):
a. 將A0設置為高電平,也即允許第一組LED顯示,同時(shí)將A2,A3,A4設置為低電平,也即關(guān)閉該陰極所對應的LED組的顯示;
b.在P0口輸出A0組對應的顯示數據(也稱(chēng)為Pattern),如字符點(diǎn)陣數據,7-段碼對應的數字的數據等,該數據可以通過(guò)ROM表的形式來(lái)預先定義;
c. 保持一定的時(shí)間T,該時(shí)間即為所設定定時(shí)器的中斷時(shí)間;
d. 將A0口設置為低電平,關(guān)閉A0組LED的顯示;
e.將A1設置為高電平,其他幾個(gè)設置為低電平,開(kāi)啟A1組對應的LED的顯示;
f. 在P0口輸出A1組對應的顯示數據(也稱(chēng)為Pattern,意義同上);
g.重復以上步驟,直到所有組被掃描一遍,然后又從A0組開(kāi)始下一個(gè)循環(huán),如此周而復始,實(shí)現所有LED的動(dòng)態(tài)顯示。
該方法的原理利用了人眼對物體的視覺(jué)延遲來(lái)達到所有LED的同時(shí)顯示,實(shí)際上,在每一個(gè)時(shí)刻,只有一組LED是處于顯示的狀態(tài),而其他LED組均為關(guān)閉狀態(tài)。理論上,若兩次顯示之間的時(shí)間間隔小于32ms時(shí),人眼即無(wú)法分辨,因此,為了達到此要求,LED的掃描頻率一般可按照下式計算得出:
f = 32 * N
式中,
f為掃描的頻率,對應為定時(shí)器的定時(shí)時(shí)間(T=1/f);
32 則是由32ms換算而來(lái),32ms對應的頻率剛好為 32Hz;
N則是總的LED的組數(此例中為N=4)。
根據此式算出的掃描頻率f實(shí)際上是LED 驅動(dòng)掃描的最小頻率,若低于此頻率,則有可能導致LED的閃爍。當然,f也不可能越高越好,掃描的頻率太高,相對而言,每一組LED的點(diǎn)亮的時(shí)間就越短,因此有可能導致LED的亮度不夠或顯示效果不理想等一些問(wèn)題。當然提高LED的驅動(dòng)電壓也可以彌補由此造成的亮度不夠的問(wèn)題。
此例中,由公式可知其掃描的頻率應大于等于128Hz,則較為理想。
2. MCU程序的實(shí)現:
a.模塊的劃分:
在說(shuō)明其編程之前,先說(shuō)明一下模塊化編程思想在LED驅動(dòng)設計中的應用。為了使程序的結構清晰和維護的便利,特別是為了使程序的移植等變得可行,在程序的設計過(guò)程中應盡可能地采用模塊化的設計思想,對于復雜的程序結構和功能的實(shí)現,更應該在編程之前理順其相互之間的關(guān)系,劃分好各功能模塊所應完成的功能,定義好各模塊之間的數據接口和相互關(guān)系。
一般而言,顯示部分所涉及到的內容和功能相對較廣,比如按鍵的變化、系統狀態(tài)的變化、數據的變化等均需在顯示的結果上表現出來(lái)。因此,為了保證不同的模塊之間的獨立性,我們將與LED顯示的有關(guān)的功能進(jìn)行如下的劃分:
1. 掃描驅動(dòng)模塊:此模塊的功能只完成對所有LED的掃描,而不關(guān)心所顯示的數據的具體變化情況,其從固定的顯示緩沖其中提取每一掃描地址所對應的數據,該對應關(guān)系是固定的,由程序設計時(shí)來(lái)設定。該實(shí)現的方法類(lèi)似與PC機中CRT的顯示驅動(dòng)和顯示緩沖;
2.字符、點(diǎn)陣發(fā)生器:由于實(shí)際的數據與顯示的數據(Pattern)之間并非是相同的,因此,需要將實(shí)際的數據轉化成能夠顯示的數據。例如在MCU中的各種計算的數據是以BCD碼或二進(jìn)制碼的形式來(lái)表示的,需要將其轉化成7-段碼或nxn點(diǎn)陣的Pattern數據進(jìn)行顯示;
3.顯示緩沖刷新和處理模塊:該模塊的功能是接受諸如按鍵、系統狀態(tài)變化、數據變化所引起的顯示數據的變化。其需要調用到字符、點(diǎn)陣發(fā)生器來(lái)完成顯示緩沖的刷新,其與按鍵、系統狀態(tài)變化等之間的接口是采用消息的機制來(lái)實(shí)現。該模塊一般需要根據不同的顯示內容來(lái)進(jìn)行分類(lèi),比如在跑步機的設計中,可以劃分為如下的內容:距離、速度、時(shí)間、能量消耗、心率及其他相關(guān)的數據。
b.程序架構和實(shí)現
1.掃描模塊的實(shí)現:由于LED的掃描驅動(dòng)是一個(gè)重復的不間斷的過(guò)程,自然,定時(shí)中斷是最好的實(shí)現方法,其流程如圖6所示,其中BuffPt用于指向當前的顯示緩沖區,Ai則為當前所需顯示的LED組的地址編號,從0到N(N為總的LED組數);
2.刷新模塊的實(shí)現:在MCU的程序設計中,一般將此模塊置于16Hz的定時(shí)中斷中(若主程序的循環(huán)周期不固定且最大的循環(huán)時(shí)間大于1/10秒時(shí),常采用此架構)或主程序循環(huán)體中(此種情況主要時(shí)針對MCU時(shí)鐘比較高的場(chǎng)合或不需考慮顯示延時(shí)的情況下),通過(guò)檢測對應的消息來(lái)決定其是否需要執行數據的刷新。以跑步機的設計為例,其功能流程如圖7所示;
3.字符、點(diǎn)陣發(fā)生器:由于在一些實(shí)際的應用中,可能的顯示內容原則上是可預知的和有限的,特別是漢字的顯示,因此其主要是通過(guò)定義相應的點(diǎn)陣來(lái)保存各種需要顯示數據。為了便于程序的設計,一般需將其按照一定的排列規則來(lái)進(jìn)行定義,同時(shí)也需要為各個(gè)需要顯示的字符和圖符進(jìn)行編碼,編碼的規則必須有利于程序的設計和提高代碼的效率,以求能夠采用統一的查表指令來(lái)實(shí)現。
圖6
注:上述的流程只是一個(gè)原理性的程序說(shuō)明,在實(shí)際的應用中,需要根據MCU的特點(diǎn)及具體的硬件設計來(lái)進(jìn)行程序的設計與簡(jiǎn)化。比如:在實(shí)際的項目中有8x8(或小于8x8)個(gè)LED需要驅動(dòng),而且所選的MCU又是8位或16位的,則此時(shí)的地址線(xiàn)的掃描將變得非常的簡(jiǎn)單,只要建立字節變量Ai,其初始值為0x01,然后在每次中斷處理程序中需將Ai直接輸出到LED掃描線(xiàn)所對應的IO口即可,隨后將Ai左移一位,對8x8 LED情況,當Ai=0時(shí),表示一遍掃描完成,此時(shí)再將Ai設為0x01即可。對于顯示的緩沖區的分配,同樣可以根據實(shí)際的軟件設計來(lái)分配具體的RAM地址空間,以進(jìn)一步提高程序的執行效率。記住,由于LED的掃描需要占用較多的MCU時(shí)間,因此在進(jìn)行掃描驅動(dòng)的程序設計時(shí),需要盡可能采用簡(jiǎn)潔高效的代碼,以便提高M(jìn)CU的工作效率。舉例來(lái)說(shuō),假如需驅動(dòng)8x8 LED,根據前面所講的要求,所需的定時(shí)器的中斷頻率必須是大于等于8x32,即256Hz,若在此驅動(dòng)代碼中多增加一條語(yǔ)句,則MCU每秒就需要多執行256條代碼,由此可見(jiàn)高效的代碼對于LED驅動(dòng)程序來(lái)講是多么重要,特別是當MCU的時(shí)鐘不夠快時(shí)!
評論