0 引 言
在手持式設(shè)備中,液晶顯示屏的使用越來越廣泛。由于LCD自身是不能發(fā)光的,它需要一個強(qiáng)勁的光源來給它提供背光,以便清晰地顯示信息。這樣的光源是非常耗電的,通常液晶顯示屏的功耗常常占到系統(tǒng)總功耗的60%以上。以群創(chuàng)的7寸屏為例,通常背光燈的功耗為2.5W,而LCD的功耗只有0.825W。由此可見,背光光源的功耗在整個電源中的比重是相當(dāng)高的。如果系統(tǒng)在不用顯示屏?xí)r,也全功率的運(yùn)行,系統(tǒng)的電池能量將很快被耗光。所以,調(diào)節(jié)LCD的背光源,降低系統(tǒng)在不用顯示屏?xí)r的能耗是十分必要的工作。
另外,由于手持式設(shè)備工作環(huán)境的變化,也需要根據(jù)外界光線強(qiáng)度的變化,對背光的亮度做出相應(yīng)的調(diào)節(jié),以適合人眼觀看的舒適度。
基于上述2種原因,考慮到設(shè)備功耗的降低以及使用的便利性,本文在嵌入式Linux下,設(shè)計了一種使用S3C2440的定時器產(chǎn)生PWM (Pulse Width Modulation)信號,根據(jù)設(shè)備實際使用需要,和外界光線強(qiáng)度的變化用按鍵調(diào)節(jié)LCD背光亮度的解決方案。
1 基于PWM 的背光調(diào)節(jié)原理
在中小尺寸液晶顯示屏中,一般采用白光LED作為顯示屏的背光光源。PWM 即脈寬調(diào)制,PWM 調(diào)光就是利用人眼的視覺暫停原理,以一定的頻率和占空比的方波來控制LED的導(dǎo)通。LED正向電流在零電流到額定工作電流之間來回切換,通過高速開關(guān)背光,周期循環(huán)地提供不同占空比的方波,實現(xiàn)亮度的調(diào)節(jié)。只要導(dǎo)通時LED正向電流大小是恒定的,發(fā)出的白光就不會發(fā)生色偏,而且只要頻率大干100Hz,人眼看到的將是連續(xù)的光源。
圖1是脈寬調(diào)制信號的波形。假設(shè)高電平代表打開背光,低電平代表關(guān)閉背光,背光打開和關(guān)閉時間的比例不同會得到不同占空比的方波。從輸出的波形來看,波的平均功率是不一樣的,這樣就得到了不同的亮度,實現(xiàn)了背光的調(diào)節(jié)。
圖1 PWM 的波形
2 背光調(diào)節(jié)的硬件實現(xiàn)方案
S3C2440[4]是三星公司推出的一款基于ARM920T內(nèi)核的16/32位RISC嵌入式微處理器。其內(nèi)部有5個16位的定時器,其中前4 個定時器(TOUT0~TOUT3)具有PWM 功能,第5個定時器(TOUT4)是一個沒有輸出引腳的內(nèi)部定時器,另外定時器TOUT0有一個死區(qū)發(fā)生器,通常用于大電流設(shè)備控制。
PWM 信號可以用硬件產(chǎn)生,也可以由軟件產(chǎn)生。由于用軟件定時產(chǎn)生PWM 信號外圍電路簡單,脈沖寬度精度高,控制靈活,所以本方案用S3C2440的定時器TOUT1,軟件定時產(chǎn)生PWM 信號,通過改變TOUT1端口GPB1輸出脈沖信號占空比,控制背光的開關(guān)。LCD背光調(diào)節(jié)電路如圖2所示。
圖2 LCD背光調(diào)節(jié)電路圖
圖2中ZXLD1100是一個電感式的PFM(PulseFrequency Modulation)升壓轉(zhuǎn)換器,用于驅(qū)動白光LED.當(dāng)LCD正常工作時,ZXLD1100的EN 端被置高電平時,輸出端將得到驅(qū)動LCD背光源所需的工作電壓。將S3C2440的端口GPB1與ZXLD1100的使能端相連,通過PWM 信號使能ZXLD1100,可以使LCD背光工作在較低的功率下。
圖2中按鍵S1_KEY用于調(diào)高背光亮度,S2_KEY用于調(diào)低背光亮度。S1_KEY和S2_KEY所用到的外部中斷分別是EINT0和EINT13.當(dāng)按鍵按下時,系統(tǒng)根據(jù)傳入的按鍵編號控制GPB1輸出PWM 信號占空比,由此完成了對設(shè)備背光的軟件控制,實現(xiàn)背光亮度的調(diào)節(jié)。
3 背光調(diào)節(jié)的軟件設(shè)計
背光調(diào)節(jié)的軟件部分主要是驅(qū)動程序的設(shè)計,設(shè)備驅(qū)動程序是連接硬件和操作系統(tǒng)內(nèi)核的橋梁,它為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),應(yīng)用程序?qū)⑹褂媒y(tǒng)一的系統(tǒng)調(diào)用接口來訪問設(shè)備。Linux系統(tǒng)將設(shè)備分為3種基本類型,即字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。本文涉及的背光驅(qū)動屬于字符設(shè)備驅(qū)動程序。采用Linux作為嵌入式操作系統(tǒng),內(nèi)核版本為Linux 2.6.32,根文件系統(tǒng)采用Yaffs2,應(yīng)用程序采用了Busybox.背光驅(qū)動程序的工作流程框圖如圖3所示。
圖3 背光驅(qū)動程序工作流程框圖
(1)當(dāng)加載驅(qū)動時,調(diào)用初始化函數(shù)s3c_bl_pwm_init()。該函數(shù)會調(diào)用request_irq()函數(shù)來注冊中斷。
request_irq()會操作中斷描述符數(shù)組button_irqs.中斷描述符數(shù)組的主要功能是記錄中斷號對應(yīng)的按鍵編號和GPIO端口。
(2)當(dāng)中斷到來時,會到中斷描述符數(shù)組button_irqs中查詢中斷號對應(yīng)的按鍵編號。然后調(diào)用中斷處理函數(shù)等操作調(diào)節(jié)設(shè)備背光。
(3)當(dāng)卸載驅(qū)動時,調(diào)用退出函數(shù)s3c_bl_pwm_exit()。該函數(shù)中會調(diào)用free_irq(),操作中斷描述符數(shù)組button_irqs,釋放設(shè)備所使用的中斷號并刪除對應(yīng)中斷處理函數(shù)。
3.1 背光驅(qū)動的初始化和退出函數(shù)
在加載驅(qū)動時,內(nèi)核調(diào)用初始化函數(shù)s3c_bl_pwm_init()。首先初始化LCD背光亮度,設(shè)置按鍵中斷觸發(fā)方式,注冊中斷。然后初始化定時器,設(shè)置按鍵初始狀態(tài)為抬起(KEY_UP)。最后使用misc_register()向內(nèi)核注冊混雜設(shè)備,混雜設(shè)備是字符設(shè)備的抽象。背光驅(qū)動中混雜設(shè)備的定義如下:
在卸載驅(qū)動時,內(nèi)核調(diào)用退出函數(shù)s3c_bl_pwm_exit(),注銷中斷和混雜設(shè)備,完成和初始化函數(shù)相反的行為。
3.2 按鍵中斷和定時器處理程序
當(dāng)按鍵被按下后,將發(fā)生快速中斷,觸發(fā)中斷處理程序buttons_interrupt()。在中斷處理程序中,當(dāng)按鍵初始狀態(tài)為抬起(KEY_UP)時,把按鍵狀態(tài)設(shè)置為不確定(KEY_DOWNX),然后啟動定時器延時去抖,進(jìn)入定時器處理函數(shù)。如果當(dāng)前按鍵初始狀態(tài)不是抬起則退出中斷處理程序。在定時器處理程序中,讀取按鍵GPIO端口電平,查詢按鍵是否仍然被按下。如果按鍵仍被按下且按鍵狀態(tài)是不確定(KEY_DOWNX),則標(biāo)識當(dāng)前按鍵狀態(tài)為按下(KEY_DOWN)。同時延時一個相對去抖更長的時間,啟動一個新的定時器,每次定時器到期后,查詢按鍵是否仍然被按下且按鍵狀態(tài)為按下(KEY_DOWN),如果是,則重新啟動新的定時器;若查詢到已經(jīng)沒有按下,則標(biāo)識按鍵狀態(tài)為抬起,這時候應(yīng)該等待新的按鍵中斷。每次標(biāo)識按鍵狀態(tài)為按下(KEY _DOWN)時,應(yīng)該調(diào)用背光調(diào)節(jié)函數(shù)bl_handler()依據(jù)傳入的按鍵編號調(diào)節(jié)背光亮度。按鍵中斷和定時器處理函數(shù)的流程如圖4所示。
圖4 按鍵中斷和定時器處理函數(shù)的流程圖
3.3 PWM 設(shè)置函數(shù)
PWM 定時器中有2個寄存器TCNTBn和TCMPBn,分別為定時器計數(shù)緩存寄存器和定時器比較緩存寄存器[10].TCNTBn用來設(shè)置PWM 輸出脈沖頻率,TCMPBn的值用于設(shè)置PWM 信號占空比。因此通過寫入不同的TCMPBn的數(shù)值,就可以調(diào)節(jié)輸出信號占空比,實現(xiàn)PWM 功能,即:要減小PWM 的脈寬,則要減小TCMPBn值,相反要增大PWM 的脈寬,則要增大TCMPBn.如果使用了反相器,則增大和減小的結(jié)果相反,雙緩沖特性允許定時器在工作時改寫TCMPBn的值。
PWM 設(shè)置函數(shù)pwm_set_duty()根據(jù)傳入參數(shù)改寫TCMPBn的值,可以實時地改變輸出波形。PWM設(shè)置函數(shù)設(shè)置定時器TOUT1端口GPB1的PWM 功能操作步驟如下:
(1)使能系統(tǒng)PCLK 時鐘源,獲取總線時鐘頻率值。設(shè)置定時器TOUT1的時鐘預(yù)分頻值和分頻值,分別寫入定時器配置寄存器TCFG0和TCFG1;(2)寫入初始值到比較緩存寄存器TCMPB1和計數(shù)緩存寄存器TCNTB1;(3)設(shè)置定時器控制寄存器TCON.使能定時器TOUT1的自動重載位,關(guān)閉反相器,開啟手動更新位,啟動定時器TOUT1.在定時器延時等待一定時間后定時器的下降計數(shù)器開始計數(shù);(4)清除定時器TOUT1的手動更新位,手動更新位必須在下次寫前被清除。
4 測試結(jié)果與分析
將驅(qū)動程序編譯后加載到內(nèi)核測試,設(shè)定PWM 輸出頻率為200Hz,高電平比例為1/3的波形,通過示波器看到GPB1端口所輸出波形如圖5所示。
圖5 GPB1輸出波形
通過測試,可以得到如表1所示的該手持式設(shè)備功耗與背光亮度相關(guān)的數(shù)據(jù)。
表1 系統(tǒng)不同背光亮度的功耗對比表
從表1中可以看出背光亮度等級越低,系統(tǒng)的功耗越小。所以,在該設(shè)備使用時,在環(huán)境允許的條件下,可以降低背光亮度等級,以減少功耗。本文的背光驅(qū)動程序為背光調(diào)節(jié)提供了7級的亮度控制。在實際使用的過程中,設(shè)置1/3的亮度即可,只有在特殊的場合才需要設(shè)置為高亮。在LCD不工作的時候,可以調(diào)低或者關(guān)閉背光,這樣可以大大節(jié)省能耗。在應(yīng)用時,為了確保人眼看不到LED周期亮滅的情況,以獲得視覺上的滿意效果,PWM 輸出的頻率一般在設(shè)置在100~300Hz之間比較合適,否則會給人閃爍的感覺。
5 結(jié) 語
本文在嵌入式Linux下,設(shè)計了一種基于PWM 調(diào)節(jié)LCD背光的軟硬件實現(xiàn)方案。本方案與普通的線性調(diào)光相比,更符合人們對LED調(diào)光精度、效率以及效果的要求,同時可以降低系統(tǒng)功耗并能滿足手持式設(shè)備調(diào)節(jié)背光的要求,該方案已經(jīng)在一款手持設(shè)備產(chǎn)品上得到了應(yīng)用。在實際應(yīng)用中,為了防止當(dāng)PWM 頻率落在200~20kHz之間時,LED驅(qū)動電路的電感和電容產(chǎn)生人耳聽得見的噪聲,可以根據(jù)需求,增加成本,用高耐壓的鉭電容代替陶瓷電容;還可以犧牲調(diào)光精度,把開關(guān)頻率提高到20kHz以上,跳出人耳聽覺的范圍。
來源;電子工程網(wǎng)
評論
查看更多