i.MX6ULL终结者屏幕背光调节例程背光调节简介

我们平常使用的显示器或者手持设备,不如手机,平板等等,它们的屏幕的背光亮度都是可以调整的。通过调节背光可以控制屏幕的亮度,可以使屏幕在不同环境下达到最佳的显示效果和节能的目的。

一般我们控制屏幕亮度的都是采用PWM(脉冲宽度调节)调光电源的方式。首先我们先来看下PWM(脉冲宽度调节)工作方式。脉冲宽度调节(PWM)是一种脉冲控制方式,被广泛应用在测量、通信、功率控制以及变换灯多个领域。

PWM有两个关键的术语:频率和占空比。频率就是开关速度,把一次开关算作一个周期,那么频率就是1秒内进行了多少次开关。占空比就是一个周期内高电平时间和低电平时间的比例,一个周期内高电平时间越长占空比就越大,反之占空比就越小。占空比用百分比表示,如果一个周期内全是低电平那么占空比就是0%,如果一个周期内全是高电平那么占空比就是100%。

我们通过PWM控制屏幕的电源背光芯片,通过调节PWM的频率和占空比,就可以控制屏幕背光电源的输出电压大小,进而可以起到控制屏幕的亮度调节了。迅为的所有屏幕都支持背光亮度调节,我们只需要给屏幕控制背光电源芯片使能的引脚提供一个PWM的信号就可以。

通过查看《I.MX6ULL 参考手册.pdf》这个文档,我们可以看到第38章是关于i.MX6ULL的PWM介绍。I.MX6ULL的pwm包含一个16位的计数器和一个4*16的数据FIFO。最多支持8路PWM信号,引出的接口如图 1所示:
i.MX6ULL终结者屏幕背光调节例程背光调节简介
i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 1

从上图我们可以看到每路PWM复用到的IO。然后我们看下PWM的内部结构如图 2所示:

i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 2

从上图我们可以看到PWM分为7部分:
标识1处是时钟源选择,可选三种:ipg_clk,ipg_clk_highfreq和ipg_clk_32k。
标识2处是分频器,对输入的时钟就行分频。
标识3处是16位的计数器,保存着PWM的计数值。
标识4处是16位的周期寄存器,用来控制pwm的频率。
标识5处是16位的采样寄存器,用来控制pwm的占空比。
标识6处是中断信号,如果使能了响应的寄存器,pwm可以产生中断。
标识7处是IO引脚输出,对应的IO输出PWM信号。

上面我们说到的频率和占空比的具体取值,可以通过修改PWM相应的寄存器来设置。PWM的16位计数器是向上的计数器,计数器从0开始累加计数,直到计数值等于寄存器PWMx_PWMPR(x=1~8)+1,然后计数器就会重新从0开始计数。寄存器PWMx_PWMPR可以设置 PWM 的频率。
在一个周期内,PWM从0开始计数的时候,PWM引脚先输出高电平(默认情况下,可以通过配置输出低电平)。采样FIFO中保存的采样值会在每个时钟和计数器值进行比较,当采样值和计数器相等的时候PWM引脚就会改为输出低电平(默认情况下,同样可以通过配置输出高电平)。计数器会持续计数,直到和周期寄存器PWMx_PWMPR(x=1~8) + 1的值相等,这样一个周期就完成了。所以采样FIFO控制着占空比,而采样FIFO里面的值来源于采样寄存器PWMx_PWMSAR,因此相当于PWMx_PWMSAR控制着占空比。至此PWM信号的频率和占空比设置我们就知道该如何去做了。
在使用PWM的时候,首先根据我们的要求,通过PWMx_PWMPR和PWMx_PWMSAR设置好PWM的频率和占空比,然后在开启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写入数据。

接下来我们来看一下PWM的几个重要寄存器,首先是PWM1_PWMCR寄存器,结构图如图 3所示:
i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 3

