重型卡车因其具有运输量大、运输成本低等特点,在工程建设、货物运输、城市垃圾清运等方面得到了越来越多的应用。但近年来重型卡车行车时引起的交通事故频繁发生,给人民生命财产安全造成了巨大损失。随着汽车电子技术的快速发展,基于CAN总线的重型卡车车载网络技术已成为保证重型卡车可靠、安全运行的一种有效技术措施[1]。采用分布式网络控制,不仅可以减少线束,而且能够提高各电子控制系统的运行可靠性,实现各子系统之间的资源共享和在线故障诊断。
目前,国外基于CAN总线技术和J1939协议标准的重型卡车网络系统的研究己经进入商用化阶段,取得了显著的社会经济效益[2]。在国内,一汽、上汽和中国重汽等集团公司相继都在其不同型号的重卡上采用CAN总线技术。但目前国内还没有自主知识产权的成熟产品,基本上还是采用直接引进国外著名汽车电子供应商的产品的方式,很难掌握其关键技术,严重阻碍了我国重型卡车车载网络技术的发展[1]。
本文设计了一个基于CAN总线的重型卡车车载仪表系统。该车载仪表系统是整个车载网络系统的核心模块,综合应用了CAN总线技术、嵌入式技术和智能仪器等技术,主要实现车况信息的收集与处理、行驶数据记录、通信和显示等功能,不仅为驾驶员判断是否发生故障以及发生故障的状况提供了依据,而且为运输公司的经营和事故处理提供依据。该研究工作对于我国汽车电子技术,特别是重型卡车设备的电子化、网络化发展,参与国际竞争具有积极的促进作用。
1 重型卡车车载网络系统总体设计
重型卡车通常由牵引车和拖车组成。由于牵引车要挂接一个或多个拖车,并可能需要频繁地卸载和加挂拖车,因而应在牵引车、拖车内各自采用单独的网段,由多网段组成的网络来支持系统工作。如图1所示是本文设计的基于CAN总线的重型卡车车载网络系统的拓扑结构,它由牵引车网段和拖车网段组成。当存在多个网段时,必须有相应的桥接设备提供从一个网段到另一个网段的消息传递功能。各网段的信息通过桥接设备进行报文的转发、过滤、地址转换和重新打包等,从而减少每个子网的数据信息流量,使每个子网工作更有效,也提高了整个网络的效率。
图1中的网络互连ECU即为实现牵引车网段和拖车网段互联的桥接设备,牵引车端的是主桥接设备(Bridge Master),拖车端的是从桥接设备(Bridge Slave)。在牵引车网段和拖车网段内,各个电子控制单元ECU通过CAN总线与网络互连ECU连接,构成主从式分布式系统,网桥设备作为主节点,各个电子控制单元ECU作为从节点。主节点向从节点发出命令帧,从节点接收到命令帧后向主节点发送响应帧,从而实现数据交换。网桥具有两个CAN通信端口,一方面可以连接同一网段中各个电子控制单元ECU,另一方面可以实现牵引车和拖车之间的报文转发。牵引车的网桥周期地轮询拖车系统中的网桥,当拖车网桥接收到轮询消息时,开始对其网段中的各个电子控制单元ECU进行监测,接收电子控制单元ECU发送的报文信息,并将拖车网段中生成的报文传到牵引车网桥。如果拖车系统已经卸载,牵引车的网段仍然能正常工作,连接拖车网桥的CAN网络处于等待状态,一旦拖车系统被挂接上,便开始对其进行轮询检测。
2 嵌入式车载仪表硬件结构设计
位于牵引车端的网络互联ECU,即主桥接设备是整个网络系统的核心。它不仅是牵引车的主控设备,也是连接后面的拖车系统的关键设备,整个网络系统的信息在此汇集、处理、存储和显示,据此可以判断发动机的燃油液位是否过低、发动机冷却液温度是否过高、发动机机油压力是否过低以及车灯是否发生故障,将这些故障信息以图形的方式显示出来,使驾驶员能够随时全面地监测卡车运行状态。
网络互连ECU采用Samsung公司的S3C2410作为微处理器。S3C2410是一款低价格、低功耗、高性能的16/32 bit且具有ARM920T内核的微处理器。主频203 MHz,处理能力完全满足该系统的需要,并且能够方便地移植Linux操作系统,为设计具有良好人机交互界面的车载仪表系统创造了条件。
整个硬件电路主要包括电源电路、复位电路、时钟电路、存储器扩展电路、液晶显示电路和两路CAN通信接口电路,其基本结构如图2所示。
系统采用SJA1000 CAN控制器和PCA82C250总线收发器设计CAN通信接口。SJA1000是PHILIPS公司推出的一款CAN通信控制器,支持CAN2.0A、2.0B协议。由于其设计是基于早期的80C51单片机应用,内嵌锁存器可以使80C51单片机无需任何外接器件就可以直接连接。但是,S3C2410A的地址总线和数据总线是分开的,不能直接连接SJA1000,所以需要模拟出类似80C51单片机的外部存储器时序才能使用。图3电路中,使用了一个“或”门74LS32和一个“或非”门74LS02的组合,配合地址总线,首先模拟出一个ALE(地址锁存信号),把SJA1000的内部寄存器地址写入锁存器,然后再向SJA1000内部寄存器写入数据。这样,使用ARM的两条外部存储器访问指令,就可以模拟出SJA1000所需要的时序了。利用S3C2410A的片选信号nGCS4和地址总线LADDR2,经过“或非”门模拟出的SJA1000的物理端口地址为0x20000008,片选信号nGCS4和地址总线LADDR3,经过 “或”门,模拟出的SJA1000的数据端口地址为0x20000004。
3 嵌入式车载仪表软件设计
3.1 嵌入式Linux下CAN设备驱动程序开发
网络互连ECU在Linux系统下使用CAN通信技术,因此需设计基于Linux的CAN设备驱动程序。
设备驱动程序是操作系统内核和机器硬件之间的接口。Linux内核有三种类型的设备驱动程序:字符设备驱动程序、块设备驱动程序和网络设备驱动程序[4]。SJA1000控制器属于字符型设备,CAN设备驱动程序实际上是Linux内核直接对SJA1000器件的初始化与读写操作。而这些操作方式其实就是一些标准的系统调用,如open()、read()、write()、close()等。定义把系统调用和驱动程序关联起来的关键数据结构file_operations,结构体中的每一个成员都是一个函数指针,实现了对于不同操作的函数跳转功能。具体的声明如下:
struct file_operations sja1000_can_fops =
{
owner: THIS_MODULE,
ioctl: can_ioctl, //设置通信参数
open: can_open, //完成SJA1000初始化,中断申请,
增加次数计数器的使用次数
write: can_write, //发送数据
read: can_read, //接收数据
release : can_release, //关闭CAN设备,关闭中断,
减少次数计数器的使用次数
};
驱动程序加载到内核中时,首先运行驱动程序的初始化函数,然后等待系统调用在file_operations结构中定义的相关函数,实现对设备的操作。CAN设备的初始化函数负责创建CAN设备文件,注册CAN设备驱动程序。
对于字符设备,Linux通过调用register_chrdev()向系统注册;卸载驱动时,注销设备函数为unregister_chrdev()。设备驱动程序一般以模块形式加入内核,使用module_init和module_exit宏对模块初始化函数can_init()和模块清除函数can_cleanup()进行标记(通常在文件末尾)。程序如下:
module_init(can_init);
module_exit(can_cleanup);
驱动程序编写完成并编译通过后,可使用命令:#insmod can_sja1000_dev.ko进行动态加载。加载后,用户程序就可以通过文件直接操作CAN控制器,实现CAN总线通信。使用驱动程序完成CAN总线数据收发的原理如图4所示。在系统初始化完毕后,发送命令帧给监测系统的电子控制单元ECU,通过系统调用将命令帧从用户空间拷贝到内核空间,发送数据处理函数将内核层的命令帧写入SJA1000控制器;当电子控制单元ECU采集的卡车运行状态数据到来时,中断被触发,唤醒处于睡眠状态的进程,接收数据处理函数将从SJA1000控制器读取数据到接收缓冲区,用户通过系统调用读取到完整的数据。
3.2 基于MiniGUI的车载仪表显示程序设计
MiniGUI是嵌入式图形用户界面系统,它通过窗口系统来管理应用程序在屏幕上的显示[5]。本系统的人机界面包含的窗口类型有:对话框、按钮、静态框、位图和填充条,使用对话框作为主窗口,基于MiniGUI人机界面的程序流程图如图5所示。
本系统的图形用户界面主要显示车速、转速、水温、油压、燃油量、车内温度,冷却水温度过低、油压过低、燃油过低报警信号和大灯、尾灯、左右转向灯、制动灯等灯光信号。使用MiniGUI的按钮通知消息MSG_COMMOND,该消息是在状态监测按钮按下后发送到窗口过程函数,执行CAN通信子程序,接收各电子控制单元ECU上传的卡车运行状态信息,实时地显示在液晶屏上,并以不同的颜色表示报警信号和车灯信号,使驾驶员能够随时全面地监测卡车的运行状态,提高卡车运行的安全性。
本文针对我国重型卡车的发展现状,在完成重型卡车车载网络系统总体结构设计的基础上,对基于CAN总线的嵌入式车载仪表系统的软硬件设计方法进行了详细阐述。该系统能对重型卡车的车速、发动机转速、水温、油温、油压、燃油量以及车灯开关量等状态信息进行实时监测,及时有效地发现和识别卡车运行过程中发生的各种故障,对于保证卡车安全运行起到了重要作用。测试表明,本文所设计的重型卡车车载仪表系统工作性能稳定、可靠,具有较好的人机界面。
参考文献
[1] 位堂杰,刘金朝.HOWO重型载货汽车的车载网络系统[J]. 汽车电器,2009(1):1-3.
[2] FELLMETH P, L?魻FFLER T.Networking heavy-duty vehicles based on SAE J1939[J]. Vector Corporation,2008.
[3] 阳宪惠. 现场总线技术及其应用(第2版)[M].北京:清华大学出版社,2008.
[4] 李俊.嵌入式Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.
[5] 周立功.ARM嵌入式MiniGUI初步与应用开发范例[M]. 北京:北京航空航天大学出版社,2005.
上一篇:用插值查找表实现FPGA的DSP功能
下一篇:手机自动售货机的嵌入式系统设计