历史上的今天
返回首页

历史上的今天

今天是:2026年01月12日(星期一)

正在发生

2023年01月12日 | 基于一种可以用按键进行调节LCD背光亮度的解决方案

2023-01-12 来源:elecfans

0 引 言

在手持式设备中,液晶显示屏的使用越来越广泛。由于LCD自身是不能发光的,它需要一个强劲的光源来给它提供背光,以便清晰地显示信息。这样的光源是非常耗电的,通常液晶显示屏的功耗常常占到系统总功耗的60%以上。以群创的7寸屏为例,通常背光灯的功耗为2.5W,而LCD的功耗只有0.825W。由此可见,背光光源的功耗在整个电源中的比重是相当高的。如果系统在不用显示屏时,也全功率的运行,系统的电池能量将很快被耗光。所以,调节LCD的背光源,降低系统在不用显示屏时的能耗是十分必要的工作。


另外,由于手持式设备工作环境的变化,也需要根据外界光线强度的变化,对背光的亮度做出相应的调节,以适合人眼观看的舒适度。


基于上述2种原因,考虑到设备功耗的降低以及使用的便利性,本文在嵌入式Linux下,设计了一种使用S3C2440的定时器产生PWM (Pulse Width ModulaTIon)信号,根据设备实际使用需要,和外界光线强度的变化用按键调节LCD背光亮度的解决方案。


1 基于PWM 的背光调节原理

在中小尺寸液晶显示屏中,一般采用白光LED作为显示屏的背光光源。PWM 即脉宽调制,PWM 调光就是利用人眼的视觉暂停原理,以一定的频率和占空比的方波来控制LED的导通。LED正向电流在零电流到额定工作电流之间来回切换,通过高速开关背光,周期循环地提供不同占空比的方波,实现亮度的调节。只要导通时LED正向电流大小是恒定的,发出的白光就不会发生色偏,而且只要频率大干100Hz,人眼看到的将是连续的光源。

图1是脉宽调制信号的波形。假设高电平代表打开背光,低电平代表关闭背光,背光打开和关闭时间的比例不同会得到不同占空比的方波。从输出的波形来看,波的平均功率是不一样的,这样就得到了不同的亮度,实现了背光的调节。

基于一种可以用按键进行调节LCD背光亮度的解决方案

图1 PWM 的波形

2 背光调节的硬件实现方案

S3C2440[4]是三星公司推出的一款基于ARM920T内核的16/32位RISC嵌入式微处理器。其内部有5个16位的定时器,其中前4 个定时器(TOUT0~TOUT3)具有PWM 功能,第5个定时器(TOUT4)是一个没有输出引脚的内部定时器,另外定时器TOUT0有一个死区发生器,通常用于大电流设备控制。


PWM 信号可以用硬件产生,也可以由软件产生。由于用软件定时产生PWM 信号外围电路简单,脉冲宽度精度高,控制灵活,所以本方案用S3C2440的定时器TOUT1,软件定时产生PWM 信号,通过改变TOUT1端口GPB1输出脉冲信号占空比,控制背光的开关。LCD背光调节电路如图2所示。

基于一种可以用按键进行调节LCD背光亮度的解决方案

图2 LCD背光调节电路图

