LED 显示屏的驱动功能可以分为显示内容与像素驱动两个方面,前者代表显示屏上要展示的影像、图片、文字或符号,后者则是本章之前所描述的电路在每个LED 像素上展示属于该像素的亮度信息,通常以很高的速率动态显示。一个高分辨率的显示屏会包含数量巨大的像素,几乎所有的LED 屏都会将一个屏幕分解成多个模块,把来自视频源或其他数据源的显示内容在几何上作如是分割,经分割后的显示内容分派到各个模块,这些内容一般被缓存在相应模块中的图像存储器中,每个模块把各自存储的内容稳定地显示在LED 阵列上,设计与实现方案应确保显示内容与缓存内容的同步。一旦上层显示控制器更新了显示内容,LED 阵列上显示内容需要立刻得以体现。正常的电视帧刷新频率不低于25Hz,因此模块的驱动电路应该能足够快速地接收上层显示控制器发送的图像数据。
LED 模块至少应该具备以下两个功能:①接收当前模块每个像素的显示数据,缓存模块图像。它们代表的是当前模块需要显示的内容。如果是单色屏,每个像素只是一个二进制变量;如果是全彩屏,它是三个字节的RGB数据。②根据缓存的模块图像驱动每个像素,把缓存的图像以动态扫描的方式稳定显示在面板上。由于把图像数据从模块缓存到LED 面板像素上进行显示会涉及众多像素的动态扫描,会存在多行(COM)多段(SEG),整个动态扫描过程的时序控制会变得复杂。如果还要进一步控制每个像素的亮度与色彩,则要求对每个发光二极管进行PWM 亮度调节,需要控制的要求更高。因此,在系统设计时,通常会把这样的“底层”扫描过程利用专用的LED 扫描集成电路来实现,而单片机仅用作控制与通信,构成模块的集成驱动方案。
本节以一个16×16点阵的LED 模块为例,讨论基本的集成驱动是如何设计的。把模块分成16个行,每行16个像素,每次扫一行,即使用1/16的动态扫描方案。动态扫描的驱动电路如图5.12所示,它由以下几个主要部分构成:作为控制器的单片机、由4∶16译码器及16个P-沟道场效应管Q0~Q15构成的行驱动电路、由16通道LED 恒流源驱动芯片构成的列驱动电路以及LED 点阵面板。
1.LED 面板
一方面,16×16点阵的LED 面板连接成共阳结构,每行16 个LED 的阳极相连,形成16条行驱动线,在极限情况下,整个行都亮的时候有16个LED 同时亮起,所以一般需要有行驱动管提供足够大的驱动电流。另一方面,纵向16个LED 的阴极也都按位相连,形成16条列驱动线,它们将分别接到LED 恒流源驱动芯片对应的输出驱动通道上。当行线为高电平、列线为低电平时,交叉点上的LED 将亮起,亮度取决于列驱动恒流源电流的大小。
2.行驱动电路
行驱动电路由4∶16译码器74HC154与P-沟道场效应管构成。74HC154的输入是四个二进制位[A3A2A1A0],其数值在[0000],[0001],…,[1111]之间变化,分别被译码成Y0~Y15输出有效。请注意,输出是低电平有效,即若输入是[0000]时,Y0为低电平,其余15个输出全部为高电平。译码器的输出与P-沟道行驱动管Q0~Q15的栅极相连,当栅极为低电平时,行驱动场效应管的漏-栅极间电压超过导通阈值电压,驱动管导通,供电电压Vcc与行线连通,该行被供电。上述行驱动结构将确保任意时刻有一行也只有一行得到供电。要实现行间扫描,仅需要由单片机给译码器74HC154写入不同的输入值,当输入值连续以二进制0000B~1111B(或十六进制0x0~0xF)变化时,LED 阵列的第0行~第15行的共阳极行扫描线将会依次得到驱动电压。
图5.12 16×16点阵LED 显示模块
3.列驱动电路
列驱动电路使用TI公司的LED 恒流驱动芯片TLC5926实现,它可同时驱动16路,适合当前例子中显示屏的列驱动要求。通过程序控制或调节外接电流设定电阻Re,能统一把常值电流设定在5~120mA,足可适应相当一部分应用的需要。尽管其芯片供电电压只有3.3V 或5V,但LED 驱动输出端能接受高达17V 的电压,因此在每一个输出端可以接成较高电压供电的多LED 串联驱动。当前的应用例子每条线上只有一个LED,所以图5.12中直接使用了Vcc经过行驱动FET 就可以了。
列驱动电路TLC5926实现的主要是一个16位移位寄存器、锁存器、输出恒流驱动以及一些辅助控制功能,其基本功能框图如图5.13所示。在工作过程中,把所要显示的数据通过SDI输入端在时钟CLK控制下移入,每个时钟上升沿移入1位,16个时钟之后,全部16位显示数据将进入移位寄存器,注意高位先进,最后移入的一位是与OUT0相对应的,数据高电平有效,即移入1将使对应的OUT位变低,LED点亮。移位过程与LED驱动是独立的,不会影响当前的输出控制。只有当移位寄存器上的数据被锁存到16位输出锁存器后,它才可能在输出控制信号低电平有效时被输出。当为高电平时,将禁止所有的输出,不管此时输出锁存器中是什么内容。要想把移位寄存器中的内容锁存到输出锁存器,需要在锁存允许引脚加一个正脉冲。当LE为高电平时,移位寄存器中的内容将进入锁存器;当LE为低电平时,锁存器上的内容将被锁存,不再随着移位寄存器的内容而改变了。据此,可以给出列扫描的工作时序,如图5.14所示。由于该芯片可以工作在高达30MHz的时钟频率上,因此可以在极短的时间内移入一行的数据,最快只需约0.53μs就可以移入一行16位的LED数据。
图5.13 TLC5926基本功能框图
图5.14 列扫描的工作时序
上述列驱动电路只能显示当前行。接下来描述行扫描过程及操作时序,从而实现全屏幕16×16个LED 动态驱动。与电视上所用扫描类似,完整扫描一帧的时间称为帧扫描周期Tf,每秒能完整扫描的帧数即是图像的刷新频率。如前所述,为了不产生明显的图像闪烁,必须要求足够高的刷新频率,这里取25Hz的刷新频率,扫描周期为
Tf=40ms
由于采用的是1/16的动态扫描,求得行扫描周期为
Tr=2.5ms
上述行扫描周期Tr将决定:
①每一行一次点亮的最长时长Tr,它将影响屏幕亮度与闪烁等品质。
②驱动系统用于行数据移位的最大可用时间Tr,它将决定软、硬件的速度与器件选择。
到了每行的结束时刻,把已经移入移位寄存器的下一行数据锁存。由于数据的锁存过程中输出数据会产生动态的变化,为避免可能由此带来的不确定闪烁,可以考虑短暂禁止输出,完成锁定后再允许输出下一行。
整个图像帧的扫描时序如图5.15所示。为了确保图像帧的显示稳定性与一致性,当需要改变显示内容时,这种改变应该在完整的一帧图像被显示后进行,即在最后第15行移入移位寄存器后检查需不需要更新显示内容,如果需要,就把新内容保存到图像显示帧存中,下一帧的第0行开始切换显示更新后的内容。可以设置单独的存储器用作图像帧存,如果像素不是特别多,可以在控制器自带的内存中开辟一个区域用于此目的。这些行扫描、帧存更新、行数据的移位锁存等是由谁来完成与控制的呢?这就要用到控制器了。
图5.15 显示屏的行扫描时序
4.控制器
图5.12所示的显示模块控制器可以用单片机来实现,它实现从上层图像控制器接收当前显示模块所要显示的内容并把它保存到内部RAM 构成的帧存中,还将实现模块行、列扫描控制等。它的设计与具体选用的单片机型号有关,与显示模块被使用的显示屏类型及尺寸同样关系密切。对于视屏类型的应用,因为需要传输远距离高速数据流,控制结构可能会更加复杂,需要附加专门的视频控制器来实现。下面将对图5.12所示的显示模块控制器具体结构进行必要的说明。(www.daowen.com)
与列扫描集成电路TLC5926连接最方便的办法是使用许多单片机内建的SPI接口,对于8位的低成本单片机,每行的数据更新仅需在SPI口上连续输出2个字节即可,硬件连接与编程都十分方便。行扫描控制需要4个二进制位,可以配置在任意一个单片机可用的端口上,这样扫描一行只需要执行一个单字节操作,写出0x0~0x F中的某个值就可以了。
至于从上层图形控制器接收当前模块显示数据,如果数据量不是特别大,可以考虑采用RS485平衡传输技术,能在相当高的数据传输速率下实现远距离显示数据的更新。想要在单片机系统中进行RS485串行通信,图5.12所示的显示模块控制器在与上层图形控制器之间需要扩展RS485芯片构成接口电路,于是单片机可以使用内建的通用串行异步收发器(USART)实现显示数据的接收。对于当前16×16的单色面板,这个模块所用的数据相当有限,每行2个字节,每帧共计只要接收32个字节。控制器中要做的主要工作是单片机的软件设计。接下来,根据上述设计要求,结合具体型号的单片机实现方案,讨论软件设计的主要流程。
5.显示模块控制器软件结构
显示驱动是一个实时控制系统,每个行扫描周期所执行的操作要以严格的时序完成,因此该系统的单片机软件将主要以定时中断的方式来诱发所有关键操作。同样地,从上层图像控制器通过串行通信获得图像数据也是由通信硬件在后台自动完成的。为了支持这些操作,应当设计恰当的数据结构来支持数据传递及各个程序功能模块之间对数据更新与使用的同步。对于显示模块控制器这种相对简单的应用,通常不会加载实时操作系统,这种“裸”应用设计需要注意数据读写可能存在的潜在冲突,保证数据的完整性。
(1)初始化程序。
如果仅仅是用于显示模块的驱动,主程序将是十分简单的,在适当的初始化之后,几乎没有什么特定的任务需要完成。当然实际应用中可以根据需要执行一些其他操作。初始化程序模块启动后仅需执行一次,主要完成以下操作:
·端口初始化:配置相应的端口,用于SPI通信、四位行扫描译码器驱动信号等。
·数据初始化:清空显示缓存及一切所用的标志,保证每次启动模块处于完全确定的状态。
·定时器初始化:把MCU 中的某个定时器指定为系统时钟,配置它的定时周期为行扫描时间。装载定时器初值。
·SPI初始化:把SPI配置成主模式,把相位设定成时钟下降沿数据变化,上升沿锁存数据。配置SPI的时钟,可以设置尽可能高的时钟,只要不超出TLC5926最高限值30MHz即可。通常单片机少有SPI的时钟能高达30MHz的。
·串行通信初始化:指定波特率、数据位、奇偶校验、停止位等。485还会需要一个配置成输出的接收/发送控制位。
·中断初始化:允许定时器、SPI、串口通信中断。
·启动:启动定时器,允许串口接收数据。
主流程在执行了上述初始化操作后即可进入循环等待状态。驱动控制的大部分操作都是在各个中断服务程序里进行的。
(2)中断服务程序。
①串行通信中断服务程序。
如果上层显示控制系统有新的数据需要让当前模块更新,串行口将接收到32个字节的数据块并把它们保存在临时缓冲器中。正确接收了32字节的数据块后,置位新数据就绪标志DATAREADY=1,等待SPI中断程序复制到模块显示帧存中。
②定时中断程序。
每隔一个行扫描周期Tr(=2.5ms),系统会产生一个定时器中断,这是显示模块扫描控制的核心操作,它将实现图5.15所示的扫描时序。
·当=1时禁止显示。
·LE=1,允许移位寄存器16位数据进入锁存器;LE=0,锁存。
·从端口输出当前行号,PORTx=curRaw;更新行号curRaw++;若超出15,回卷到0。
·允许显示:=0,显示当前行内容。
·取下一行的第一个字节送入SPI寄存器,设置SPI字节计数SPICNT=1,允许SPI中断。
·中断返回。
③SPI中断服务程序。
SPI中断用于把下一扫描行16位数据移入移位寄存器,它也是每隔一个扫描周期Tr=(2.5ms)产生中断,不过,如上所述,SPI中断是在定时器中断服务程序中被允许的,且下一扫描行第一个数据的发送也是在定时器中断服务程序中被写入SPI寄存器。单片机中的SPI数据寄存器一旦空闲,就会产生SPI中断请求,中断服务程序就可以写下一个数据了。这里的主要操作有:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。