1. 程式人生 > >基於嵌入式Linux的LCD背光調節及驅動的實現

基於嵌入式Linux的LCD背光調節及驅動的實現

0 引言

  在手持式裝置中,液晶顯示屏的使用越來越廣泛。由於LCD自身是不能發光的,它需要一個強勁的光源來給它提供背光,以便清晰地顯示資訊。這樣的光源是非常耗電的,通常液晶顯示屏的功耗常常佔到系統總功耗的60%以上。以群創的7寸屏為例,通常背光燈的功耗為2.5 W,而LCD的功耗只有0.825 W。由此可見,背光光源的功耗在整個電源中的比重是相當高的。如果系統在不用顯示屏時,也全功率的執行,系統的電池能量將很快被耗光。所以,調節LCD的背光源,降低系統在不用顯示屏時的能耗是十分必要的工作。另外,由於手持式裝置工作環境的變化,也需要根據外界光線強度的變化,對背光的亮度做出相應的調節,以適合人眼觀看的舒適度。
  基於上述2種原因,考慮到裝置功耗的降低以及使用的便利性,本文在嵌入式Linux下,設計了一種使用S3C2440的定時器產生PWM(Pulse Width Modulation)訊號,根據裝置實際使用需要,和外界光線強度的變化用按鍵調節LCD背光亮度的解決方案。

1 基於PWM的背光調節原理

  在中小尺寸液晶顯示屏中,一般採用白光LED作為顯示屏的背光光源。PWM即脈寬調製,PWM調光就是利用人眼的視覺暫停原理,以一定的頻率和佔空比的方波來控制LED的導通。LED正向電流在零電流到額定工作電流之間來回切換,通過高速開關背光,週期迴圈地提供不同佔空比的方波,實現亮度的調節。只要導通時LED正向電流大小是恆定的,發出的白光就不會發生色偏,而且只要頻率大幹100Hz,人眼看到的將是連續的光源。  

這裡寫圖片描述

  圖1是脈寬調製訊號的波形。假設高電平代表開啟背光,低電平代表關閉背光,背光開啟和關閉時間的比例不同會得到不同佔空比的方波。從輸出的波形來看,波的平均功率是不一樣的,這樣就得到了不同的亮度,實現了背光的調節。

2 背光調節的硬體實現方案

  S3C2440是三星公司推出的一款基於ARM920T核心的16/32位RISC嵌入式微處理器。其內部有5個16位的定時器,其中前4個定時器(TOUT0~TOUT3)具有PWM功能,第5個定時器(TOUT4)是一個沒有輸出引腳的內部定時器,另外定時器TOUT0有一個死區發生器,通常用於大電流裝置控制。
  PWM訊號可以用硬體產生,也可以由軟體產生。由於用軟體定時產生PWM訊號外圍電路簡單,脈衝寬度精度高,控制靈活,所以本方案用S3C2440的定時器TOUT1,軟體定時產生PWM訊號,通過改變TOUT1埠GPB1輸出脈衝訊號佔空比,控制背光的開關。
  LCD背光調節電路如圖2所示。


這裡寫圖片描述

  圖2中ZXLD1100是一個電感式的PFM(Pulse Frequency Modulation)升壓轉換器,用於驅動白光LED。當LCD正常工作時,ZXLD1100的EN端被置高電平時,輸出端將得到驅動LCD背光源所需的工作電壓。將S3C2440的埠GPB1與ZXLD1100的使能端相連,通過PWM訊號使能ZXLD1100,可以使LCD背光工作在較低的功率下。
  圖2中按鍵S1_KEY用於調高背光亮度,S2_KEY用於調低背光亮度。S1_KEY和S2_KEY所用到的外部中斷分別是EINT0和EINT13。當按鍵按下時,系統根據傳入的按鍵編號控制GPB1輸出PWM訊號佔空比,由此完成了對裝置背光的軟體控制,實現背光亮度的調節。

3 背光調節的軟體設計

  背光調節的軟體部分主要是驅動程式的設計,裝置驅動程式是連線硬體和作業系統核心的橋樑,它為應用程式遮蔽了硬體的細節,應用程式將使用統一的系統呼叫介面來訪問裝置。Linux系統將裝置分為3種基本型別,即字元裝置、塊裝置和網路裝置。本文涉及的背光碟機動屬於字元裝置驅動程式。採用Linux作為嵌入式作業系統,核心版本為Linux 2.6.32,根檔案系統採用Yaffs2,應用程式採用了Busybox。背光碟機動程式的工作流程框圖如圖3所示。

