LCD背光调节实验

您所在的位置:网站首页 海信led32k20jd背光电压低 LCD背光调节实验

LCD背光调节实验

2024-07-10 17:16| 来源: 网络整理| 查看: 265

目录 LCD 背光调节简介硬件原理分析实验程序编写编译下载验证编写Makefile 和链接脚本编译下载

不管是使用显示器还是手机,其屏幕背光都是可以调节的,通过调节背光就可以控制屏幕的亮度。在户外阳光强烈的时候可以通过调高背光来看清屏幕,在光线比较暗的地方可以调低背光,防止伤眼睛并且省电。正点原子的三款RGB LCD 也支持背光调节,本章我们就来学习如何调节LCD 背光。

LCD 背光调节简介

正点原子的三个RGB LCD 都有一个背光控制引脚,给这个背光控制引脚输入高电平就会点亮背光,输入低电平就会关闭背光。假如我们不断的打开和关闭背光,当速度足够快的时候就不会感觉到背光关闭这个过程了。这个正好可以使用PWM 来完成,PWM 全称是Pulse Width Modulation,也就是脉冲宽度调制,PWM 信号如图29.1.1 所示: 在这里插入图片描述 PWM 信号有两个关键的术语:频率和占空比,频率就是开关速度,把一次开关算作一个周期,那么频率就是1 秒内进行了多少次开关。占空比就是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分之表示,如果一个周期内全是低电平那么占空比就是0%,如果一个周期内全是高电平那么占空比就是 100%。

我们给LCD 的背光引脚输入一个PWM 信号,这样就可以通过调整占空比的方式来调整LCD 背光亮度了。提高占空比就会提高背光亮度,降低占空比就会降低背光亮度。重点就在于PWM 信号的产生和占空比的控制,很幸运的是,I.MX6U 提供了PWM 外设,因此我们可以配置PWM 外设来产生PWM 信号。

打开《I.MX6ULL 参考手册》的第40 章“Chapter 40 Pulse Width Modulation(PWM)”,I.MX6U一共有8 路PWM 信号,每个PWM 包含一个16 位的计数器和一个4 x 16 的数据FIFO,I.MX6U的PWM 外设结构如图29.1.2 所示: 在这里插入图片描述 图29.1.2 中的各部分功能如下: ①、此部分是一个选择器,用于选择PWM 信号的时钟源,一共有三种时钟源:ipg_clk、ipg_clk_highfreq 和ipg_clk_32k。 ②、这是一个12 位的分频器,可以对①中选择的时钟源进行分频。 ③、这是PWM 的16 位计数器寄存器,保存着PWM 的计数值。 ④、这是PWM 的16 位周期寄存器,此寄存器用来控制PWM 的频率。 ⑤、这是PWM 的16 位采样寄存器,此寄存器用来控制PWM 的占空比。 ⑥、此部分是PWM 的中断信号,PWM 是提供中断功能的,如果使能了相应的中断的话就会产生中断。 ⑦、此部分是PWM 对应的输出IO,产生的PWM 信号就会从对应的IO 中输出,I.MX6U-ALPHA 开发板的LCD 背光控制引脚连接在I.MX6U 的GPIO1_IO8 上,GPIO1_IO8 可以复用为PWM1_OUT。

可以通过配置相应的寄存器来设置PWM 信号的频率和占空比,PWM 的16 位计数器是个向上计数器,此计数器会从0X0000 开始计数,直到计数值等于寄存器PWMx_PWMPR(x=1~8) + 1,然后计数器就会重新从0X0000 开始计数,如此往复。所以寄存器PWMx_PWMPR 可以设置PWM 的频率。

在一个周期内,PWM 从0X0000 开始计数的时候,PWM 引脚先输出高电平(默认情况下,可以通过配置输出低电平)。采样FIFO 中保存的采样值会在每个时钟和计数器值进行比较,当采样值和计数器相等的话PWM 引脚就会改为输出低电平(默认情况下,同样可以通过配置输出高电平)。计数器会持续计数,直到和周期寄存器PWMx_PWMPR(x=1~8) + 1 的值相等,这样一个周期就完成了。所以,采样FIFO 控制着占空比,而采样FIFO 里面的值来源于采样寄存器PWMx_PWMSAR,因此相当于PWMx_PWMSAR 控制着占空比。至此,PWM 信号的频率和占空比设置我们就知道该如何去做了。

PWM 开启以后会按照默认值运行,并产生PWM 波形,而这个默认的PWM 一般并不是我们需要的波形。如果这个PWM 波形控制着设备的话就会导致设备因为接收到错误的PWM 信号而运行错误,严重情况下可能会损坏设备,甚至人身安全。因此,在开启PWM 之前最好设置好PWMx_PWMPR 和PWMx_PWMSAR 这两个寄存器,也就是设置好PWM 的频率和占空比。

