## [原创] 用GPS模块建立高精度ntp服务器
本文原创:**中国科学技术大学 张焕杰**
修改时间:2019.02.26
# 零、高精度时间的定义
简单的说,衡量时间主要有2个参数,分别是offset和jitter。offset可以理解为与标准时间的偏差,jitter可以理解为时间均匀度。
比如一个石英钟,每天对比与CCTV新闻联播时间一致,可以认为jitter为0,但offset并不一定为0,因为电视信号传播需要时间。
理想的ntp服务器,offset和jitter都为0。
对于现实的计算机,我们希望:
* 时间单向增加,也就是不会发生往回调表的情况。
* 时间均匀增加,也就是不会忽快忽慢,即上面描述的jitter尽量接近0。
* 与标准时间偏差尽量少,即上面描述的offset尽量接近0。
使用GPS模块授时的ntp服务器,据称offset可以到10µs(即0.01ms,大约相当于光或电波传播3km的时间)左右,jitter与服务器晶振和环境温度有关,一般可以到10µs以下(即0.01ms)。
# 一、GPS授时简单原理
GPS卫星有精密时钟源,GPS模块依靠接收到信号时间差来计算位置,同时可以通过以下两种方式对外输出时间信息:
一是通过串口输出NMEA语句,如下的北斗格式(GPS格式,前面是$GPRMC)输出:
```
$GNRMC,015022.00,A,3150.59184,N,11716.04078,E,0.242,,260219,,,D,V*12
```
其中的015022是时间01:50:22(UTC时间,对应的北京时间是09:50:22),260219是2019年2月26日。
这种输出,由于串口工作在9600BPS速率,误差比较大。
二是通过引脚 1PPS,信号的上升沿表示每秒钟的开始。1PPS信号的精度比较高,在10-30ns。
结合以上两种方式,可以从GPS模块得到高精度的时钟信号。
# 二、GPS模块/接收器的选择
如果是连接PC机使用,建议选择RS232信号电平的模块,如果连接树莓派机器使用,可以使用TTL信号电平的模块。
绝大部分GPS模块,引出了电源、地、RX、TX四根线,而并未将1PPS信号引出。用作ntp时,购买时让商家断开RX信号,引出1PPS信号。
我从taobao 深圳北天通讯 购买的 GPS/北斗双模BS-70DU接收器,其中USB口用来给模块供电,RS232口用来通信。
特别注意:购买时与店主沟通,让店主断开RX信号,将1PPS信号连接到DB9的1口,即DCD信号。
模块外形如下:
![BS-70DU](bs-70du.png)
后来&#x