《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于嵌入式Linux汽车智能仪表系统的设计
基于嵌入式Linux汽车智能仪表系统的设计
来源:微型机与应用2014年第4期
邓宗权, 蒋向东, 王继岷, 严 亮
(电子科技大学 光电信息学院, 四川 成都610054)
摘要: 为了优化汽车仪表系统性能,提高系统智能化、人车交互界面友好度,以ARM微处理器S5PV210为控制核心设计了一款汽车智能仪表系统。该系统以嵌入式实时操作系统Linux为软件平台,结合CAN现场总线技术,并采用开放源代码的图形界面库QT开发仪表终端应用程序。经实验验证,系统性能得到了改善。
Abstract:
Key words :

摘  要:为了优化汽车仪表系统性能,提高系统智能化、人车交互界面友好度,以ARM微处理器S5PV210为控制核心设计了一款汽车智能仪表系统。该系统以嵌入式实时操作系统Linux为软件平台,结合CAN现场总线技术,并采用开放源代码的图形界面库QT开发仪表终端应用程序。经实验验证,系统性能得到了改善。
关键词: 智能仪表;ARM处理器现场总线CAN嵌入式系统;Qt

    汽车的显示仪器作为驾驶员与汽车信息交流的主要途径,实时地将汽车的驾驶情况反馈给驾驶员。作为人机交换信息的一个重要窗口,汽车显示仪器有了很大的发展:第一代基于器械作用力,用机械指针显示;第二代基于电测原理,通过各类传感器采集非电量数据并转换成电信号显示;经过第三代的模拟电路电子式的发展到第四代全数字仪表,将各种输入信号转换成数字信号,通过专用的中央处理器处理各种信号,在LCD屏、VFD等显示屏上显示各种信息,全数字仪表重复性好、线性度好、可靠性高,适合现代生活对产品的智能化、数字化的要求[1]。
   本文提出了一种虚拟智能仪表系统,S5PV210为中央处理器;通过CAN总线传输各种显示所需要的数据;采用实时性嵌入式系统Linux为汽车的操作系统;图形应用界面库Qt开发终端应用程序。系统的性能得到提高,同时可扩展性和可维护性都有了很大的改善,具有很大的商业价值。
1 总体设计
    通过CAN总线实时地采集汽车的各种数据,包括汽车运行的转速、车速、水温、油量、电压、油压、里程等信息,然后由嵌入式处理器S5PV210处理数据,将得到的数据在显示屏上用图形界面虚拟显示。同时,系统在汽车异常运行时语音报警,显示器显示具体的异常原因。
2 硬件组成
    汽车智能仪表系统的硬件设计如图1所示,系统的控制核心采用SAMSUNG的S5PV210,采用ARM cortexTM-A8内核,ARM V7指令集,主频高达1 GHz,64/32 bit内部总线结构,具有非常高的运算能力。S5PV210包含很多强大的硬件编解码功能,同时内建高性能PowerVR SGX540 3D图形引擎和2D图形引擎,支持2D/3D图形加速,能更快地解码更高质量的图像和视频[2]。采用外置CAN控制器承担CAN节点控制器的任务,通过SPI接口与CAN控制器通信,快速高效。S5PV210嵌入了许多外围设备的功能,减少了系统芯片的数量。各种传感器将采集到的转速、车速、水温、油量、电压、油压、里程等模拟信号通过CAN总线传递给控制器自带的A/D输入口转换成数字信号,LCD屏实时显示采集到的信息,显示的图片信息存储在SD卡中,通过辅助小键盘调节显示效果。中心控制器处理信息,当信息不符合设定的正常数值时显示器显示异常原因,语音模块[3]发出警报。软件采用嵌入式实时操作系统Linux2.6.30高效地管理整个系统。

    智能仪表采用网路化的集中管理,通过CAN总线将汽车各部分的信息传递给控制器,控制器通过CAN总线反馈实现汽车的有效操作。系统的CAN总线通信系统选用Microchip的MCP2515为控制核心,MCP2515是一款独立CAN协议的控制器[4-5],完全支持CAN V2.0B技术规范,通过符合工业标准的SPI口与控制器连接。LCD显示器选用CPT的8英寸工业屏CLAA080XA03BT,分辨率高达1 024×768,可视角度大、亮度高、对比度好、反应时间快,满足仪表系统对显示屏显示的各种要求。