当我们向PWMx_PWMSAR 寄存器写入采样值的时候,如果FIFO 没满的话其值会被存储到FIFO 中。如果FIFO 满的时候写入采样值就会导致寄存器PWMx_PWMSR 的位FWE(bit6)置1,表示FIFO 写错误,FIFO 里面的值也并不会改变。FIFO 可以在任何时候写入,但是只有在PWM 使能的情况下读取。寄存器PWMx_SR 的位FIFOAV(bit2:0)记录着当前FIFO 中有多少个 数据。从采样寄存器PWMx_PWMSAR 读取一次数据,FIFO 里面的数据就会减一,每产生一个周期的PWM 信号,FIFO 里面的数据就会减一,相当于被用掉了。PWM 有个FIFO 空中断,当FIFO 为空的时候就会触发此中断,可以在此中断处理函数中向FIFO 写入数据。

关于I.MX6U 的PWM 的原理知识就讲解到这里,接下来看一下PWM 的几个重要的寄存器,本章我们使用的是PWM1,首先看一下寄存器PWM1_PWMCR 寄存器,此寄存器结构如图29.1.2 所示:

在这里插入图片描述 寄存器PWM1_PWMCR 用到的重要位如下:

FWM(bit27:26):FIFO 水位线,用来设置FIFO 空余位置为多少的时候表示FIFO 为空。设置为0 的时候表示FIFO 空余位置大于等于1 的时候FIFO 为空;设置为1 的时候表示FIFO 空余位置大于等于2 的时候FIFO 为空;设置为2 的时候表示FIFO 空余位置大于等于3 的时候FIFO 为空;设置为3 的时候表示FIFO 空余位置大于等于4 的时候FIFO 为空。

STOPEN(bit25):此位用来设置停止模式下PWM 是否工作,为0 的话表示在停止模式下PWM 继续工作,为1 的话表示停止模式下关闭PWM。

DOZEN(bit24):此位用来设置休眠模式下PWM 是否工作,为0 的话表示在休眠模式下PWM 继续工作,为1 的话表示休眠模式下关闭PWM。

WAITEN(bit23):此位用来设置等待模式下PWM 是否工作,为0 的话表示在等待模式下PWM 继续工作,为1 的话表示等待模式下关闭PWM。

DEGEN(bit22):此位用来设置调试模式下PWM 是否工作,为0 的话表示在调试模式下PWM 继续工作,为1 的话表示调试模式下关闭PWM。

BCTR(bit21):字节交换控制位,用来控制16 位的数据进入FIFO 的字节顺序。为0 的时候不进行字节交换,为1 的时候进行字节交换。

HCRT(bit20):半字交换控制位,用来决定从32 位IP 总线接口传输来的哪个半字数据写入采样寄存器的低16 位中。

POUTC(bit19:18):PWM 输出控制控制位,用来设置PWM 输出模式,为0 的时候表示PWM 先输出高电平,当计数器值和采样值相等的话就输出低电平。为1 的时候相反,当为2 或者3 的时候PWM 信号不输出。本章我们设置为0,也就是一开始输出高电平,当计数器值和采样值相等的话就改为低电平,这样采样值越大高电平时间就越长,占空比就越大。

CLKSRC(bit17:16):PWM 时钟源选择,为0 的话关闭;为1 的话选择ipg_clk 为时钟源;为2 的话选择ipg_clk_highfreq 为时钟源;为3 的话选择ipg_clk_32k 为时钟源。本章我们设置为1,也就是选择ipg_clk 为PWM 的时钟源,因此PWM 时钟源频率为66MHz。

PRESCALER(bit15:4):分频值,可设置为04095,对应着14096 分频。

SWR(bit3):软件复位,向此位写1 就复位PWM,此位是自清零的,当复位完成以后此位会自动清零。

REPEAT(bit2:1):重复采样设置,此位用来设置FIFO 中的每个数据能用几次。可设置0~ 3,分别表示FIFO 中的每个数据能用1~4 次。本章我们设置为0,即FIFO 中的每个数据只能用一次。

EN(bit0):PWM 使能位,为1 的时候使能PWM,为0 的时候关闭PWM。 接下来看一下寄存器PWM1_PWMIR 寄存器,这个是PWM 的中断控制寄存器,此寄存器结构如图29.1.3 所示: 在这里插入图片描述 寄存器PWM1_PWMIR 只有三个位,这三个位的含义如下:

CIE(bit2):比较中断使能位,为1 的时候使能比较中断,为0 的时候关闭比较中断。

RIE(bit1):翻转中断使能位,当计数器值等于采样值并回滚到0X0000 的时候就会产生此中断,为1 的时候使能翻转中断,为0 的时候关闭翻转中断。

FIE(bit0):FIFO 空中断,为1 的时候使能,为0 的时候关闭。

再来看一下状态寄存器PWM1_PWMSR,此寄存器结构如图29.1.4 所示: 在这里插入图片描述 寄存器PWM1_PWMSR 各个位的含义如下:

FWE(bit6):FIFO 写错误事件,为1 的时候表示发生了FIFO 写错误。 CMP(bit5):FIFO 比较事件发标志位,为1 的时候表示发生FIFO 比较事件。 ROV(bit4):翻转事件标志位,为1 的话表示翻转事件发生。 FE(bit3):FIFO 空标志位,为1 的时候表示FIFO 位空。 FIFOAV(bit2:1):此位记录FIFO 中的有效数据个数,有效值为0~4,分别表示FIFO 中有0~ 4 个有效数据。