這裡寫圖片描述
  • (1)當載入驅動時,呼叫初始化函式s3c_bl_pwm_init()。該函式會呼叫request_irq()函式來註冊中斷。request_irq()會操作中斷描述符陣列button_irqs。中斷描述符陣列的主要功能是記錄中斷號對應的按鍵編號和GPIO埠。
  • (2)當中斷到來時,會到中斷描述符陣列button_irqs中查詢中斷號對應的按鍵編號。然後呼叫中斷處理函式等操作調節裝置背光。
  • (3)當解除安裝驅動時,呼叫退出函式s3c_bl_pwm_exit()。該函式中會呼叫free_irq(),操作中斷描述符陣列button_irqs,釋放裝置所使用的中斷號並刪除對應中斷處理函式。

3.1 背光碟機動的初始化和退出函式

  在載入驅動時,核心呼叫初始化函式s3c_bl_pwm_init()。首先初始化LCD背光亮度,設定按鍵中斷觸發方式,註冊中斷。然後初始化定時器,設定按鍵初始狀態為擡起(KEY_UP)。最後使用misc_register()向核心註冊混雜裝置,混雜裝置是字元裝置的抽象。背光碟機動中混雜裝置的定義如下:

這裡寫圖片描述

  在解除安裝驅動時,核心呼叫退出函式s3c_bl_pwm_exit(),登出中斷和混雜裝置,完成和初始化函式相反的行為。

3.2 按鍵中斷和定時器處理程式

  當按鍵被按下後,將發生快速中斷,觸發中斷處理程式buttons_interrupt()。在中斷處理程式中,當按鍵初始狀態為擡起(KEY_UP)時,把按鍵狀態設定為不確定(KEY_DOWNX),然後啟動定時器延時去抖,進入定時器處理函式。如果當前按鍵初始狀態不是擡起則退出中斷處理程式。在定時器處理程式中,讀取按鍵GPIO埠電平,查詢按鍵是否仍然被按下。如果按鍵仍被按下且按鍵狀態是不確定(KEY_DOWNX),則標識當前按鍵狀態為按下(KEY_DOWN)。同時延時一個相對去抖更長的時間,啟動一個新的定時器,每次定時器到期後,查詢按鍵是否仍然被按下且按鍵狀態為按下(KEY_DOWN),如果是,則重新啟動新的定時器;若查詢到已經沒有按下,則標識按鍵狀態為擡起,這時候應該等待新的按鍵中斷。每次標識按鍵狀態為按下(KEY_DOWN)時,應該呼叫背光調節函式bl_handler()依據傳入的按鍵編號調節背光亮度。按鍵中斷和定時器處理函式的流程如圖4所示。

這裡寫圖片描述

3.3 PWM設定函式

  PWM定時器中有2個暫存器TCNTBn和TCMPBn,分別為定時器計數快取暫存器和定時器比較快取暫存器。TCNTBn用來設定PWM輸出脈衝頻率,TCMPBn的值用於設定PWM訊號佔空比。因此通過寫入不同的TCMPBn的數值,就可以調節輸出訊號佔空比,實現PWM功能,即:要減小PWM的脈寬,則要減小TCMPBn值,相反要增大PWM的脈寬,則要增大TCMPBn。如果使用了反相器,則增大和減小的結果相反,雙緩衝特性允許定時器在工作時改寫TCMPBn的值。
  PWM設定函式pwm_set_duty()根據傳入引數改寫TCMPBn的值,可以實時地改變輸出波形。PWM設定函式設定定耐器TOUT1埠GPB1的PWM功能操作步驟如下:

  • (1)使能系統PCLK時鐘源,獲取匯流排時鐘頻率值。設定定時器TOUT1的時鐘預分頻值和分頻值,分別寫入定時器配置暫存器TCFG0和TCFG1;
  • (2)寫入初始值到比較快取暫存器TCMPB1和計數快取暫存器TCNTB1;
  • (3)設定定時器控制暫存器TCON。使能定時器TOUT1的自動過載位,關閉反相器,開啟手動更新位,啟動定時器TOUT1。在定時器延時等待一定時間後定時器的下降計數器開始計數;
  • (4)清除定時器TOUT1的手動更新位,手動更新位必須在下次寫前被清除。

