GPS精确授时方法研究-基于ublox GPS

最近需要用到gps进行精确的时间同步,精度需要在几十到几百纳秒级别,研究了一下,感觉能用了,写篇博客记录一下。

ublox的gps都类似,可以通过uart,iic,spi进行通信(部分芯片没有spi),进行gps数据的传输或者进行gps模式的配置。网上一般教程都是通过u-center软件进行配置。

但是因为选芯片和设计电路时没考虑太多,芯片内部没有flash,外部也没加eeprom,所以没有办法通过上位机设置完之后保存,只能通过程序在每次上电之后重新配置,所以必须找到ublox的控制代码,在每次上电时进行gps设置。

ublox有一篇文档,专门讲控制代码的,一百多页,看了两天,发现ucenter配置好之后可以直接生成代码。。

https://www.u-blox.com/sites/default/files/products/documents/u-blox7-V14_ReceiverDescrProtSpec_%28GPS.G7-SW-12001%29_Public.pdf

打开ucenter,view-messages view 然后打开UBX-TP5,这里是进行time pulse设置的。点击左下角靠右的四个按钮的左数第三个,点两下,应该会出来代码的框,这时候进行图形化的配置,代码也会跟随这变化,需要注意的是,代码框内分为了左中右三部分,通过空格隔开的,只有中间的一部分是有用的,需要把中间的复制出来,整串代码中间通过空格隔开,不能有回车。

连接好后,把代码通过串口发过去,就会自动配置完成。
这时,time pulse会每秒发送一个脉冲,串口会输出上一个脉冲的时间,gps的误差只有几十纳秒。

但是因为脉冲频率很低,所以上升沿很长,这样误差比较大,所以将高电平时间改为1us,这样相当于1MHZ的频率,对于上升沿判断的误差会大大降低。

这样就得到了脉冲来的时候的准确时间,然后需要一个高精度的晶振,进行fpga内部的同步及时,当脉冲来的时候进行计时,收到串口的脉冲真实时间后,进行时间累加,即得到当前真实时间。如果晶振精度够高,误差就会很小。

当然,还有另一种方法,把time pulse设置为10MHZ,类似于时钟输出,这时需要主机提供中断,当gps模块接收到中断时,输出一个时间,这个时间是gps接收到中断前一个脉冲的时间,这样也可以得到真实时间,而且不需要fpga的高精度晶振。

参考资料:
https://www.u-blox.com/sites/default/files/products/documents/u-blox7-V14_ReceiverDescrProtSpec_%28GPS.G7-SW-12001%29_Public.pdf u-blox 使用手册

http://www.docin.com/p-319158614.html u-center软件使用
http://blog.csdn.net/xukai871105/article/details/19980139 u-center软件使用

http://www.cnblogs.com/pingwen/p/5225461.html u-blox指令解析

https://www.u-blox.com/en/product/u-center-windows u-center 软件

https://www.u-blox.com/sites/default/files/products/documents/Timing_AppNote_%28GPS.G6-X-11007%29.pdf ublox时钟设置

你可能感兴趣的:(fpga-gps)