接下来是寄存器PWM1_PWMPR 寄存器,这个是PWM 周期寄存器,可以通过此寄存器来设置PWM 的频率,此寄存器结构如图29.1.5 所示: 在这里插入图片描述

从图29.1.5 可以看出,寄存器PWM1_PWMPR 只有低16 位有效,当PWM 计数器的值等于PERIOD+1 的时候就会从0X0000 重新开始计数,开启另一个周期。PWM 的频率计算公式如下:

PWMO(Hz) = PCLK(Hz) / (PERIOD + 2)

其中PCLK 是最终进入PWM 的时钟频率,假如PCLK 的频率为1MHz,现在我们要产生一个频率为1KHz 的PWM 信号,那么就可以设置PERIOD = 1000000 / 1000 – 2 = 998。

最后来看一下寄存器PWM1_PWMSAR,这是采样寄存器,用于设置占空比的,此寄存器结构如图29.1.6 所示: 在这里插入图片描述

此寄存器也是只有低16 位有效,为采样值。通过这个采样值即可调整占空比,当计数器的值小于SAMPLE 的时候输出高电平(或低电平)。当计数器值大于等于SAMPLE,小于寄存器PWM1_PWMPR 的PERIO 的时候输出低电平(或高电平)。同样在上面的例子中,假如我们要设置PWM 信号的占空比为50%,那么就可以将SAMPLE 设置为(PERIOD + 2) / 2 = 1000 / 2=500。

关于PWM 有关的寄存器就介绍到这里,关于这些寄存器详细的描述,请参考《I.MX6ULL参考手册》第2480 页的40.7 小节。本章我们使用I.MX6U 的PWM1,PWM1 的输出引脚为GPIO1_IO8,配置步骤如下:

1、配置引脚GPIO1_IO8 配置GPIO1_IO08 的复用功能,将其复用为PWM1_OUT 信号线。

2、初始化PWM1 初始化PWM1,配置所需的PWM 信号的频率和默认占空比。

3、设置中断 因为FIFO 中的采样值每个周期都会少一个,所以需要不断的向FIFO 中写入采样值,防止其为空。我们可以使能FIFO 空中断,这样当FIFO 为空的时候就会触发相应的中断,然后在中断处理函数中向FIFO 写入采样值。

4、使能PWM1 配置好PWM1 以后就可以开启了。

硬件原理分析

本试验用到的资源如下: ①、指示灯LED0。 ②、RGB LCD 接口。 ③、按键KEY0

本实验用到的硬件原理图参考第二十四章,本章实验我们一开始设置RGB LCD 的背光亮度PWM 信号频率为1KHz,占空比为10%,这样屏幕亮度就很低。然后通过按键KEY0 逐步的提升PWM 信号的占空比,按照10%步进。当达到100%以后再次按下KEY0,PWM 信号占空比回到10%重新开始。LED0 不断的闪烁,提示系统正在运行。

实验程序编写

本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 20_pwm_lcdbacklight。

本章实验在上一章例程的基础上完成,更改工程名字为“backlight”,然后在bsp 文件夹下创建名为“backlight”的文件夹,然后在bsp/backlight 中新建bsp_backlight.c 和bsp_backlight.h这两个文件。在bsp_backlight.h 中输入如下内容:

1 #ifndef _BACKLIGHT_H 2 #define _BACKLIGHT_H 3 /*************************************************************** 4 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved. 5 文件名: bsp_backlight.c 6 作者: 左忠凯 7 版本: V1.0 8 描述: LCD背光PWM驱动头文件。 9 其他: 无 10 论坛: www.openedv.com 11 日志: 初版V1.0 2019/1/22 左忠凯创建 12 ***************************************************************/ 13 #include "imx6ul.h" 14 15 /* 背光PWM结构体*/ 16 struct backlight_dev_struc 17 { 18 unsigned char pwm_duty; /* 占空比*/ 19 }; 20 21 /* 函数声明*/ 22 void backlight_init(void); 23 void pwm1_enable(void); 24 void pwm1_setsample_value(unsigned int value); 25 void pwm1_setperiod_value(unsigned int value); 26 void pwm1_setduty(unsigned char duty); 27 void pwm1_irqhandler(void); 28 29 #endif

文件bsp_backlight.h 文件内容很简单,在第16 行定义了一个背光PWM 结构体,剩下的就是函数声明。在文件bsp_backlight.c 中输入如下内容:

1 #include "bsp_backlight.h" 2 #include "bsp_int.h" 3 #include "stdio.h" 4 5 struct backlight_dev_struc backlight_dev; /* 背光设备*/ 6 7 /* 8 * @description : pwm1中断处理函数 9 * @param : 无 10 * @return : 无 11 */ 12 void pwm1_irqhandler(void) 13 { 14 if(PWM1->PWMSR & (1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3