3 软件设计
    汽车智能仪表系统采用嵌入式Linux为操作系统,Linux源代码开放并遵循GPL规则,选择Linux2.6.30版本,经过系统裁剪,以适合本系统的嵌入式和实时的应用,同时在Linux系统平台下编写各模块的驱动程序和应用程序。控制面板采用Qt/Embedded图形界面,外观显示的是传统机械仪表图形和数字图形结合的图形界面。传感器采集各种数据,经过CAN总线传输,控制器对各种数据处理,同时通过仪表图形界面显示各种数据,当出现异常时,界面显示原因并且语音提示报警。整个系统软件如图2所示。系统主要分为两个部分:Linux系统下各个应用模块的驱动程序设计和Qt图形界面设计。


3.1 驱动程序设计
 外部和内置设备驱动程序设计如下[6]:
    (1)8英寸的TFT-LCD屏驱动设计。在驱动LCD中首要配置LCD控制器,尤其是帧缓冲区(FrameBuffer)的指定,LCD是以字符设备方式加以访问和管理,采用“文件层-驱动层”的接口方式。文件层定义的数据结构为file_operation结构体中的接口函数,如读/写的read/write函数和用于控制的ioctl等。将LCD驱动程序模块化,将编写好的LCD驱动程序lcd.c放到arm/linux/drivers/char目录下,进行make menuconfig选择静态加载LCD驱动。
    (2)CAN模块驱动设计。系统中采用MCP2515独立控制器和TJA1050高速CAN总线收发器为一体的外接模块。MCP2515与主控芯片使用SPI数据总线进行交互,将SPI封装成SPI设备注册与驱动注册两部分,分别由platform_device和device_driver两个结构体实现。成功注册SPI总线后,将CAN总线驱动作为SPI子设备挂载到SPI总线上,与主控芯片传递数据。
    (3)A/D转换器驱动程序设计。S5PV210带有10路12 bit的模拟输入通道,A/D转换的驱动程序流程为:打开A/D转换器→采集模拟信号→进行A/D转换→输出数字信号→关闭A/D转换器。A/D转换驱动程序也是一个字符设备驱动,将编译好的A/D转换程序烧入内核。
    (4)5×5键盘驱动程序。键盘驱动程序采用层次型体系结构,分上下两层实现。上层为通用键盘抽象层,为底层服务;下层为硬件处理,对硬件直接操作。主要的工作在于编写底层处理函数,键盘中断处理获取按键的扫描码,调用handle_scancode(),识别按键在键盘的位置,实现按键驱动。
    (5)网口驱动程序、USB协议、控制信号输出驱动程序等驱动程序在Linux2.6.30中由官方给出,可直接调用。所有的驱动程序在系统中均采用静态编译方式,不需要模块加载。
3.2 应用程序设计

 


    本系统的应用程序包括管理任务、采集数据任务、CAN总线收发任务、LCD屏显示任务、处理异常情况任务等多个任务,采用信号量、邮箱、消息队列等多种常用进程间通信机制。系统采用C语言入口函数Main()的编写完成各种初始化操作,建立信号量和消息队列,依次创建各任务,最后启动操作系统,实现多任务操作。
    在Linux系统中,各任务被赋予不同的优先级,拥有不同的任务栈,不同任务之间通过消息队列和信号量通信和共享数据。任务采用无限循环结构,各任务通过延时或等待信号量和消息对决定CPU的使用权,通过产生中断来切换任务。当得到消息队列或者延时时间时,高优先级的任务进入就绪状态,任务获得CPU使用权,最后处理相应的消息队列中的数据[7]。
