新闻中心

EEPW首页 > 设计应用 > 背光自动控制模块

背光自动控制模块

作者:郭昱秀 叶永安时间:2015-11-09来源:电子产品世界收藏
编者按:本文主要讲述采用集成环境光传感器控制显示屏背光亮度的应用。系统根据环境光强度实行动态的背光控制,降低功耗。让显示屏亮度根据环境光条件自行调整到最佳状态,改善用户体验。同时也能手动调节背光亮度。

(3)背光实施

本文引用地址:http://www.eepw.com.cn/article/281898.htm

  背光亮度与其电流呈线性关系。集成了驱动器的可以通过PWM直接控制背光亮度。本设计中参考的数据手册PWM信号的频率选用100Hz,由STM32F103的TIM3产生。

  在背光调节过程中应避免从一个亮度级直接跳转到另一个亮度级(骤变式的亮度变化会对眼睛造成冲击),而应该平滑上调和下调背光亮度,确保不同亮度等级之间无缝过渡。为了达到这一目的,可采用带有固定或不同亮度步长、可逐步调节亮度的定时中断。本设计中参考MAX44009应用笔记中推荐的步进式亮度调节的算法进行亮度的平滑调节。

  将采集进来的室内光照度转化为微处理器内PWM寄存器的值,记为当前PWM值。将前PWM寄存器值记为PWM原值。将PWM原值与当前PWM值不断比较递增或递减,使PWM输出以极小的步长跟踪当前PWM值,从而实现平滑调光。此算法还能解决启动跳变问题,使系统启动时PWM由零慢慢变化到当前PWM值。

  PWM定时器的跳变值应该在定时器溢出中断中重新赋值,避免跳变值的改变可能出现PWM信号有波动。

  (4)设置上、下限阀值

  MAX44009可以设置上、下限门限,在光线强度偏离上、下门限一定时间后,产生中断通知微处理器读取光强度。

  由表2可知MAX44009的上、下门限只是针对高字节流明的。怎么把一个浮点型的流明数值变换成上、下限寄存器的格式数据。在这里需要采用frexp[3]函数:double frexp(double x, int *exp);其中0.5≤x<1;exp为整数。然后再对数据进行调整,程序如下:

  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;

  }

  }

  设置上、下限阀值主要是为了改善系统对环境光强变化的响应,避免因为光强的瞬间变化(譬如一扇窗户打开或瞬间有一束光扫过)而过快地改变亮度等级,这往往会造成用户感觉不适。最初级的方法是每隔一两秒钟检查一次光传感器,然后相应地调整背光亮度。更好的方法是,只有光线强度偏离特定范围一定时间后,才对背光亮度进行调节。

  MAXIM推荐的例子是:“如果正常光强是200lux,可能只会在光强降到180lux以下或升至220lux以上,而且持续时间超过数秒的情况下才调节亮度”。由于上、下限阀值设定是个固定值,当系统的使用环境更换时(比如说室外转移到室内),会造成背光调节的偏差,特别是新环境的光强度超出了上、下限阀值时,系统的调光效果跟最初级的方法效果一样了。

  为了解决这一问题,本设计中采用了动态设置上、下限阀值的方法。读取当前光强度,然后取±10%为偏移量,写进上、下限寄存器中。

3.2.2 PWM控制

  STM32F103共有7个定时器,TIM1和TIM8是高级定时器,TIM2、TIM3和TIM4是通用定时器,TIM6和TIM7是基本定时器。本设计中采用通用定时器TIM3,利用TIM3产生周期为100Hz的PWM信号。

  PWM配置步骤如下:1、设定TIM3信号周期;2、设定TIM3预分频值;2、设定TIM3分频系数;4、设定TIM3计数模式;5、初始化TIM_TimeBaseStructure[4];6、设定TIM3的OC模式;7、TIM3输出使能;8、设定电平跳变初值;9、设定PWM信号的极性;10、使能TIM3信号通道;11、使能TIM3中断;12、使能TIM3重载寄存器CCRX;13、使能TIM3计数;14、在中断中设置新的电平跳变值。

3.2.3 USB通信

  在ST提供的USB-HID的例程上做修改,增加到3个USB端点。EP0为控制端点,EP1为INTERRUPT OUT端点(PC向MCU发送数据),EP2为INTERRUPT IN端点(MCU向PC发送数据)。需要对“usb_desc.c”文件进行修改,VID和PID[5]不能跟现有的设备相冲突。详细可参考USB HID V1.1协议。模块收到上位机发送过来的数据后,对数据进行解析并根据命令做出相关操作,代码如下:

  if(USB_ReceiveFlg == TRUE) //收到数据

  {

  USB_ReceiveFlg = FALSE;

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

  {

  if(RxBuffer[1]==0x50) //自动调光

  {

  Light_AM_flag=1;

  I2C_WriteByte(0x01,INT_ENABLE,MAX44009_ADDR);

  Light_HM_flag=0;

  }

  else if(RxBuffer[1]==0x05) //手动调光

  {

  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); //调光百分比

  }

  }

  }

3.3 上位机软件

  在VB编程环境中应用“HidAPI.bas”组件进行USB通讯编程,根据上述的通信协议通过USB接口与控制模块进行信息指令交换。软件有两个功能:1、勾选“AM”控制模块进入自动控光模式,滑条将被屏蔽不允许操作;2、不勾选“AM”进入手动控光模式,可以通过滑条进行亮度调节。

  在VB中滑条需要鼠标左键才能触发,为了鼠标的滑轮能够使用,加入了定数器,每20ms读取一次滑条的值,保存并与上一次数据项比较,如果有变化则通过USB发送控制指令,否则不做处理。代码如下:

  Dim lightdata_r As String

  Dim lightdata As String

  Private Sub Timer1_Timer()

  Text1.Text = Slider1.Value

  lightdata_r = lightdata ‘保存上一次数据

  lightdata = Slider1.Value ‘重新赋值

  If lightdata <> lightdata_r Then ‘比较

  Data(1) = &H5

  Data(3) = lightdata

  Call WriteReport‘发送数据

  End If

  End Sub

  软件界面效果如图6所示。

4 结论及成品展示

  通过对本系统的调试与测试,实现了液晶背光的自动和手动控制。系统运行可靠,操作简单,而且硬件模块体积小便于安装。已应用于多个显示器产品中。

参考文献:

  [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程序设计(第三版)[M].北京:清华大学出版社.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 下一页

评论


相关推荐

技术专区

关闭