LCD驱动电路的设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MAX1779芯片能产生 LCD 需要的模拟电压 AVDD、栅极开启电压 VGH 及栅极关断电压 VGL。芯片内部集成有3个 DC-DC 转换器,其中包括两个充电泵和一个升压转换器,可以为小 型 TFT 液晶屏提供高效的调节电压。LCD 驱动电路如图2所示。
这里,一个充电泵产生正电压,作为 TFT 的开启电压 VGH;另外一个充电泵产生负 电压,作为 TFT 的关闭电压 VGL。此外,芯片还可以产生-5V 电压输出,设计时利用-5V 输 出电压协助 LM8261产生 VCOM 信号。
LCD 驱动电路
由于 LCD 内集成有数字电路和模拟电路,需要外部提供数字电压 DVDD 和模拟电压 AVDD。另外,为了完成数据扫描,需要 TFT 轮流开启/关闭。当 TFT 开启时,数据通过源极 驱动器加载到显示电极,显示电极和公共电极间的电压差再作用于液晶实现显示,因此需要 控制 TFT 的开启电压 VGH、关闭电压 VGL,以及加到公共电极上的电压 VCOM。
字符设备的驱动程序 字符设备是 Linux 系统中最简单的设备,可以像文件一样访问。当字符设备初始化 的时候,其驱动程序向 Linux 内核登记,在 chrdevs 向量表中增加一个 device_struct 数据 结构条目。这个设备的主设备标识符用作这个向量表的索引。一个设备的主设备标识符是固 定的。chrdevs 向量表中的 device_struct 数据结构包括一个登记设备驱动程序名称的指针
为了节省功耗,电路的使能(EN)端接 CPU 的 LCD_PWREN 管脚,高电平时背光电路工 作;低电平时背光电路不工作。同时,可将 EN 端通过电阻直接连接到3.3V 电源上以便调试 时使用。
LCD_BCK+和 LCD_BCK-分别连接到串联 LED 的正负两端。 软件设计
手持终端的嵌入式 Linux 所采用的内核版本是 kernel-2.4.18。 为了使 LCD 能正 常显示,还需要在 Linux 系统下开发 LCD 的驱动程序。
硬件电路设计 硬件电路结构 本设计中手持终端 CPU 采用三星公司 ARM920T 内核处理器 S3C2440A,其 LCD 控制 器支持 STN LCD 和 TFT LCD,实际使用的 LCD 为 LTS350Q1-PE1_PI,属于 TFT LCD。 电路框图如图1所示。
驱动电路主要包括三部分:第一部分是 LCD 驱动,采用 MAX1779芯片;第二部分是 LED 背光驱动,采用 MP1521芯片;第三部分是 VCOM 信号驱动,采用 LM8261芯片。这里主要 叙述 LCD 驱动和背光电路的实现。
和一个指向一组文件操作的指针。这组文件操作本身位于这个设备的字符设备驱动程序中, 并处理一些特定任务。
Linux 下的帧缓冲设备 Linux 操作系统为 LCD 等显示设备提供了帧缓冲区。帧缓冲区(Framebuffer)是 Linux 为显示设备提供的一个接口,是把显存抽象化后的一种设备。为 LCD 编写驱动程序的 实质就是为帧缓冲区编写驱动程序。 由于帧缓冲驱动程序的实现在许多论文中有详细叙述,这里不再赘述,本文重点讨 论背光设备驱动程序的实现。 LCD 背光设备的驱动程序 LCD 背光设备可看作字符设备,可以按照字符设备驱动程序的编写方法进行实现。 在驱动程序里实现了 LCD 各种控制功能。驱动程序主要包括 lcdctrl.c 和 lcdctrl_smdk2440.c。其中 lcdctrl.c 屏蔽了具体的硬件,它通过钩子函数调用 lcdctrl_smdk2440.c 相关函数完成各种具体操作。为了形象地说明两个文件之间的关系, 这里以 LCD 亮度调节过程为例,说明函数的调用过程,如图4所示。
LCD 驱动电路的设计
现在大部分的便携式手持终端产品,如移动电话、导航系统等,都拥有一个小型 LCD 显示屏,这使 LCD 驱动电路的设计成为手持终端设计的重要组成部分。
LCD 驱动电路的设计是手持终端产品的重要组成部分。本文设计并实现了基于 S3C2440A 的手持终端 LCD 驱动电路。以应用于特殊行业的手持终端为例,叙述 LCD 驱动电 路的设计实现方法。
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 的占空比。
{ …… 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: smLeabharlann Baiduk2440_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);
lcdctrl.c 中的 lcdctrl_ioctl 函数需根据上层应用程序的不同参数实现不同的功 能,这些控制 LCD 的功能包括亮度调整、对比度调整、关闭 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)
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,达到节约能量、延长手持终端 工作时间的目的。
LED 背光驱动电路 LCD 作为一种被动显示器件本身并不能发光,必须要有背光模块提供光源。白光 LED 由于复杂程度较低、成本低且尺寸较小,被普遍用做嵌入式手持设备的 LCD 背光源。本文中 背光驱动电路如图3所示。
驱动芯片采用 MP1521,该芯片有3组独立的电流反馈回路,可同时驱动3组并联的 LED。现将3组反馈回路 FB1、FB2、FB3短接,可以提供更大的驱动电流,用于驱动6个白色 串联 LED 背光灯。
相关文档
最新文档