4 測試結果與分析

  將驅動程式編譯後加載到核心測試,設定PWM輸出頻率為200 Hz,高電平比例為1/3的波形,通過示波器看到GPB1埠所輸出波形如圖5所示。

這裡寫圖片描述

  通過測試,可以得到如表1所示的該手持式裝置功耗與背光亮度相關的資料。

這裡寫圖片描述

  從表1中可以看出背光亮度等級越低,系統的功耗越小。所以,在該裝置使用時,在環境允許的條件下,可以降低背光亮度等級,以減少功耗。本文的背光碟機動程式為背光調節提供了7級的亮度控制。在實際使用的過程中,設定1/3的亮度即可,只有在特殊的場合才需要設定為高亮。在LCD不工作的時候,可以調低或者關閉背光,這樣可以大大節省能耗。在應用時,為了確保人眼看不到LED週期亮滅的情況,以獲得視覺上的滿意效果,PWM輸出的頻率一般在設定在100~300 Hz之間比較合適,否則會給人閃爍的感覺。

5 結語

  本文在嵌入式Linux下,設計了一種基於PWM調節LCD背光的軟硬體實現方案。本方案與普通的線性調光相比,更符合人們對LED調光精度、效率以及效果的要求,同時可以降低系統功耗並能滿足手持式裝置調節背光的要求,該方案已經在一款手持裝置產品上得到了應用。在實際應用中,為了防止當PWM頻率落在200~20 kHz之間時,LED驅動電路的電感和電容產生人耳聽得見的噪聲,可以根據需求,增加成本,用高耐壓的鉭電容代替陶瓷電容;還可以犧牲調光精度,把開關頻率提高到20 kHz以上,跳出人耳聽覺的範圍。

相關推薦

基於嵌入式Linux的LCD調節驅動實現

0 引言   在手持式裝置中,液晶顯示屏的使用越來越廣泛。由於LCD自身是不能發光的,它需要一個強勁的光源來給它提供背光,以便清晰地顯示資訊。這樣的光源是非常耗電的,通常液晶顯示屏的功耗常常佔到系統總功耗的60%以上。以群創的7寸屏為例,通常背光燈的功耗為2.

android 關於LCD調節漸變過程引起閃爍問題

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

調節亮度預設值修改

1、packages/apps/Settings/res/layout/preference_dialog_brightness.xml 進行背光調節dialog進行佈局。 2、packages/apps/Settings/src/com/android/settings/

Android7.0調節

涉及類: 一.簡述 Android螢幕背光屬於Android系統中display模組,display是從Power中分出來的,所以和Power有著密不可分的關係。背光調節中,又可以分為手動調節和

android7.1預設亮度編譯除錯

android7.1預設背光亮度及編譯除錯始修改\frameworks\base\packages\SettingsProvider\res\values\defaults.xml<integername="def_screen_brightness">102&l

使用IOCTL程式碼實現LCD調節

國內這樣的程式碼找不到,於是參考了相關程式碼後完善如下程式碼,且實現方式通過IOCTL程式碼實現LCD背光調節的功能。 適合場合為平板電腦或者筆記本。主要還是要靠BIOS支援與否。 編譯環境使用:Dev-cpp工具編寫。 #include <stdio.h>

推薦系統學習--基於item的協同過濾演算法python實現

轉載地址:http://blog.csdn.net/gamer_gyt/article/details/51346159 1:協同過濾演算法簡介 2:協同過濾演算法的核心 3:協同過濾演算法的應用方式 4:基於使用者的協同過濾演算法實現

imx6驅動調試

註意 實參 sdn 獲取 kobject ont eve ini bject 1.內核配置pwm背光驅動make menuconfig:Device Driver ---> Graphics support ---> [*] Back

高通LCD的pwm驅動

deb Owner null github sent kernel hub PC nes 發生異常的現象: msm8953 lcd在快速亮滅的情況下背光概率性休眠不滅;測量高通pwm,發現正常的時候pwm的管腳LCM_BL_PWM為低電平,失敗的時候為高電平; 根據原理圖:

嵌入式核心驅動開發之學習筆記(十) 非同步通訊+中斷實現讀取資料

對於linux一切都是檔案,驅動裝置在應用層也是以檔案的形式進行讀寫。之前學了阻塞、非阻塞、多路複用的方式讀裝置,它們都需要應用主動讀取。那麼應用層有沒有一種方式,當底層將資料準備好了,應用程式自動處理這些資料?通過非同步通訊可以實現,這有寫類似硬體層的中斷概念 驅動層(準備好了資料) --&g

