<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 設(shè)計應(yīng)用 > 背光自動控制模塊

          背光自動控制模塊

          作者:郭昱秀 葉永安 時間:2015-11-09 來源:電子產(chǎn)品世界 收藏
          編者按:本文主要講述采用集成環(huán)境光傳感器控制顯示屏背光亮度的應(yīng)用。系統(tǒng)根據(jù)環(huán)境光強度實行動態(tài)的背光控制,降低功耗。讓顯示屏亮度根據(jù)環(huán)境光條件自行調(diào)整到最佳狀態(tài),改善用戶體驗。同時也能手動調(diào)節(jié)背光亮度。

          (3)背光實施

          本文引用地址:http://www.ex-cimer.com/article/281898.htm

            背光亮度與其電流呈線性關(guān)系。集成了驅(qū)動器的可以通過PWM直接控制背光亮度。本設(shè)計中參考的數(shù)據(jù)手冊PWM信號的頻率選用100Hz,由STM32F103的TIM3產(chǎn)生。

            在背光調(diào)節(jié)過程中應(yīng)避免從一個亮度級直接跳轉(zhuǎn)到另一個亮度級(驟變式的亮度變化會對眼睛造成沖擊),而應(yīng)該平滑上調(diào)和下調(diào)背光亮度,確保不同亮度等級之間無縫過渡。為了達(dá)到這一目的,可采用帶有固定或不同亮度步長、可逐步調(diào)節(jié)亮度的定時中斷。本設(shè)計中參考MAX44009應(yīng)用筆記中推薦的步進(jìn)式亮度調(diào)節(jié)的算法進(jìn)行亮度的平滑調(diào)節(jié)。

            將采集進(jìn)來的室內(nèi)光照度轉(zhuǎn)化為微處理器內(nèi)PWM寄存器的值,記為當(dāng)前PWM值。將前PWM寄存器值記為PWM原值。將PWM原值與當(dāng)前PWM值不斷比較遞增或遞減,使PWM輸出以極小的步長跟蹤當(dāng)前PWM值,從而實現(xiàn)平滑調(diào)光。此算法還能解決啟動跳變問題,使系統(tǒng)啟動時PWM由零慢慢變化到當(dāng)前PWM值。

            PWM定時器的跳變值應(yīng)該在定時器溢出中斷中重新賦值,避免跳變值的改變可能出現(xiàn)PWM信號有波動。

            (4)設(shè)置上、下限閥值

            MAX44009可以設(shè)置上、下限門限,在光線強度偏離上、下門限一定時間后,產(chǎn)生中斷通知微處理器讀取光強度。

            由表2可知MAX44009的上、下門限只是針對高字節(jié)流明的。怎么把一個浮點型的流明數(shù)值變換成上、下限寄存器的格式數(shù)據(jù)。在這里需要采用frexp[3]函數(shù):double frexp(double x, int *exp);其中0.5≤x<1;exp為整數(shù)。然后再對數(shù)據(jù)進(jìn)行調(diào)整,程序如下:

            u8 Threshold_reg(float lux_Threshold)

            {

            double x;

            int n;

            u8 y,Threshold;

            x=frexp(lux_Threshold,&n);

            if(lux_Threshold<8)

            {

            y=(u8)(x*80);

            if((y%10)>4) y+=10;

            y=y/10;

            Threshold =(((u8)(n-3))<<4)|y;

            return Threshold;

            }

            else

            {

            y=(u8)(x*160);

            if((y%10)>4) y+=10;

            y=y/10;

            Threshold =(((u8)(n-4))<<4)|y;

            return Threshold;

            }

            }

            設(shè)置上、下限閥值主要是為了改善系統(tǒng)對環(huán)境光強變化的響應(yīng),避免因為光強的瞬間變化(譬如一扇窗戶打開或瞬間有一束光掃過)而過快地改變亮度等級,這往往會造成用戶感覺不適。最初級的方法是每隔一兩秒鐘檢查一次光傳感器,然后相應(yīng)地調(diào)整背光亮度。更好的方法是,只有光線強度偏離特定范圍一定時間后,才對背光亮度進(jìn)行調(diào)節(jié)。

            MAXIM推薦的例子是:“如果正常光強是200lux,可能只會在光強降到180lux以下或升至220lux以上,而且持續(xù)時間超過數(shù)秒的情況下才調(diào)節(jié)亮度”。由于上、下限閥值設(shè)定是個固定值,當(dāng)系統(tǒng)的使用環(huán)境更換時(比如說室外轉(zhuǎn)移到室內(nèi)),會造成背光調(diào)節(jié)的偏差,特別是新環(huán)境的光強度超出了上、下限閥值時,系統(tǒng)的調(diào)光效果跟最初級的方法效果一樣了。

            為了解決這一問題,本設(shè)計中采用了動態(tài)設(shè)置上、下限閥值的方法。讀取當(dāng)前光強度,然后取±10%為偏移量,寫進(jìn)上、下限寄存器中。

          3.2.2 PWM控制

            STM32F103共有7個定時器,TIM1和TIM8是高級定時器,TIM2、TIM3和TIM4是通用定時器,TIM6和TIM7是基本定時器。本設(shè)計中采用通用定時器TIM3,利用TIM3產(chǎn)生周期為100Hz的PWM信號。

            PWM配置步驟如下:1、設(shè)定TIM3信號周期;2、設(shè)定TIM3預(yù)分頻值;2、設(shè)定TIM3分頻系數(shù);4、設(shè)定TIM3計數(shù)模式;5、初始化TIM_TimeBaseStructure[4];6、設(shè)定TIM3的OC模式;7、TIM3輸出使能;8、設(shè)定電平跳變初值;9、設(shè)定PWM信號的極性;10、使能TIM3信號通道;11、使能TIM3中斷;12、使能TIM3重載寄存器CCRX;13、使能TIM3計數(shù);14、在中斷中設(shè)置新的電平跳變值。

          3.2.3 USB通信

            在ST提供的USB-HID的例程上做修改,增加到3個USB端點。EP0為控制端點,EP1為INTERRUPT OUT端點(PC向MCU發(fā)送數(shù)據(jù)),EP2為INTERRUPT IN端點(MCU向PC發(fā)送數(shù)據(jù))。需要對“usb_desc.c”文件進(jìn)行修改,VID和PID[5]不能跟現(xiàn)有的設(shè)備相沖突。詳細(xì)可參考USB HID V1.1協(xié)議。模塊收到上位機發(fā)送過來的數(shù)據(jù)后,對數(shù)據(jù)進(jìn)行解析并根據(jù)命令做出相關(guān)操作,代碼如下:

            if(USB_ReceiveFlg == TRUE) //收到數(shù)據(jù)

            {

            USB_ReceiveFlg = FALSE;

            if((RxBuffer[0]==0xff)&(RxBuffer[4]==0xcc))

            {

            if(RxBuffer[1]==0x50) //自動調(diào)光

            {

            Light_AM_flag=1;

            I2C_WriteByte(0x01,INT_ENABLE,MAX44009_ADDR);

            Light_HM_flag=0;

            }

            else if(RxBuffer[1]==0x05) //手動調(diào)光

            {

            Light_AM_flag=0;

            I2C_WriteByte(0x00,INT_ENABLE,MAX44009_ADDR);

            HM_light=RxBuffer[3];

            HM_light=HM_light/100;

            PWM_diff(HM_light,1); //調(diào)光百分比

            }

            }

            }

          3.3 上位機軟件

            在VB編程環(huán)境中應(yīng)用“HidAPI.bas”組件進(jìn)行USB通訊編程,根據(jù)上述的通信協(xié)議通過USB接口與控制模塊進(jìn)行信息指令交換。軟件有兩個功能:1、勾選“AM”控制模塊進(jìn)入自動控光模式,滑條將被屏蔽不允許操作;2、不勾選“AM”進(jìn)入手動控光模式,可以通過滑條進(jìn)行亮度調(diào)節(jié)。

            在VB中滑條需要鼠標(biāo)左鍵才能觸發(fā),為了鼠標(biāo)的滑輪能夠使用,加入了定數(shù)器,每20ms讀取一次滑條的值,保存并與上一次數(shù)據(jù)項比較,如果有變化則通過USB發(fā)送控制指令,否則不做處理。代碼如下:

            Dim lightdata_r As String

            Dim lightdata As String

            Private Sub Timer1_Timer()

            Text1.Text = Slider1.Value

            lightdata_r = lightdata ‘保存上一次數(shù)據(jù)

            lightdata = Slider1.Value ‘重新賦值

            If lightdata <> lightdata_r Then ‘比較

            Data(1) = &H5

            Data(3) = lightdata

            Call WriteReport‘發(fā)送數(shù)據(jù)

            End If

            End Sub

            軟件界面效果如圖6所示。

          4 結(jié)論及成品展示

            通過對本系統(tǒng)的調(diào)試與測試,實現(xiàn)了液晶背光的自動和手動控制。系統(tǒng)運行可靠,操作簡單,而且硬件模塊體積小便于安裝。已應(yīng)用于多個顯示器產(chǎn)品中。

          參考文獻(xiàn):

            [1]Maxim. MAX44009 Data sheet Rev 0[Z]. Maximintegrated .2011

            [2]Windows. Integrating Ambient Light Sensors with Computers Running Windows 7[R].Microsoft.2010

            [3]譚浩強.C程序設(shè)計(第三版)[M].北京:清華大學(xué)出版社.2005

            [4] ST.UM0427 Rev 2[Z] . STMicroelectronics .2000

            [5] USB Device Working Group.Device Class Definition for Human Interface Devices[Z].USB.org.1999


          上一頁 1 2 下一頁

          關(guān)鍵詞: 自動控制 液晶屏 LED 201511

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();