利用GPS全球定位系统的授时信号制作的GPS时钟源可以获得精确到毫秒的时钟信号,在一些需要精确时间的场合有非常广泛的应用。一台GPS授时钟至少要一千多块,一套完整的GPS网络授时系统就更贵了,那么它到底是怎样构成和运作的呢?这篇文章将详细介绍一个设计制作GPS授时钟和相关的网络授时程序的全过程,包括所有的硬件、图纸和程序。如果您有兴趣,也可以自己做一个哦!
一、GPS接收模块和天线
这里用的GPS模块和天线全部采购自www.ouravr.com邮购部,GPS模块为Jupiter21
“Jupiter”GPS/OEM(即Jupiter21,见图一)接收机具有尺寸小、性能稳定等优良特征。可方便、自主地开发出各种GPS应用系统。
1.它具有如下特点:
●极其紧凑的GPS接收机尺寸:71mm×41mm×11mm;
●其射频输入为1575.42MHz,范围为-130dBw~-163dBw;
●具有12个并行卫星轨迹通道,能快速识别和再识别当前位置;
●支持真正的NEMA-0183数据格式;
●直接微分的RECMSC-104数据动态提供定位精确度;
|
●自适应门限检测,提高微弱信号的检测能力;
●其于SA的静态导航能力;
●可与过去的天线兼容,花费很小;
●3D到2D导航时能自动保持纬度;
●可以基于SPS获得最佳导航精确度;
●无初始化数据时可以自动开启冷启动程序;
●通过串行通讯,用户有很大的操作空间和配置能力;
●可接受用户通过主串口写入的初始化数据;
●具有三种启动方式:热启动、初始化、冷启动;
●用户可以选择卫星;
●用户可以选择卫星表面角;
●具有可选的RF连接头;
●最大测速可达500m/s;
●工作温度范围为-40℃~+85℃。
这种接收器是通过两个串口与外部通讯的,串口1为主串口,串口2为辅助串口(提供修正量)。其中,串口1为全双工方式,串口2为半双工方式。系统通过这两个串口同其外部器件或设备连接,也可以用软件编程或硬件设置来配置其串口特性。
接收数据的用户可以选择的存储方式有三种:SRAM、ROM、EEPROM。
接收机内部的一个10kHz的参考时钟输出和一个1pps(每秒一个脉冲)的时钟标输出可用来进行时钟同步,也可用于进行时钟校准。
系统可以通过RESET进行复位。
|
配套的有源接收天线如图二所示。
<以上图片来自www.ouravr.com网站>
二、GPS模块测试程序
图三 Visual GPSXP 运行截图
GPS模块的测试可以使用VisualGPSXP程序来完成,见图三。只要搭一个简单的串行信号转换电路即可将模块接到计算机的串行口,GPS模块供电几分钟后就可以进行测试了,具体电路见本文所附的电路图。
Jupiter21模块为二代接收芯片,可能有点慢,不过还是有很强的处理能力和稳定性,我们需要把有源天线尽可能地安装到室外空旷的地方,最好是楼顶哦。给模块供电后等待一会就可以进行测试了。
三、单片机电路和图纸
为了方便显示GPS时钟信号,我们有必要制作一个电子钟。要接受GPS模块发出的串行信号,从中分析出时钟信息,然后显示出来需要单片机来完成。为了简单起见,我们使用LCD作为显示屏,并选用了AtmelM16L单片机,本来可以使用更低档一些的MCU的,为了方便使用AtmelDragon调试器,还是选用了有JTAG接口的M16L。如果只需要制作上位机软件就简单多了,单片机部分完全可以省略,只需要做一个串口电平转换电路就好了,用一片MAX232就行。
至于使用8段LED或点阵LED来制作更醒目一些的电子钟也可以,只是最好要做好电路板或者买表头来做,原来设计是用8段LED来做电子钟的,可在实验板上搞太麻烦了,我在实验用的洞洞板上焊了好久还没搞定6片74595和8段LED的线路,最后干脆放弃改用LCD来做了。不过,需要注意的是GPS模块发过来串口信号很多,过于复杂的显示操作可能需要从硬件和软件两个方面多做优化。
下面是完整的电路图(图四)和实际运行的电路(图五,包括单片机电路板、GPS接收模块、AtmelDragon调试器),电路中设置了一个单刀双掷开关,也可以用跳线代替,这主要是方便没有调试器时将MCU收到的GPS信息转发到计算机供调试或用于特定信息的转发。
|
图五 GPS钟实物以及Dragon调试器
四、单片机开发环境和程序
Jupiter 21GPS模块内部的一个10kHz的参考时钟输出和一个1pps(每秒一个脉冲)信号可以用来进行更高精度的校时,模块也引出了这两个信号。我们这里制作的电子钟只是对GPS信息进行解析获取时间,在要求更高的场合也可以通过将1pps脉冲接到中断口并配合10KHz参考时钟输出实现更高精度的授时。
数据格式
“Jupiter”GPS/OEM接收机具有两种数据格式,一种是二进制方式,另一种是NMEA(也为ASCII码)方式,可通过设置GPIO2和GPIO3来选择不同的数据格式。选择不同的数据格式所对应的形式不同,消息长度和内容也不同。
二进制方式消息格式共有31种消息(其中14种输出消息,17种输入消息),每种消息必有一个消息头,且以“0xFF81”开始,数据段可选;NEMA方式消息格式共有11种消息(其中7种输出消息,4种输入消息),每种消息以“$”开头,以<CR><LF>结束。前者消息长度比后者长,后者比前者消息种类少,可根据实际需要来选择。
“Jupiter”GPS/OEM接收机与外设连接,用串口来进行通讯。其串口设置如表一所列。
表一 GPS串口通讯设置
我们使用CodeVisionAVR C编译器和AVR Studio 4配合AVR Dragon调试器编写并调试成功了AVRM16 C语言程序。实现了日期和时间的解析与显示。
GPS模块输出的信息量比较大,我们对C程序进行了一定的优化。这段程序应该还有更大的优化空间,有兴趣的话,大家可以进一步修改。
这段程序主要分析了如下格式的GPS信息,以解析时间信息
$GPGGA,073253,3052.3748,N,11422.3272,E,1,05,1.80,26.5,M,-13.8,M,,*64
$GPRMC,073253,A,3052.3748,N,11422.3272,E,0.082,107.0,160209,3.9,W*62
网上流传的程序一般只分析$GPRMC信息,实际运行中可能出现明显的时钟变化不均匀的情况,加入的$GPGGA时间信号的分析是非常有必要的。此外,大部分程序对日期的计算也有疏失,遗漏了+8时区的日期变化问题。
单片机程序设计:
程序的主要流程是通过UART端口触发中断,一旦中断程序捕获了正确的GPS信息字符串就调用getgpsinfo()函数来进行分析,并把获取的信息输出到LCD上。
GPS模块每发送一个字符到单片机的UART端口都会触发一次中断,也就是说每次中断只能读到一个字符。我们知道NMEA格式信息均以“$”开头,以回车符<CR>结束,程序只要读到字符“$”就认为一段信息的开始,并进行记录,然后读到回车符时就可以认为读到一个完整的GPS信息了。
但是在某些情况下,这些信息未必就是正确的,如模块刚刚上电还没有搜索到足够多的卫星信号,或者根本就收不到卫星信号,或者信号被干扰出现乱码,还有一种情况我们必须要有清醒的认识,即MCU处理能力的影响,我们在调试模式或者代码质量低下的情况下,往往来不及处理完就又被下一个中断挂起,这样会导致大量的乱码。
所以我们有必要进行一定的优化,除了尽量精简优化代码外,放弃对大量用不到的信息的处理也是非常有必要的。所以在获取了一条信息的前几个字符以后我们就可以判断一下,这些信息是不是我们想要的“$GPGGA”和“$GPRMC”信息。不是的话就可以忽略掉。
获得了GPS信息后,就可以调用分析程序来解析这些它们,以便从中取出日期和时间码。从上面的分析可知,一条NMEA格式的GPS信息包含了很多内容,如时间、日期、精度、纬度、高度等等,而这些内容在信息中由逗号进行了区隔,所以他们的位置也是相对固定的,这样一来我们只要按逗号来截取一段段的信息即可获取我们想要的参数了。
GSP授时具有很高的精度,而授予的时间基准是格林威治时间,北京时间呢是+8时区,所以要加上8小时。还有一个问题需要注意的是,加上8小时后可能引起日期的变化,如格林威治时间2009-2-2016:00:00,那北京时间呢,是2009-2-2100:00:00,相应的日期也变化了。日期加一天,看起来很简单,其实逻辑上也还是比较复杂的,主要是大小月和闰年二月月末到月头的变化,忽略了这些可能每天都有八小时让人看笑话了。
上面的处理完毕以后,我们就可以按我们习惯的格式把日期和时间显示到LCD屏幕上了。
五、上位机程序
实际工作中我们并不是需要一个特别准的时钟摆在那里看看,更多的是需要能把这个时钟信号传送给其它需要核对时间的机器,这里主要是指计算机设备。在行业应用,出于安全的考虑,一般会把工作用的局域网和互联网进行物理隔离,连上互联网的计算机时间好办,可以和互联网上的授时服务器对时,保证一个可以接受的时间精度。而局域网计算机若没有授时设备就只能靠人工校准然后指望计算机内置的时钟了,可惜的是计算机主板都没有采用专门的时间芯片来计时而是由经过多次分频晶振频率来推算的,误差很大。
很多电视台会在播出整点报时,可是这个时间若是依赖叠加字幕的计算机的话,出现较大误差的情况就很多了。其实需要精确对时场合是很多的,如19点整转播新闻联播,现在都是硬盘播出系统在自动转播,这也需要计算机时间无误差。不过即使用了GPS授时,也可能出现问题,例如在转播CCTV新闻联播时,如果地方台和中央台都叠加时间字幕,就算都是准的,可由于CCTV信号的反复处理转播,已经有延迟了,这样两个时间还是不一样,不过这个延迟应该是固定的,我们也可以刻意修正一下本地时间。
给局域网电脑授时,就首先要给网络中的一台计算机授时,然后别的计算机和这台机器对时也好,由这台机器在网络中广播时间信息也可以,这样网络中所有的机器就有一个精确的时间了。
我们仍然可以通过RS232串行口来接收GPS模块发出的GPS信息,将模块的TXA脚输出的CMOS电平通过MAX232芯片转换为TTL电平后,通过串口电缆接到计算机串口,编写一个计算机程序就可以获取时间信息了。实际上,通过串行口上连接的GPS模块我们还能做更多事情,包括GPS导航都可以实现。
获取GPS信息解析参数的过程和前面介绍的单片机程序逻辑没有什么大的差别,不过我们可以利用Windows的SetSystemTime()函数,直接将格林威治时间赋给计算机,操作系统会自动转换到我们所在时区的时间。计算机自主时间是存在较大误差,但是这个误差是长时间积累的结果,所以,主动校正计算机时间的间隔可以放大一点,节约一下系统资源也好嘛。
图六所示GPS授时程序使用了Visual C++ 6编写,要运行该程序需要注册MSCOMM32.OCX串行口控件。
图六 GPS授时钟上位机程序运行截图
六、网络校时
至于局域网校时也可采用简单的net time命令来完成。下面的Visual Basic 6代码通过调用nettime命令来实现校时功能。
Call Shell("net time \" & strIp& " /set /y", 1)
我们也可以在系统的“Internet时间”(见图七)中设置服务器地址为安装了GPS校时程序的计算机地址,让局域网中的计算机自动校时。这一过程也可以通过下面的代码(VB6)来完成。
Call Shell("net time/setsntp:210.72.145.44")
Call Shell("net stop W32time")
Call Shell("net start W32time")
这段程序通过定时器来设置SNTP服务器地址,关闭W32Time局域网校时服务,重启W32Time服务来实现网络校时。
|
至此,GPS授时钟就制作完毕了,有兴趣的读者完全可以参照制作出实用的局域网GPS授时系统,在广播电视行业这样的授时系统基本可以满足制作、播出工作的需要。由于时间仓促难免有些错误,敬请各位指正。我的邮箱是:hptvschen@msn.com
参考文献:
OURAVR 网站 www.ouravr.com《宝贝逐个数(2):NAVMANJUPITER21 GPS卫星导航开发板(军品性能,震撼低价)》(本文前 两幅图片来自ouravr网站)
Jupiter 21 GPS Receiver Module PDF文档
NAVMAN NMEA Reference Manual PDF文档