该寄存器需要用到的位如下:
FWM(bit27:26):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的时候表示在休眠模式下继续工作;为1的时候表示在休眠模式下停止工作。
WAITEN(bit23):设置等待模式下pwm是否工作。为0的时候表示在等待模式下继续工作;为1的时候表示在等待模式下停止工作。
DEGEN(bit22):设置调试模式下PWM是否工作。为0的时候表示在调试模式下继续工作;为1的时候表示在调试模式下停止工作。
BCTR(bit21):字节数据交换控制位。用来控制16位的数据进入FIFO的字节顺序。为0的时候不交换;为1的时候交换。
HCRT(bit20):半字交换控制位。用来决定从32位IP总线接口传输来的哪个半字数据写入采样寄存器的低16位中。
POUTC(bit19:18):PWM输出控制位。为0的时候表示PWM先输出高电平,当计数器值和采样值相等的话就输出低电平。为1的时候相反,为2或3的时候PWM信号不输出。本章我们设置为0,也就是一开始输出高电平,当计数器值和采样值相等的话就改为低电平,这样采样值越大高电平时间就越长,占空比就越大。
CLKSRC(bit17:16):PWM时钟源选择位。用来选择PWM的时钟源。为0的时候关闭;为1的时候选择ipg_clk为时钟源;为2的时候选择ipg_clk_highfreq为时钟源;为3的时候选择ipg_clk_32k为时钟源。本章我们设置为1选择ipg_clk为PWM的时钟源,因此PWM时钟源频率为66MHz。
PRESCALER(bit15:4):分频值位。可以设置0-4095(地应着分频:1-4096).
SWR(bit3):软复位。设置为1的时候PWM复位,复位完成以后,此位会自动清零。
REPEAT(bit2:1):重复采样设置位。用来设置 FIFO 中的每个数据能用几次。当为0的时候使用1次,当为1的时候可以使用2次,当为2的时候可以使用4次,当为3的实收可以使用8次。
EN(bit0):PWM使能位。为0的时候关闭PWM;为1的时候使能PWM。

然后是寄存器PWMx_PWMSR寄存器,结构如图 4所示:
i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 4

该寄存器的各个位定义如下:
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 个有效数据。

接下来是寄存器PWMx_PWMIR,结构图图 5所示:
i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 5

该寄存器是PWM的的终端寄存器,该寄存器有效位只有三个,分别如下:
CIE(bit2):比较中断使能位,为1的时候使能比较中断,为0的时候关闭比较中断。
RIE(bit1):翻转中断使能位,当计数器值等于采样值并回滚到0的时候就会产生此中断,为1的时候使能翻转中断,为0的时候关闭翻转中断。
FIE(bit0):FIFO空中断,为0的时候,关闭为1的时候使能。

接下来是寄存器PWM1_PWMPR,结构图如图 6所示:
i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 6

该寄存器是PWM的周期寄存器,通过设置此寄存器来调整PWM的频率,该寄存器只有低16位有效,当计数器的值小于SAMPLE的时候输出高电平(或低电平)。当计数器值大于等于SAMPLE,小于寄存器PWM1_PWMPR的PERIO的时候输出低电平(或高电平)。

当PWM计数器的值等于PERIOD+1的时候就会从0开始重新计时。PWM的频率计算公式如下:
PWM(Hz) = PCLK(Hz) / (PERIOD + 2)

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

关于PWM有关的寄存器我们就介绍到这里,大家可以参考《I.MX6ULL参考手册.pdf》,查看更详细的描述。

本例程我们使用的是i.MX6 ULL的PWM1,从前面PWM对应的IO图中我们看到PWM1对应的IO有三个可以复用:ENET1_RX_DATA0,GPIO1_IO8,LCD_DATA00,我们选择使用的是GPIO1_IO8,如图 7所示:
i.MX6ULL终结者屏幕背光调节例程背光调节简介

图 7

要使用PWM,我们需要对其进行配置,具体配置如下:
1.配置GPIO1_IO8复用为PWM1功能
2.初始化PWM1(选择时钟源,分频值,占空比和频率)
设置中断(FIFO 中的采样值每个周期都会少一个,所以需要不断的向 FIFO 中写入采样值,防止为空。我们可以使能FIFO空中断,这样当FIFO为空的时候就会触发相应的中断,然后在中断处理函数中向FIFO写入采样值。)
3.使能PWM1i.MX6ULL终结者屏幕背光调节例程背光调节简介