3.3 Qt图形界面设计[8-10]
    Qt/Embedded用于嵌入式系统,具有高效、稳定、美观等特点,能够为用户提供可靠的交互功能。用Qt/Embedded下的集成开发工具Qt Designer实现嵌入式GUI的设计与布局,界面设计完成后, 生成.ui文件, 由.ui文件生成相应的头文件,在头文件中用一个类实现对界面的搭建。具体的界面编写过程如下:
    (1)使用Qt Designer提供的uic工具通过界面文件Carsmarting.ui生成Carsmarting.h文件和Carsmarting.cpp文件。命令为uic-o Carsmarting.h Carsmarting.uiuic-o和Carsmarting.cpp-impl Carsmarting.h Carsmarting.ui。
    (2) 系统中实现显示功能,在Carsmarting.cpp文件中添加相应的功能实现代码。编写main主函数文件,主函数所在文件名为main.cpp,首先产生一个QApplication类的实例,然后定义窗口类实现并把它作为程序的主窗口,接着设置mainwindow部件,最后调用show()和exec()方法,使用库管理界面作为主界面,程序进入消息循环。以下是Carsmarting.的主函数文件main.cpp的主要代码:
    int main(int argc,char **argv)
    {
    QApplication Carsmarting(argc,argv);
                      //创建对象,管理整个应用程序资源
    Carsmarting.*mainwindow = new Carsmarting;
                                  //创建应用程序窗口
    app.setMain Widget(&mainwindow);
                        //设置程序的主部件mainwinow
    mainwindow—>how();  //使mainwindow的窗口部件可见
    return Carsmarting.exec();
                         //传递给Qt应用程序的控制权
    }
    (3)编译。使用progen命令生成工程文件(.pro文件),根据工程文件使用tmake命令生成Makefile文件,最后使用make命令编译链接整个工程。
    本文介绍的基于嵌入式Linux和CAN总线的汽车智能仪表系统具有非常优良的性能。通过裁剪优化嵌入式系统,提高了整个系统性能;系统应用CAN总线获取显示所需的数据,安全快捷;采用多任务设计方式,提高了系统的实时性和灵敏度;采用Qt/Embedded图形界面,丰富了桌面系统,界面显示友好。经过实验测试,本系统能够正常运行。该系统不但可应用在汽车仪表系统,同时对于机载舰载仪表系统有重要的参考意义。
参考文献
[1] 唐志勇.汽车仪表指针控制技术[J].汽车电器,2007(7):1-3.
[2] 程唱南. ARM Cortex-A8硬件设计DIY[M].北京:北京航空航天大学出版社,2012.
[3] 但成福.一种用排队论指导的CAN总线语言通信系统设计[J].电子技术应用,2013,39(2):22-25.
[4] 王保和. 嵌入式Linux下CAN总线驱动程序设计[J].大众科技,2011(6):19-21.
[5] 王黎明,夏立. CAN现场总线系统的设计与应用[M].北京:电子工业出版社,2008.
[6] 宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.
[7] 张海清,陈永煌,朱晖.基于嵌入式系统的CAN总线汽车组合仪表的研究[J]. 安徽工程科技学院学报,2009,24(3):53-56.
[8] 何剑锋,邬文彪.嵌入式Linux系统的Qt/Embedded图形界面开发[J].电子工程师,2007,33(7):46-48.
[9] 连照亮,徐世国.基于Qt/Embedded在嵌入式Linux下的应用研究[J].微计算机信息,2010(17):81-85.
[10] 刘治国,陈新华. 基于Linux和Qt的智能家居系统的设计与实现[J].电子技术应用,2012,38(4):23-26.

此内容为AET网站原创,未经授权禁止转载。