图2中ZXLD1100是一个电感式的PFM(PulseFrequency 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所示。

基于一种可以用按键进行调节LCD背光亮度的解决方案

图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()向内核注册混杂设备,混杂设备是字符设备的抽象。背光驱动中混杂设备的定义如下:

基于一种可以用按键进行调节LCD背光亮度的解决方案

在卸载驱动时,内核调用退出函数s3c_bl_pwm_exit(),注销中断和混杂设备,完成和初始化函数相反的行为。

3.2 按键中断和定时器处理程序

当按键被按下后,将发生快速中断,触发中断处理程序buttons_interrupt()。在中断处理程序中,当按键初始状态为抬起(KEY_UP)时,把按键状态设置为不确定(KEY_DOWNX),然后启动定时器延时去抖,进入定时器处理函数。如果当前按键初始状态不是抬起则退出中断处理程序。在定时器处理程序中,读取按键GPIO端口电平,查询按键是否仍然被按下。如果按键仍被按下且按键状态是不确定(KEY_DOWNX),则标识当前按键状态为按下(KEY_DOWN)。同时延时一个相对去抖更长的时间,启动一个新的定时器,每次定时器到期后,查询按键是否仍然被按下且按键状态为按下(KEY_DOWN),如果是,则重新启动新的定时器;若查询到已经没有按下,则标识按键状态为抬起,这时候应该等待新的按键中断。每次标识按键状态为按下(KEY _DOWN)时,应该调用背光调节函数bl_handler()依据传入的按键编号调节背光亮度。按键中断和定时器处理函数的流程如图4所示。

基于一种可以用按键进行调节LCD背光亮度的解决方案

图4 按键中断和定时器处理函数的流程图

3.3 PWM 设置函数

PWM 定时器中有2个寄存器TCNTBn和TCMPBn,分别为定时器计数缓存寄存器和定时器比较缓存寄存器[10].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 输出频率为200Hz,高电平比例为1/3的波形,通过示波器看到GPB1端口所输出波形如图5所示。

基于一种可以用按键进行调节LCD背光亮度的解决方案

图5 GPB1输出波形

通过测试,可以得到如表1所示的该手持式设备功耗与背光亮度相关的数据。

表1 系统不同背光亮度的功耗对比表

基于一种可以用按键进行调节LCD背光亮度的解决方案

从表1中可以看出背光亮度等级越低,系统的功耗越小。所以,在该设备使用时,在环境允许的条件下,可以降低背光亮度等级,以减少功耗。本文的背光驱动程序为背光调节提供了7级的亮度控制。在实际使用的过程中,设置1/3的亮度即可,只有在特殊的场合才需要设置为高亮。在LCD不工作的时候,可以调低或者关闭背光,这样可以大大节省能耗。在应用时,为了确保人眼看不到LED周期亮灭的情况,以获得视觉上的满意效果,PWM 输出的频率一般在设置在100~300Hz之间比较合适,否则会给人闪烁的感觉。


5 结 语

本文在嵌入式Linux下,设计了一种基于PWM 调节LCD背光的软硬件实现方案。本方案与普通的线性调光相比,更符合人们对LED调光精度、效率以及效果的要求,同时可以降低系统功耗并能满足手持式设备调节背光的要求,该方案已经在一款手持设备产品上得到了应用。在实际应用中,为了防止当PWM 频率落在200~20kHz之间时,LED驱动电路的电感和电容产生人耳听得见的噪声,可以根据需求,增加成本,用高耐压的钽电容代替陶瓷电容;还可以牺牲调光精度,把开关频率提高到20kHz以上,跳出人耳听觉的范围。


推荐阅读

史海拾趣

GE Industrial Solutions公司的发展小趣事
通过输入不同频率的信号,测量输出信号的幅度和相位变化,以评估电路的频率响应特性。
Frequency Devices公司的发展小趣事

Frequency Devices公司自成立之初,便以技术创新为核心驱动力。在20世纪90年代初,公司研发团队成功开发出一种新型高频滤波器,该滤波器在信号传输效率和稳定性上实现了重大突破。这一创新不仅解决了当时通信领域的一大技术难题,还迅速获得了市场的广泛认可。随着技术的不断迭代,Frequency Devices公司持续投入研发,推出了更多高性能、低成本的高频电子产品,逐步奠定了其在行业内的领先地位。

Hamamatsu公司的发展小趣事

为了进一步扩大市场份额,Frequency Devices公司积极实施国际化战略。公司通过参加国际电子展会、建立海外销售网络、与国际知名企业建立合作关系等方式,不断提升品牌国际影响力。同时,公司还根据不同国家和地区的市场特点,定制化开发符合当地需求的高频电子产品。这些努力使得Frequency Devices公司的产品成功打入多个国际市场,实现了全球化布局。

天钰(FITIPOWER)公司的发展小趣事

面对快速变化的市场需求,Frequency Devices公司展现出了敏锐的市场洞察力。在21世纪初,随着无线通信技术的快速发展,对高频电子元件的需求急剧增加。公司及时调整产品策略,加大了对无线通信领域高频产品的研发投入,并成功推出了一系列适用于手机、基站等通信设备的高频滤波器、功率放大器等关键元件。这些产品不仅满足了市场需求,还进一步巩固了公司在行业内的市场地位。

Hanghsing Enterprise Co Ltd公司的发展小趣事

为了进一步扩大市场份额,Frequency Devices公司积极实施国际化战略。公司通过参加国际电子展会、建立海外销售网络、与国际知名企业建立合作关系等方式,不断提升品牌国际影响力。同时,公司还根据不同国家和地区的市场特点,定制化开发符合当地需求的高频电子产品。这些努力使得Frequency Devices公司的产品成功打入多个国际市场,实现了全球化布局。

HIT(日立)公司的发展小趣事
定期对电路进行检查和维护,及时发现并处理潜在问题,确保电路的安全性和稳定性。

问答坊 | AI 解惑

逻辑综合器的故事

FPGA设计流程中,逻辑综合的过程非常重要。 由于HDL代码的多样性,逻辑综合的质量对最终设计性能的影响非常大。       在.18微米到.15微米的时代,FPGA的性能很大程度上取决于门延迟。根据我的经验,微米时代,FPGA内部延迟 ...…

查看全部问答>

彩转黑摄像机的“高感度”和“低照度”

关键字:彩转黑摄像机     近年来,随着芯片技术的更新换代,彩转黑摄像机的整体性能有了很大的提高,“高感度,低照度”是各大厂家力推的产品特色,可以说是对弱光环境的一次集体的叫板。     对于安防监控来说,对图像品质 ...…

查看全部问答>

到底掌握多少单片机才算懂?

单片机种类繁多,作为一个开发者。到底需要掌握多少种呢? 掌握多少种才算懂?…

查看全部问答>

炉温检测

单片机  pid算法 温度检测原理图…

查看全部问答>

请教:如何控制2.4G射频识别角度??

在做2.4G射频识别时,发现有源射频识别系统的角度很难控制,尤其当标签距离识别设备小于10米时,角度基本上都是360。 在网上看到有些高人说,射频角度可以控制在15°...有谁有这方面的经验没有?如何有效控制有源射频的识别角度。 我的想法是这样 ...…

查看全部问答>

如何调整核心内存的大小

向大家请教个问题:默认情况下,4G的内存,核心内存和用户态内存分别是2G,现在我写了一个驱动,需要更多的核心内存,因此想把核心内存调整的大些,应该如何做到呢?   另外,我还有个机器是8G内存,跑wxp64位系统,也想调整核心内存更 ...…

查看全部问答>

手机开发USB口问题

将手机和PC机用USB相连: 当先将未开机的手机用USB线连到PC上,再打开手机时,从PC上向手机发送AT指令,手机能向PC返回OK;可是当先将手机开机,再将手机用USB线连接到PC机时,从PC上向手机发送AT指令,手机却不能向PC返回任何东西。不知以上是什么 ...…

查看全部问答>

ioctl返回的地址问题?初学者,高人指点。

请问ioctl返回的地址是虚拟地址还是物理地址? 小弟在做dm6446上的resize,用ioctl返回的resize驱动中申请的buffer的地址是在用户空间是不能用的? 大家指教。 ioctl返回的地址问题?初学者,高人指点。…

查看全部问答>

字符串操作的问题

我需要拆分一个字符串,没有找到好的方法。 比如: cstring FullName = \"Storage Card\\\\media\\\\test.mp3\"; cstring strDir = \"\"; cstring strName = \"\"; 我的最终目的是 strDir = \"Storage Card\\\\media\\\\\"; strName = \"tes ...…

查看全部问答>

data verification failed at address 0x0 ?

本帖最后由 dontium 于 2015-1-23 12:45 编辑 仿真器连接正常,我用了光盘里的一个例子,编译好后下载.out程序时出现 data verification failed at address 0x0, please verify target memoty and memory map 以上错误,请问这是什么原因,我用的 ...…

查看全部问答>