基于ARM的嵌入式车载GPS定位系统设计
扫描二维码
随时随地手机看文章
0 前言
车载定位系统作为车载信息系统的重要部分,利用GPS等装置,以一定精度实现车辆定位,包含位置、速度和行车方向等车辆姿态信息。继一些国家之后,我国一些科研院所和高校也开始研究自己的车载定位系统,市场空前的繁荣。但是传统系统功能单一、集成度不高。随着ARM处理器在全球范围的流行,32位的RISC嵌入式处理器已经成为嵌入式应用和设计的主流。同时嵌入式Linux是一个非常好的免费的操作系统内核,具有稳定、良好的移植性、优秀的网络功能、完备的各种文件系统的支持、以及标准丰富的API等特点。因此,本文提供了一套具有先进性及工程实用性的车载定位系统整体解决方案,使得系统的性能、集成度和可扩展性大大提高。
1 系统的硬件设计
1.1 系统的整体硬件设计
本文车载信息系统由以下几部分组成:主控制部分、定位部分、通信部分、数据采集部分、显示部分,如图1所示。
主控制部分采用了三星公司基于ARM920T的S3C2410和Linux的嵌入式系统平台,完成整个系统的控制。其主要包括电源电路、时钟电路、复位电路、存储模块电路、JTAG接口电路、串行口电路、LCD接口、SPI接口以及按键电路的设计。主控模块通过串行口、SPI接口、LCD接口与扩展模块相连接构成整个硬件系统。
1.2 GPS模块的硬件设计与制作
定位部分采用了自行设计和制作了基于瑞士U-BLOX公司LEA-4S芯片的GPS接收模块。在此给出了GPS接收模块的整体设计,如图2所示。
u-blox的GPS部分分为两部分。采取数字/模拟分开设计的方法,有效提高了模块的抗干扰能力。在硬件的设计制作过程中。也是分为两步,即模块部分和数字部分。模拟部分主要由天线接入端及天线供电部分/检测电路构成。
天线选用3v供电的有源天线,增益27dB左右,噪声系数1.5dB左右。天线接入模块较为复杂,从GPS有源天线接收的信号频率高选1.575C,属于微渡范围。PCB设计需要满足天线座到模块RF_IN端的阻抗匹配为50Ω。
模块供电电源稳压电路为5v转3v的五脚LDO,对电压稳定精度较高,要求输出纹波在50mV以下,电流为150mA左右,这里选用精工的SOT-23-5封装的LDO S-11123.0V,能满足电源供应的要求。后备3V可充电微型锂电池则为数据保存作用。
选择电路为波特率的选择及速率选择。或是启动速度之类的选择,一般可以用默认值。
数字部分硬件相对简单,LEA-4S为两路TTL电平输出,分别为9600/11520波特率,分别支持国际通用GPS协议NMEA及u-blox公司的UBX二进制格式。在本设计中,通过串口O提取ASCII码,串口数据通过MAX232电平转换为RS232电平。另外,将GPS模块的发送端和接收端经电平转换后与审口DB9交叉相连。
2软件平台的搭建
系统的软件平台的搭建其实就是嵌入式linux操作系统的移植移植工作,主要包括4步:建立交叉编译环境,移植引导程序,编译内核,生成根文件系统。
交叉编译工具主要由gcc,binutils和glibc这几部分组成。由于重新建立一个交叉编译工具链比较复杂也没有任何意义,所以本文使用已经做好的工具链。因此建立交叉编译环境的过程实际就是对工具包cross-3.3.2.tar.bz2解包的过程。
本文移植的Bootloader是韩国Mizi公司开发的vivi.首先在根目录下创建一个armsys2410目录,对vivi_armsys.tgz执行解压命令。解压完成后进人vivi_armsys.执行命令makememmonfig,然后选择"Load on Alternate Configuration File"菜单,再写入arch/def-co-igs/smdk2410,进行vivi的裁剪。执行make命令进行编译,在vivi_armsys目录下生成vivi二进制文件。最后将其烧写到Flash.
内核的编译通过命令make menueorffig进行内核的配置;通过命令make dep建立依赖关系;通过命令make zlmage建立内核。得到Linux内核压缩映像zhnage.最后通过vivi命令提示模式下使用下载命令,将压缩映像文件zlmge装载到flash存储器中。
Linux支持多种文件系统。cramfs是Linus Torvalds撰写的只具备最基本特性的文件系统。本文使用mkcramfs工具对主机里已有cramfs文件系统进行制作和压缩。最后也要烧写到flash的相应部分。
3 GPS模块驱动程序的开发
Linux将设备分为最基本的两大类,字符设备和块设备。字符设备是单个字节为单位进行顺序读写操作,通常不使用缓冲技术;而块设备则是以固定大小的数据块进行存储和读的。
GPS模块驱动程序是在UART驱动程序的基础上加入对GPS模块初始化和对GPS模块输出数据处理的部分,构建一个独立的驱动模块,在导航系统进实时导航工作模式时挂接到系统内核中,实现GPS功能。
3.1 初始化/清除模块
在初始化程序段中要完成对GPS设备的注册,设备节点的创建和对串口相关寄存器的初始化。部分代码如下:
3.2 两个数据结构定义
模块驱动的最终目的就是取得GPS信息,因此规范GPS数据是对数据传递的可靠性和速率都是有益的。
struct GPS_DATA{
unsigned int hour;//小时,24小时制
unsigned int minute;//分
unsigned long Second;//秒,精度小数点后三位
unsigned long latitude;//纬度
unsigned char southornorth;//纬度属于南北的标志码
unsigned long longitude;//经度
unsigned char eastorwest;//经度属于东西的标志码
};//其中包括了在导航系统中所需的几个重要数据。
另外还有对驱动模块文件操作结构的定义。即:
static struct file_operations gps_fops={ead:gps_read,
rite:gps_write,
octl:gps_ioctl,
open:gps_open,
elease:gps_release,
};//定义了设备操作映射函数结构。
3.3 驱动程序的模块操作
在导航系统进入GPS导航模式时,系统首先是将GPS模块注册到操作系统中,实现初始化过程,再通过gps_open函数打开设备,此过程中完成对中断、缓冲区以及定时器等资源的申请,为GPS数据读取做准备。通过gps_write()向模块写命令字来是自主地选择工作模式,gps_ioctl()则是选择串口传输模式,使之与GPS模块传输模式相匹配。之后的应用程序将创立一个独立的进程为进行GPS数据的读取gps_read(),该进程没有数据时进程会一直处于睡眠等待数据,有数据来,进入中断处理模块,完成数据的分析,生成GPS_DATA数据结构,供导航使用。这个进程是随着导航模式的切换而终止的,此时除了关闭进程外,还需要用gps_release()释放申请的所有资源,并关闭设备。
3.4应用程序的实现
GPS模块通过串口输出NMEAO183语句,而应用程序主要完成对GPS数据的采集与解析。NMEA0183输出语句多达十余种,任意一种定位语句都包含一定的定位数据,由于以"$GPRMC"开头的语句包含了本系统所需的所有定位信息,本系统只需研究该类型。该类型定位数据的各个符号位的含义如下所示。
应用程序的整体设计流程如图3所示。
从图3可以看出,系统开始运行后首先对串口的初始化就是对GPS模块韧始化,包括设置波特率、数据位、校验位等,然后开始接收GPS数据。即从串口读数据。井将读到的数据保存到BUF中;接着进入数据的解析和提取阶段。通过BUF等不等于"c"判断是苦为$GPRMC;若是,则开始提取经纬度、时间等信息并存入结构体GPS_DATA中。最后通过LCD显示出来。
4 结束语
本文给出了基于ARM9和嵌入式操作系统Linux下,GPS定位系统的整体解决方案。包括了系统的整体设计,GPS模块制作方案,开发平台搭建以及GPS驱动程序和应用程序的设计。较市场上的车载定位系统相比,本设计在功能性、可扩展性和稳定性上都有所提高。由本系统作为基础,车载定位系统的下一步工作将可以专注于应用程序的编写,包括提高GPS定位精度的算法,以及开发更加友好的人机交互界面。