嵌入式核心驅動開發之學習筆記(九) 多路複用+中斷實現讀取資料

使用阻塞模型雖然可以避免等待資料過程中,CPU對程序的消耗,但是僅僅是為了等待這一個結果,就讓程序進入休眠,對於還要進行其他IO操作的程序而言太“奢侈”。所以引入多路複用的概念,解決這個問題。 非阻塞:立即返回結果,如果想得到期望的結果,要不停的呼叫這個方法(輪詢),非常耗費資源 阻塞:沒有

嵌入式核心驅動開發之學習筆記(八) 阻塞模式+中斷實現讀取資料

目前已經學習兩種應用層IO模型的使用 非阻塞:立即返回結果,如果想得到期望的結果,要不停的呼叫這個方法(輪詢),非常耗費資源 阻塞:沒有得到真正的資料前,不返回結果。此時,程序進入阻塞(休眠)態,直到有資料喚醒程序,這個過程不耗資源。 PS:linux應用中,大部分的函式介面都是阻塞

嵌入式核心驅動開發之學習筆記(七) 非阻塞模式+中斷實現讀取資料

當中斷髮生時,驅動程式會跳轉到中斷處理的函式入口,實現了中斷的捕獲和處理,但這樣還不夠。要讓使用者能夠獲取到中斷分析的結果,我們將建立一個描述中斷事件的結構體物件。硬體產生中斷後,驅動程式碼將對中斷事件的分析結果儲存在結構體變數中,使用者需要的時候,直接通過介面函式獲取這個結構體的資料。 核心層

嵌入式核心驅動開發之學習筆記(六) 驅動層中斷實現

由於中斷訊號的突發性,CPU要捕獲中斷訊號,有兩種方式。一是不斷輪詢是否有中斷髮生,這樣有點傻;二是通過中斷機制,過程如下: 中斷源 ---> 中斷訊號  --->  中斷控制器 --->  CPU  中斷源有很多,CPU拿

嵌入式核心驅動開發之學習筆記(五) 編寫字元驅動步驟總結

1,實現模組載入和解除安裝入口函式         module_init(chr_dev_init);         module_exit(chr_dev_exit);

嵌入式核心驅動開發之學習筆記(四) 規範化程式碼

前面筆者已實現了使用者程式控制led燈閃爍的驅動程式碼,但是由於程式碼不規範,顯得亂七八糟的,因此需要規範化。如果比較大一點的工程沒有規範的話,也不利於後期的跟新與維護。分析先前的程式不規範點有二: 定義的變數多而且散亂 程式沒有錯誤處理機制 C語言雖然是面向過程的語言,但是

嵌入式核心驅動開發之學習筆記(三) 點燈實驗

完成應用程式通過驅動控制硬體的實現。實驗建立在之前的框架上,我們先實現使用者層與核心層之間的資料互動,驅動程式拿到使用者傳來的指令後,就可以執行點燈的動作了。   應用程式與驅動資料互動 對於驅動程式而言,使用copy_to_user 和 copy_from_user

嵌入式核心驅動開發之學習筆記(二) 實現應用控制驅動

Linux系統根據驅動程式實現的模型框架將裝置驅動分成字元裝置驅動、塊裝置驅動、網路裝置驅動三大類。這裡簡單理解一下概念 字元裝置:裝置按位元組流處理資料,通常用的串列埠裝置、鍵盤裝置都是這種。 塊裝置:裝置按塊單位對資料處理,通常是儲存裝置。 網路裝置:顧名思義,建立在soc

嵌入式核心驅動開發之學習筆記(一) 認識與使用驅動模組

應用層的程序是通過核心層驅動來訪問硬體的,Linux核心原始碼在每次編譯之後生成一個總的映象,將映象載入記憶體中執行並使用(核心在系統執行時會移植佔用核心空間)。驅動屬於核心原始碼的一部分,如果每次修改驅動都要重新編譯載入核心的話,這態麻煩了,所以我們通過模組,使驅動可以獨立於核心映象之外,並能動態

嵌入式核心驅動開發之學習筆記(十七) 裝置樹的定義規則和獲取方法

概述 在Linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥著大量的垃圾程式碼,相當多數的程式碼只是在描述板級細節,而這些板級細節對於核心來講,不過是垃圾,如板上的platform裝置、resource、i2c_board_info、sp