背光自动控制模块
(3)背光实施
本文引用地址:https://www.eepw.com.cn/article/281898.htmLED背光亮度与其电流呈线性关系。集成了LED驱动器的液晶屏可以通过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
评论