处理,提取出经纬度,时间等有用信息,为自动报站及正点考核提供可靠数据,保证报站及正点考核功能的实现。这部分电路设计比较简单。
4.8 GPRS模块电路设计
本系统采用GPRs实现正点考核数据的远程传输,采用短信的方式实现车辆
紧急情况报警,这两大功能均依靠GPRS模块来实现。系统中GPRs模块采用SIMCOM公司的GSM/GPRS双频模块SIM300CZ,该模块主要为语音传输、短消息和数据业务提供无线接口,采用无铅设计,特别适合车载、移动电话、无线MODEM卡、无线PoS机、无线抄表系统以及无线数据传输业务的使用。sIM300cz模块为用户提供了功能完备的系统接口。60PIN的系统连接器是SIM300CZ模块与应用系统的连接接口,主要提供提供外部电源、RS.232串口,
SIM卡接口和音频接口。SIM300Cz模块可使用锂电池、镍氢电池或者其他外部
直流电源供电,电源电压范围为3.3V~4.6V,电源需要具有至少2A的峰值电流输出能力。由于GPRS模块对电源的特殊要求,系统在电路设计中选用了电源芯片MIC29302BT,对12V的电源稳压后得到4.2V电压供给GPRS模块使用。
SIM300cZ提供标准的Rs.232串行接口,用户可以通过串行口使用AT命令完成对模块的操作。串行口支持以下通信速率:300,1200,2400,4800,9600,19200,38400,57600,115200(起始默认)在本电路硬件设计中,SIM300CZ模块与主控制器LPc2124通过uAl玎1进行接口,使用模块默认的速率11 5200与模块通信。模块与控制器间的通信协议是AT命令集,除了串口发送(TX)、串口接收(RX)之外,微控制器与GPRS模块之间还有一些硬件握手信号,如DTR、CTs、DCD等。为了简化微控制器的控制,硬件设计时没有使用全部的硬件握手信号,而只使用数据载波检测(DataCa玎ier Detect,DCD)和终端准备(Data Teminal Ready,DTR)信号。DCD信号可以检测GPRS模块是处于数据传送状态还是处于AT命令传送状态。DTR信号用来通知GPRS模块传送工作已经结束。GPRS模块与ARM芯片通过TTL电平接口,无需电平转换。
4.9 语音及功放电路设计
本设计中语音处理模块选用高音质语音模块wTM.SD,该模块可播放MP3 格式文件,音质优美,通用性好,采用sD卡作为存储语音的载体,存储容量最
大可达2G,语音更新只需SD卡与电脑连接即可,十分方便,模块有四种工作模式:标准模式、按键模式、并口模式、串口模式,在本电路设计中采用串口模式工作,wTM.SD模块由主控制器UAl盯0口扩展出的子串口3进行控制,可以播放背景音乐,广告语,进行任意段语音的播放,该模块体积小巧,大小仅4lmm枣39mm,特别适合工业级应用。为了保证良好的语音质量,终端在功放电路设计中采用了专用的车载功放芯片TDA2003。TDA2003具有输出功率大、静态电流小、噪声低、保真度高、输入阻抗高、工作频带宽等特点。芯片谐波失真和交越失真小,且各引脚都有交、直流短路保护,使用安全可靠,负载上电压可冲至40V。TDA2003的体积较小,外围器件很少,在设计上也有简单灵活的特点。
4.10 硬件电路设计中需要注意的问题
在直流电源回路中,负载的变化会引起电源噪声。例如在数字电路中,当电路从一个状态转换为另一种状态时,就会在电源线上产生一个很大的尖峰电流,
形成瞬变的噪声电压。配置去耦电容可以抑制因负载变化而产生的噪声,是印制 电路板的可靠性设计的一种常规做法,好的高频去耦电容可以去除高到1GHz的 高频成分。陶瓷电容或多层陶瓷电容的高频特性较好。设计印制线路板时,每个 集成电路的电源、地之间都要加一个去耦电容。去耦电容有两个作用:一方面是 本集成电路的蓄能电容,提供和吸收该集成电路开门关门瞬间的充放电能;另一 方面旁路掉该器件的高频噪声。 电路设计中去耦电容的配置原则是:
(1)电源输入端跨接一个10pF~100肛F的电解电容器,如果印制电路板的位置允许,采用更大的电解电容器抗干扰效果会更好,如100pF以上。
(2)原则上每个集成电路芯片都应配置一个O.0l虾的瓷片电容。如遇到印
制电路板空间小而装不下时,可每4~1 O个芯片配置一个1 pF~10pF钽电解电容器。 (3)每10片左右的集成电路要加一片充放电电容,或称为蓄放电容,电容大小可选l O肛F。通常使用的大电容为电解电容,但是在滤波频率比较高时,最好 使用钽电容或聚碳酸酯电容。
(4)对于噪声能力弱、关断时电流变化大的器件和RoM、RAM等存储型器件,应在芯片的电源线(vcC)和地线(GND)间直接接入去耦电容。
(5)去耦电容一般是为开关器件或其他需要滤波、退耦的器件而设置的,布置这些电容就应尽量靠近这些元部件,不能离的太远。
(6)去耦电容的引线不能过长,引线越短,去耦效果越好。特别是高频旁路电容不能带引线。 (7)去耦不是越多越好,而是要注意滤波的效果,根据电路板和器件的时间情况来选用电容的个数和大小。
(8)去耦电容在要求较高的时候不用瓷片电容和电解电容,因为它们的容值精度差,分布电感大,要选用比较精确的钽电容或者聚酯电容等。
4.11 本章小结
在本章中,重点对智能公交车载终端的硬件设计进行了介绍,包括电源模块
设计、ARM中央处理器模块设计、串口及其扩展电路设计、GPS模块电路设计、
GPRS模块电路设计、语音及功放电路设计设计等。另外,就硬件设计中需要注意的问题进行了一些探讨。
5 智能车载终端系统的软件设计
本章详细介绍了车载 GPS 定位系统软件系统的设计方案,详细介绍了针对硬件平台的嵌入式操作系统ARM-Linux 的移植,以及在该操作系统下如何进行应用软件的编程。
5.1 嵌入式操作系统的选型
日前,市场上出现的嵌入式操作系统非常多,如:WinCE、VxWorks、Palm OS Linux等。本车载GPS 系统中我们选择了Linux[36]作为操作系统,因为Linux 为嵌入式操作系统提供了一个极有吸引力的选择,它具有以下一此特点:
1)Linux 是一个和Unix 相似、以核心为基础的、虚拟内存机制、多任务的操作系统。 2)Linux 具有广泛的硬件支持特性。Linux 最通常使用的微处理器是Intel X86 芯片家族,
但它同样能运行于Motorola 公司的68K 系列CPU;IBM、 Apple、Motorola公司的PowerPC CPU,SUN 公司的Sparc CPU 以及Intel公司的Strong ARM CPU等处理器系统,这念味着嵌入式Linux 将具有更广泛的应用前景。
3) Linux 系统是层次结构且内核完全开放。不同领域和不同层次的用户可以根据自己的应用需要很容易地对内核进行改造,在低成本的前提下,设计和开发出真正满足自己需要的嵌入式系统,再也不必担心像MS Windows 操作系统中“后门”的威胁Linux 具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以直接使用内核调试器来作操作系统的内核调试和查错。
4)Linux 还提供了强大的网络功能。Linux 诞生于因特网,它支持所有标准因特网协议,并且可以利用Linux 的网络协议栈将其开发成为嵌入式的TCP/IP 网络协议栈。
5.2 交叉编译环境的建立过程
建立交叉编译环境即可以下载直接解压的压缩包,例如cross-2.95.3.tar.gz,也可以自己下载必要的组件工具包来安装建立。如果下载的是已经建立好的压缩包就直接解压就可以了。但是这样建立的交叉编译环境里面含有里面有chill, fortran, java 等语言的编译器,这些都不是必须的,而且编译的时候有可能出现组件版本不匹配的情况,这个时候就需要自己下载组件包进行交叉编译环境的建立。主要需要的是binutils、gcc、glibc、glibc- linuxthreads这四个工具包。首先解压binutils工具包,然后进入生成的目录运行./configure --target=arm-linux--prefix=/usr/local/进行配置,target选项表示选定的目标代码格式,一般是arm- linux,prefix 表示在执行make install 时的安装根路径。然后运行make和make install进行安装。解 压 gcc 工具包, 进入生成的目录, 修改gcc/config/arm/t-linux 文件, 在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h这两个变量。运行./configure --target=arm-linux--prefix=/usr/local -enable-languages=c--withheaders =ARMLinux源码目录下的include目录。这里前两个选项和上面binutils的安装类似,--withheaders是用来指定内核头文件的目录,一般就可以使用上面ARMlinux 的include 目录。需要注意的是这里的路径需要用全路径名,而不能使用相对路径。运行make和make install安装。解压glibc工具包,进入生成的目录,再解压glibc- linuxthreads工具包,运行CC=arm- linux-gcc 设置编译器, 运行./configure arm-linux -build =i686 - linux--prefix=/usr/local/arm-linux --enable-add-ons,运行make和make install安装,接下来还要重新安装gcc工具包,前面已经说了,在第一次安装gcc的时候还没有安装glibc库,因此对t-linux文件作了适当的修改,现在把在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthR_posix_h去掉,重新安装一遍gcc ,至此交叉编译环境就建立好了。
5.3 配置编译内核
内核,是一个操作系统的核心,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。由于Linux 的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。在嵌入式linux 设计与应用中,或许你不需要经常升级你的内核,但是为了使你的目标板能够支持更多的外设,你将不得不自己设计驱动程序,或者有时你需要重新设定内核中的某些模块。所有这些工作,重新编译内核将使你更熟悉自己定制的系统。
5.3.1 内核源码的下载及安装
内核源码可以到ftp://ftp.kernel.org/pub/linux/kernel这个地址去下载,Linux的内核都是以Linux- x.y.z的形式给出,下载完内核以后还需要下载一个针对ARM的补丁,可以到ftp://ftp.arm.linux.org.uk/pub/armlinux/kernel这个地址下载,一定要下载与内核版本号相对应的补丁,否则有可能编译不了。在ARM内核的树形图中在版本号加上了一个后缀,-rmkN,或–vrsN,这里'N'指的是补丁号。举个例子,2.4.26-vrs1,这表示需要用到的ARM内核的补丁号。(注意:2.6.0-test2以后版本的内核不再需要-rmk 或-vrs 补丁,因为些版本的ARM内核已将这些补丁集成了。)在本文中所使用的内核文件为linux-2.4.21.tar.bz2。ARM补丁文件为patch-2.4.21-rmk2.bz2。这两个文件都下载了以后还需要下载一个针对AT91RM9200 的补丁, 这个文件可以到http://maxim.org.za/AT91RM9200这个地址下载,下载的补丁也要与linux的版本号一致。在本文中使用的是2.4.21rmk2-at91-08032004.patch.gz。当这些文件都下载以后就可以在宿主机上安装linux内核了,并为内核打上相应的补丁。
5.3.2 配置内核
进入解压后的内核源码目录,修改主目录下的Makefile文件,找到ARCH :=
$(shell uname -m | sed –es /i.86/i386/-es/sun4u/sparc64/-es/arm.*/arm/-es/sa110/arm)和CROSS_COMPILE= 这两项, 修改为ARCH ?= arm 和CROSS_COMPILE ?=
/usr/local/bin/arm- linux- 。要注意的是将某种功能编译为模块方式会比编译到内核的方式速度要慢一些,不必要的驱动越多,内核就越大,不仅运行速度慢、.占用内存多,在少数情况卜、还会引发其他问题。确认当前的 shell 为bash,运行make menuconfig 就可以对内核进行配置了。
5.3.3 编译内核
配置好内核以后运行make dep生成文件的依赖关系,然后就可以编译内核了,编译内核有两种方式,分别是压缩方式和非压缩方式。
非压缩方式: 该方式下,内核在RAM中运行,需要先通过bootloader将内核的执行映象文件下载到指定位置,然后再跳转到下载地址处执行,一般内核大小会超过512K。这种方式使用make vmlinux来编译内核,或者直接运行make命令。
压缩方式:该方式下,内核从rom中启动,将被压缩的内核解压到ram,然后执行内核。其优点是可以将内核烧到flash中,而无需手工下载,同时压缩的内核也非常小,大概在200k至300k左右。这种方式用make bzImage来编译内核。编译成功后会在arch/arm/boot目录中生成内核的镜像,此镜像下载到flash中就可以通过bootloader引导了。
5.4 嵌入式引导程序移植
所谓引导程序(BootLader),即系统加电后运行的第一段软件代码,嵌入式系统的引导程序负责家在整个启动任务,整个过程包括硬件设备初始化、建立内存空间的映射图、配置合适的软硬件环境,以便能够调用操作系统的内核。BootLader的主要运行任务就是将内核映像从硬盘上读到RAM中,然后跳转到内核的入口点去运行,这样操作系统就开始启动。 Bootloader可以从SAMSUNG公司官方网站下载,经过交叉编译生成Bin文件,下载到ARM开发板上。
5.5 应用软件的设计
因为这个车载 GPS 系统用的是ARMLinux 做的操作系统,所以所有的应用程序都是在Linux 操作系统下编写的,然后通过交叉编译生成可以在ARMLinux 系统中直接运行的程序。整个软件涉及到 Linux 下的串口编程、Linux 下的网络编程和Linux 下的多线程编程三个方面,下面将分别予以介绍。
5.5.1 Linux 下的串口编程
Linux 操作系统从一开始就对串行口提供了很好的支持,Linux对所有各类设备文件的输入输出操作看上去就像对普通文件的输入输出一样,所以Linux 对串口的操作也是通过设备文件访问的。为了访问串口,只需打开相应的设备文件即可,在Linux下默认串行口COM1和COM2对应的设备分别为/dev/ttyS0和/dev/ttyS1。一个简单的串口初始化程序如下: InitCom{
struct termios options; /*定义一个termios 类型的结构体options*/ int fd2;
fd2=open(\打开串口*/ tcgetattr(fd2, &options);
cfsetispeed(&options, B4800); /*设置波特率*/ cfsetospeed(&options, B4800); /*设置波特率*/
options.c_cflag |= CS8 |CREAD | CLOCAL; /*设置串口属性*/ options.c_iflag |= IGNPAR |ICRNL; /*设置串口属性*/ options.c_lflag = 0; /*设置串口属性*/ options.c_oflag = 0; /*设置串口属性*/
options.c_cc[VMIN]=254; /*设置串口接收的最少字节树*/ options.c_cc[VTIME]=0; /*设置字符输入间隔时间*/
tcflush(fd2,TCIFLUSH); /*清空数据线,启动新的串口设置*/ tcsetattr(fd2, TCSANOW, &options);}
其中 c_cc[VTIME]和c_cc[VTIME]这两个参数比较重要,c_cc[VTIME] 设定字符输入间隔时间的计时器,而 c_cc[VMIN] 设置满足读取函数的最少字节数。他们的不同组合将影响串口输入的结果。当
MIN>0, TIME=0 时读取函数在读到了 MIN 值的字符数后返回。
MIN=0, TIME>0 : TIME 决定了超时值,读取函数在读到一个字节的字符,或者等待读取时间超过 TIME(t = TIME * 0.1s)以后返回,也就是说,即使没有从串口中读到数据,读取函数也会在 TIME 时间后返回。
MIN>0, TIME>0 : 读取函数会在收到了 MIN 字节的数据后,或者超过 TIME时间没收到数据后返回。此计时器会在每次收到字符的时候重新计时,也只会在收到第一个字节后才启动。
MIN=0, TIME=0 : 读取函数会立即返回。实际读取到的字符数,或者要读到的字符数,会作为返回值返回。这两个参数要根据具体的情况来配置,初始化了的串口就可以直接用 read()和write()函数从串口接受或者发送数据了。