当前位置:文档之家› LCD驱动电路的设计

LCD驱动电路的设计

硬件电路设计 硬件电路结构 本设计中手持终端 CPU 采用三星公司 ARM920T 内核处理器 S3C2440A,其 LCD 控制 器支持 STN LCD 和 TFT LCD,实际使用的 LCD 为 LTS350Q1-PE1_PI,属于 TFT LCD。 电路框图如图1所示。
驱动电路主要包括三部分:第一部分是 LCD 驱动,采用 MAX1779芯片;第二部分是 LED 背光驱动,采用 MP1521芯片;第三部分是 VCOM 信号驱动,采用 LM8261芯片。这里主要 叙述 LCD 驱动和背光电路的实现。
LCD 驱动电路的设计
现在大部分的便携式手持终端产品,如移动电话、导航系统等,都拥有一个小型 LCD 显示屏,这使 LCD 驱动电路的设计成为手持终端设计的重要组成部分。
LCD 驱动电路的设计是手持终端产品的重要组成部分。本文设计并实现了基于 S3C2440A 的手持终端 LCD 驱动电路。以应用于特殊行业的手持终端为例,叙述 LCD 驱动电 路的设计实现方法。
LCD 驱动电路
由于 LCD 内集成有数字电路和模拟电路,需要外部提供数字电压 DVDD 和模拟电压 AVDD。另外,为了完成数据扫描,需要 TFT 轮流开启/关闭。当 TFT 开启时,数据通过源极 驱动器加载到显示电极,显示电极和公共电极间的电压差再作用于液晶实现显示,因此需要 控制 TFT 的开启电压 VGH、关闭电压 VGL,以及加到公共电极上的电压 VCOM。
MP1521支持两种方式控制 LED 亮度,一是将 BRT 连接在范围为0.26V~1.2V 的电压 上,另外一种是通过 PWM 信号控制 LED 亮度。设计时,将其连接在 PWM 端口,使用 PWM 控制 LCD 背光亮度。
S3C2440A 有5个16bit 定时器,其中定时器0、1、2、3有 PWM 功能。将 BRT 连接到 能够输出 PWM 信号的 CPU 的 TOUT0/GPB0引脚,利用定时器0产生的 PWM 信号控制 LCD 亮度。 通过改变 PWM 信号的占空比调整 LED 亮度,而通过设置 CPU 内部寄存器的值可以改变 PWM 的占空比。
字符设备的驱动程序 字符设备是 Linux 系统中最简单的设备,可以像文件一样访问。当字符设备初始化 的时候,其驱动程序向 Linux 内核登记,在 chrdevs 向量表中增加一个 device_struct 数据 结构条目。这个设备的主设备标识符用作这个向量表的索引。一个设备的主设备标识符是固 定的。chrdevs 向量表中的 device_struct 数据结构包括一个登记设备驱动程序名称的指针
MAX1779芯片能产生 LCD 需要的模拟电压 AVDD、栅极开启电压 VGH 及栅极关断电压 VGL。芯片内部集成有3个 DC-DC 转换器,其中包括两个充电泵和一个升压转换器,可以为小 型 TFT 液晶屏提供高效的调节电压。LCD 驱动电路如图2所示。
这里,一个充电泵产生正电压,作为 TFT 的开启电压 VGH;另外一个充电泵产生负 电压,作为 TFT 的关闭电压 VGL。此外,芯片还可以产生-5V 电压输出,设计时利用-5V 输 出电压协助 LM8261产生 VCOM 信号。
LED 背光驱动电路 LCD 作为一种被动显示器件本身并不能发光,必须要有背光模块提供光源。白光 LED 由于复杂程度较低、成本低且尺寸较小,被普遍用做嵌入式手持设备的 LCD 背光源。本文中 背光驱动电路如图3所示。
驱动芯片采用 MP1521,该芯片有3组独立的电流反馈回路,可同时驱动3组并联的 LED。现将3组反馈回路 FB1、FB2、FB3短接,可以提供更大的驱动电流,用于驱动6个白色 串联 LED 背光灯。
TCON = (TCON & ~(0xf)) | 0; TCON=(TCON & ~(0xf)) | (TCON_0_AUTO | COUNT_0_ON);} 函数中的语句大部分是给与定时器相关的寄存器写值。其中 b 就是上层函数传递下 来的 bright 值,从程序中可以看到,调节亮度本质上是通过 TCMPB0寄存器写入与 bright 相关的值,控制 PWM 占空比实现亮度调节功能。 3、lcdctrl_device_get_ops 函数 用于上层获取具体设备的钩子函数。代码如下: struct lcdctrl_device *lcdctrl_device_get_ops(void) {return &smdk2440_dev;} 此函数被 lcdctrl.c 初始化时调用,将设备指向 smdk2440_dev。 至此,驱动程序设计完成,为了更好地实现 LCD 的管理,需要在上层的 Qtopia 应 用程序中提供人机操作的界面。 Qtopia 应用程序 Qtopia 应用程序提供人机操作界面并调用底层驱动程序完成 LCD 控制功能,这里, 仍然以亮度调节为例叙述应用程序工作过程。 主要完成功能: 1、应用程序完成人机操作的界面,为使用人员提供友好界面; 2、读取亮度值,并将其存入变量 bright 中; 3、打开设备文件:fd=open("/dev/devname",O_RDONLY); 4、调用底层的驱动程序,通过底层的驱动程序将 LCD 背光亮度调整为指定值。 ioctl(fd, _BACKLIGHT_ IOCTL_BRIGHT, bright)。 ioctl 函数调用驱动程序完成亮度的调节。 结语 经测试,设计完成的 LCD 能很好地完成图形的显示,终端电源管理界面中包含了 LCD 亮度调节功能。通过图形管理界面能够方便地管理 LCD,达到节约能量、延长手持终端 工作时间的目的。
lcdctrl.c 中的 lcdctrl_ioctl 函数需根据上层应用亮度调整、对比度调整、关闭 LCD、开启 LCD 等。
下面分别叙述两个文件的实现。 lcdctrl.c 文件 1、定义 file_operation 结构体 static struct file_operations lcdctrl_fops = { ioctl: lcdctrl_ioctl, open: lcdctrl_open, release: lcdctrl_close }; LCD 的各种控制功能在 lcdctrl_ioctl 函数中实现,lcdctrl_open 和 lcdctrl_close 不实现具体功能,直接返回0值。 2、lcdctrl_ioctl 函数 lcdctrl_ioctl 函数需根据上层应用程序的不同参数实现不同的功能,这里主要说 明亮度调节功能的实现。部分代码如下: static int lcdctrl_ioctl(struct inode * inode, struct file *filp, unsigned int cmd , unsigned long arg) {…… switch(cmd)
为了节省功耗,电路的使能(EN)端接 CPU 的 LCD_PWREN 管脚,高电平时背光电路工 作;低电平时背光电路不工作。同时,可将 EN 端通过电阻直接连接到3.3V 电源上以便调试 时使用。
LCD_BCK+和 LCD_BCK-分别连接到串联 LED 的正负两端。 软件设计
手持终端的嵌入式 Linux 所采用的内核版本是 kernel-2.4.18。 为了使 LCD 能正 常显示,还需要在 Linux 系统下开发 LCD 的驱动程序。
和一个指向一组文件操作的指针。这组文件操作本身位于这个设备的字符设备驱动程序中, 并处理一些特定任务。
Linux 下的帧缓冲设备 Linux 操作系统为 LCD 等显示设备提供了帧缓冲区。帧缓冲区(Framebuffer)是 Linux 为显示设备提供的一个接口,是把显存抽象化后的一种设备。为 LCD 编写驱动程序的 实质就是为帧缓冲区编写驱动程序。 由于帧缓冲驱动程序的实现在许多论文中有详细叙述,这里不再赘述,本文重点讨 论背光设备驱动程序的实现。 LCD 背光设备的驱动程序 LCD 背光设备可看作字符设备,可以按照字符设备驱动程序的编写方法进行实现。 在驱动程序里实现了 LCD 各种控制功能。驱动程序主要包括 lcdctrl.c 和 lcdctrl_smdk2440.c。其中 lcdctrl.c 屏蔽了具体的硬件,它通过钩子函数调用 lcdctrl_smdk2440.c 相关函数完成各种具体操作。为了形象地说明两个文件之间的关系, 这里以 LCD 亮度调节过程为例,说明函数的调用过程,如图4所示。
{ …… case _LCDCTRL_IOCTL_BRIGHTNESS: if ((arg >=0) && (arg <= 100)) ret = lcdctrl_set_brightness(arg); break; //调节 LCD 背光亮度 …… break;} return ret;} 当应用程序传递的命令参数为 LCDCTRL_IOCTL_BRIGHTNESS 时,lcdctrl_ioctl 调 用 lcdctrl_set_ brightness 具体实现亮度调节功能。 3、lcdctrl_set_brightness 函数 lcdctrl_set_brightness 具体实现亮度调节功能。主要代码如下: int lcdctrl_set_brightness(int b) { brightness = b; return lcd_device->set_brightness(b); } 可以看出,此函数调用 lcd_ device->set_brightness 函数,而 lcd_device 在初 始化时已被指向与具体的硬件相关的函数。 4、初始化函数 初始化函数主要完成初始信息的设置和设备的注册。 lcdctrl.c_smdk2440文件 1、lcdctrl_device 结构体 lcdctrl_device 结构体定义了具体操作 LCD 的各函数指针,包括 LCD 初始化函数, LCD 开启和关闭函数,亮度、对比度等设置函数。其中 LCD 关闭函数的本质就是将 LCD 背光 亮度设置为0。 static struct lcdctrl_device smdk2440_dev = { init: smdk2440_lcdctrl_init, enable: smdk2440_lcdctrl_enable, disable: smdk2440_lcdctrl_disable, set_intensity: smdk2440_lcdctrl_set_intensity, set_brightness: smdk2440_lcdctrl_set_brightness, set_contrast: smdk2440_lcdctrl_set_contrast}; 2、smdk2440_lcdctrl_set_brightnes 函数 这里只叙述亮度设置函数的实现。 static int smdk2440_lcdctrl_set_brightness( int b) { …… TCNTB0 = 100; TCMPB0 = b*100/100; //设置 TCMPB0寄存器的值 TCON = (TCON & ~(0xf)) | ( TCON_0_AUTO | TCON_0_MAN | COUNT_0_OFF);
相关主题