在研发嵌入式产品时,往往会用到LCD(液晶屏)来显示图形界面,而液晶屏的显示亮度则需要背光系统去调节。
1.数字调光,又称波宽控制调光(Pulse Width Modulation,简称PWM): 通过PWM 波开启和关闭LED 来改变正向电流的导通时间以达到亮度调节的效果。
2.模拟调光 :通过改变LED 回路中电流大小以达到调光。
1.模拟调光:在可调节的电流范围内, 可调档位受到限制,并且较为复杂,
2.数字调光:可通过改变高低电平的占空比来任意改变LED 的开启时间, 从而使亮度调节的档位增多。
为了使用起来简单方便,节约成本,目前主流的背光亮度调节功能多采用PWM机制。
PWM是Pulse Width Modulation(脉冲宽度调制)的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其本质是一种对模拟信号电平进行数字编码的方法。
在嵌入式设备中,PWM多用于控制马达、LED、振动器等模拟器件。
一句话来说:就是将电源方波数位化,调节PWM方波的占空比,达到控制电流的目的,进而可调整背光亮度。
具体的说:比如LED背光闪烁1000次,其中500次开启和500次关闭,如果开启的时间停顿1秒,关闭的时间停顿0.5秒,这时的屏幕亮度就要比开启和关闭停顿时间一样的背光系统强。这样用户在调节屏幕亮度的时候,实际上亮度的明暗得益于LED背光闪烁的变化。
在实际的产品中,LED背光这种明暗时间的转变速度非常的快,采用PWM调光的普通大众显示器其工作频率一般在200Hz-1000Hz左右,而人眼在频率达到100Hz的时候就已经难以察觉明显的明暗变化了,因为人眼感知亮度的过程是积累的,在闪烁的速度足够快的时候,人眼看到的画面是“常亮”的。
Example:把PWM的一个周期分成10块
这10块时间里,只有1块的时间让LED导通,剩下9块的时间里LED截止。假设PWM信号的幅值是5V,那么在导通的1块时间里LED电压的确是5V的,但是在剩下9块时间里,它的电压却是0V。也就是说从一个周期整体看来,LED的平均电压只有50.1+00.9=0.5V。PWM信号频率很高的,我们无法通过肉眼来观察到每一个周期LED灯亮灭的变化过程,所以只好通过平均电压这样一种方式来决定这个LED的亮的程度了。
1、不会产生任何色谱偏移。因为LED始终工作在满幅度电流和0之司。
2、可以有极高的调光精确度。因为脉中波形完全可以控制到很高的精度,所以很容易实现万分之一的精度。
3、可以和数字控制技术相结合来进行控制。因为任何数字都可以很容易变换成为一个PWM信号。
4、即使在很大范围内调光,也不会发生闪烁现象。因为不会改变恒流源的工作条件(升压比或降压比),更不可能发生过热等问题。
1、PWM占空比控制不控制电流;调节之前亮度就定了,是100%,所以不要和电压和电流联系起来;PWM控制通过占空比,就是调整在一个特定的时间周期(如1ms)内,点亮一个百分比的时间,如1/2,1/4。
2、脉冲频率的选择因为LED是处于快速开关状态,假如工作频率很低,人眼就会感到闪烁。为了充分利用人眼的视觉残留现象,它的工作频率应当高于100Hz,最好为200HZ。
3、消除调光弓起的啸声; 虽然200HZ以上人眼无法察觉,可是一直到20kHz却都是人耳听觉的范围。这时候就有可能会听到丝丝的声音。解决这个问题有两种方去,一是把开关频率提高到20kHz以上,跳出人耳听觉的范围。但是频率过高也会弓起一些问题,因为各种寄生参数的影响,会使脉冲波形(前后沿)产生畸变。
Linux系统背光子系统PWM机制主要包括pwm和backlight两部分。
backlight_peb: backlight {
compatible = "pwm-backlight"; //调用通用背光设备驱动
brightness-levels = < 0 4 8 16 32 64 128 255>; //背光亮度调节等级
default-brightness-level = <5>; //默认背光亮度等级
pwms = <&pwm3 0 5000000>; //调用pwm3节点 并配置pwm参数 0是默认设备号 5000000为默认周期ns
};
pwm
配置&pwm3 {
compatible = "fsl,imx6ul-pwm"; //调用pwm控制器驱动
pinctrl-0 = <&pinctrl_pwm3>; //配置soc引脚输出功能为pwm功能
};
配置编译以下驱动
# 用户层背光节点驱动
/drivers/video/backlight/backlight.c
# 通用背光pwm设备驱动
/drivers/video/backlight/pwm_bl.c
# pwm核心层驱动
/drivers/pwm/core.c
# pwm控制器驱动
/drivers/pwm/pwm-xxx.c
背光子系统文件位于/sys/class/backlight/XXX(背光设备名称)/中,该目录下的属性文件有:
actual_brightness brightness max_brightness subsystem@
bl_power device@ power/ uevent
其中,主要用到的是brightness:当前实际的亮度值(内核中记录的值)。
可以使用 "cat /sys/class/backlight/XXX/brightness"查看当前背光亮度。
也用 "echo 数字(背光亮度等级) >> /sys/class/backlight/XXX/brightness"设置背光亮度。