新闻中心

EEPW首页 > 汽车电子 > 设计应用 > 车载导航系统终端的研究

车载导航系统终端的研究

作者:时间:2016-10-22来源:网络收藏

引言

本文引用地址:http://www.eepw.com.cn/article/201610/309805.htm

面对庞大的汽车市场以及随着全国各省市高速公路路网的建设与完善,对交通管理信息化的要求越来越高,gps车载系统的潜力不可估量,其发展前景比较乐观。日本和西方各大公司都参与了这场高科技的角逐。各发达国家的很多生产商都加快了车载导航系统的研究步伐。随着嵌入式技术的发展,很多资源不足的瓶颈问题都很大程度上得到了解决。车载定位系统由车载定位终端、无线通信链路和车载监控管理系统三部分组成。其主要功能是将移动目标的动态位置(经度和纬度)、时间和海拔等对用户有用的信息,通过无线通信链路传送到监控中心,而后在电子地图上对移动目标的运动轨迹进行显示,并对车辆的准确位置、速度、运动方向和车辆状态等用户感兴趣的参数进行监控和查询,为调度管理提供可视化依据,提高车辆运行效率,还能起到节能减排的作用。也在一定程度上起到保护地球的作用。本文将gps定位技术应用于气车,与现有定位技术组合起来共同完成定位监控任务,将大大提高定位准确性及安全性,同时能够降低资金投入,具有很广阔的发展空间。

系统总体设计

系统硬件的结构设计

车辆监控系统由车载端(包括arm工控机、触摸屏、gps接收模块和电源等)、通信系统(gprs)、监控中心三大部分组成。车载端的gps模块实时接收全球定位卫星的位置、时间等数据,一方面发送给车内的arm微型工控机,得到车辆的当前位置并且在电子地图上显示:另一方面,数据将通过gprs终端模块发送到远程监控中心服务器,使得监控中心能实时得到所有车辆的位置信息,给车辆的安全监控以及远程凋度提供了基础。通过spi接口与can总线相连,利用can总线挂接传感器,检测汽车主要技术参数,can总线模块可以使本系统与其他车载模块的连接,完成收集车辆的状态信息以及进一步控制。can总线模块主要包括can总线的控制器和收发器,在这里分别选用的是microchip公司的mcp2510和飞利浦公司的pca82c250。其中,can总线控制器mcp2510实现了can总线的协议,can总线收发器pca82c250提供协议控制器和物理传输线路之间的接口。由于can总线控制器mcp2510具有spi接口,因此,系统中将其与s3c2440的spi0相连。故障检测模块主要是对汽车的主要技术参数进行检测,并显示到lcd显示器上,如果检测到故障,会发出报警信号。本文主要检测的技术参数包括燃油消耗量、制动力、转向力、发动机温度、冷却液温度、前照灯,以及车内噪声和尾气等方面。该模块主要是通过各种传感器把各种信号转换为电信号,再利用信号处理电路把电信号进行相应的处理,使其能与can总线模块进行数据传输。车载端的硬件组成框图,如图1所示。

4.jpg

图1 车载端的硬件组成框图

应用程序总结构

应用程序的总体流程图如图2所示。由于gprs模块和gps模块都是通过串口和监控终端连接的,程序系统初始化的工作就是对串口进行初始化,使串口按gprs及gps模块的要求工作。之后创建共享内存是为gprs通信子进程与gps子进程之间的通信做准备。gps子进程负责从串口接收gps信息并把这些信息写入共享内存内,gprs子进程则将共享内存内的gps信息通过网络送到远方的监控服务器。

3.jpg

gps驱动程序的编写

为了使arm上的应用程序能够处理gps接收到的导航信号,要编写gps的驱动程序。

这个gps驱动程序也是属于字符型驱动程序,首先了解嵌入式开发中应用程序、库、内核、驱动程序的关系:应用程序调用应用程序库函数完成功能;应用程序以文件形式访问各种资源;应用程序函数库的一部分直接完成功能,一部分函数通过系统调用由内核完成,内核处理系统调用,调用设备驱动程序,设备驱动程序直接与硬件通信。如图3所示

2.jpg

一般linux的设备驱动有三种类型,字符设备、块设备、网络设备。而我要讲的gps模块的驱动程序是属于字符设备。对于字符设备发出读/写请求时,实际的硬件i/o操作一般紧接着发生。在设备管理中,除了设备类型外,内核还需要一对被称为主从设备号的参数,才能唯一标识一个设备。主设备号相同的设备使用相同的驱动程序,从设备号用于区分具体设备的实例。用命令cat/proc/devices可以查看系统中所有设备对应的主设备号。所以在gps驱动程序的开始定义设备名称#define device_name “s3c2440-gps”再定义主设备号,我是让系统自动分配的,以防主设备号已被占用,static int gps_major=0;驱动程序以一个模块初始化函数作为入口,如module_init(s3c2440_gps_init)向内核声明当前模块的初始化函数;再写gps的初始化函数:static int __init s3c2440_gps_init(void)函数,在这个函数里面注册一个设备,返回主设备号,可以写成:gps_major=register_chrdev(0,device _name,s3c2440_gps_fops),s3c2440_gps_fops是定义了的结构体,规定了驱动程序向应用程序提供的操作接口。如:static struct file_operations s3c2440_gps _fops ={.owner= this_module,。

open= s3c2440_gps_open,.release= s3c2440_gps_release=s3c2440_gps_release, .ioctl=s3c2440_gps_ioctl};继续向下写,gps_class=class_create(this_module,device_name);在/sysfs目录下创建这个设备的类。再是注册这个设备的类,如device_create(gps_class,null,mkdev(gps_major,0),null,device_name)。

gps应用程序即定位功能的实现

要实现gps的定位必须先要对gps数据包进行解析,gps上电后,每隔一定的时间就会返回一定格式的数据,数据格式为$信息类型,每行开头的字符都是$,接着是信息类型,后面的是数据,以逗号分开,完整的数据类型如下:$gprmc,080655.00,a,4546.40891,n,12639.65641,e,1.045,328.42,170809,,,a*60信息类型为:gpgsv:可见卫星信息、gpgll:地理定位信息、gprmc:推荐最小定位信息、gpvtg:地面速度信息、gpgga:gps定位信息、gpgsa:当前卫星信息、这里我只解析gprmc和gpgga的信息。一.gprmc数据详解:$gprmc,《1》,《2》,《3》,《4》,《5》,《6》,《7》,《8》,《9》,《10》,《11》,《12》*hh《1》utc时间,hhmmss(时分秒)格式《2》定位状态,a=有效定位,v=无效定位《3》纬度ddmm.mmmm(度分)格式(前面的0也将被传输)《4》纬度半球n(北半球)或s(南半球)《5》经度dddmm.mmmm(度分)格式(前面的0也将被传输)《6》经度半球e(东经)或w(西经)……。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