草庐IT

精准时间,基于FPGA高精度守时(授时)方法研究

NTP校时服务器 2023-03-28 原文

精准时间,基于FPGA高精度守时(授时)方法研究

精准时间,基于FPGA高精度守时(授时)方法研究

安徽京准电子官微——ahjzsz

1 引言

高精度授时系统被广泛用于卫星导航、电力同步采样系统中[1]。起初高精度授时系统在导航卫星失连下,由于恒温晶振实际值与标称值存在误差,所以1 h守时误差可达到几微秒。近些年,部分学者提出统计每分钟标准秒脉冲信号下授时晶振产生的总脉冲数的方法来修正导航卫星失连后授时系统的守时误差[2]。但此方法精确度取决于导航卫星失连前1 min的晶振计数模块记录的脉冲数值,因而灵活性低且并未从根本上消除累积误差带来的影响。针对现有技术的不足,本文提出一种以统计学为基础消除累积误差的高精度守时方法。

2 守时总体方案

守时方案设计了5个模块:导航卫星信号接收模块、时间解码模块、晶振计数模块、模拟秒脉冲产生模块、显示模块。守时方案框图如图1所示。由导航卫星信号接收模块接收卫星信号,输出标准秒脉冲和时间码至FPGA时间解码模块,FPGA解出时间信息并根据通讯协议发送给显示模块[3, 4, 5]。晶振输出脉冲至FPGA,晶振计数模块计录标准秒脉冲每个周期内晶振脉冲数[6]。当记录时间达到30 min,计算这组数据的均值和方差。导航卫星失连后,根据前30 min计算的均值和方差动态设置晶振计数模块的脉冲产生计数器阈值以产生高精度的模拟秒脉冲。

 

3 守时硬件设计

FPGA采用Altera公司Cyclone II系列中的EP2C8T144C8N,该芯片具有144个IO端口、36个RAM块、2个PLL锁相环、18个嵌入式乘法器、四种配置方式和AS、JTAG下载调试接口。EP2C8T144C8N拥有丰富的资源且编程灵活,使得该芯片作为系统主控芯片[7, 8, 9]。导航卫星信号接收模块采用MHKJ-1612为主芯片,其能提供精确的授时服务。通过使用量化误差信息去补偿时间脉冲中的颗粒误差,导航卫星信号接收模快能够配置输出时间脉冲频率,授时精度可高达15 ns。即使设备在有遮挡物的情况下保证有一颗卫星正常连接,芯片就能输出准确的时间信息。导航卫星信号接收模块与FPGA采用串口通信,有多种波特率可供选择。系统晶振采用恒温晶振,频率精度可以达到正负0.2 ppm。消耗电流一般300 mA~2 A,主要应用于卫星,通讯基站等。守时部分硬件连接图如图2所示。

 

4 守时软件设计

4.1 同步秒脉冲信号设计

授时系统导航卫星连接正常情况下,导航卫星信号接收模块接收到卫星信号产生标准秒脉冲和时间码,并发送给FPGA接收模块。FPGA利用PLL锁相环将50 MHz恒温晶振倍频到200 MHz,当晶振计数模块脉冲计数值达到阈值或检测到导航卫星信号接收模块输出的标准秒脉冲信号上升,FPGA产生100 ms高电平信号并将晶振计数器清0,随后产生低电平信号。同步标准秒脉冲产生流程图如图3所示。

 

4.2 平均脉冲数及方差设计

当存储时间达到30 min时,利用 为1 s内晶振的脉冲数值,n为时长)和s2= ( 为平均1 s内晶振的脉冲数,Xi为1 s内晶振的脉冲数值)公式求出1 s内晶振的平均脉冲数和方差。根据拉依达准则,剔除数据中数值中大于  ± s+3 s或者小于x--3 s的异常值,然后再一次利用公式求出剔除后数据的平均值和方差。平均1 s内晶振的脉冲数以及方差产生的流程图如图4所示。

 

4.3 导航卫星失连后的高精度秒脉冲产生设计

导航卫星失连后,FPGA根据每秒内晶振脉冲数的平均值和方差,求出  ± s+3 s和  ± s-3 s作为设定脉冲计数的两个阈值BV1、BV2。在一个周期T内,前 当晶振脉冲计数达到BV1的时候,产生一个滞后模拟秒脉冲(与标准秒脉冲秒头相比);后 当晶振脉冲计数达到BV2的时候,产生一个超前模拟秒脉冲。产生的模拟秒脉冲秒头在标准秒脉冲左右有规律的晃动从而消除累积误差。导航卫星失连后的高精度秒脉冲产生流程图如图5所示。

 

 

5 实验结果分析

为避免测试结果的偶然性,实验使用4套授时系统板,采用50 MHz标称值的恒温晶振,精度可达正负0.2 ppm。先将恒温晶振输出的50 MHz的脉冲信号倍频到200 MHz,然后统计标准秒脉冲信号每个周期下授时系统恒温晶振所产生的脉冲数值的均值和动态方差。测试结果如表1所示。

表 1 导航卫星未失连下每秒晶振脉冲数值的均值和方差Tab. 1 Crystal’s average pulses number per second and variance when navigation satellite works

时间

10 min

30 min

1 h

2 h

分类

均值

方差

均值

方差

均值

方差

均值

方差

1号板

199 999 856.6

3.21

199 999 857.8

3.28

199 999 859.3

3.29

199 999 860.5

3.31

2号板

199 999 852.9

2.32

199 999 853.5

2.40

199 999 854.4

2.48

199 999 856.2

2.51

3号板

199 999 814.3

2.25

199 999 815.4

2.32

199 999 818.3

2.41

199 999 820.0

2.47

4号板

199 999 903.2

1.89

199 999 904.1

1.91

199 999 905.3

1.90

199 999 907.1

1.95

表1统计了不同时刻秒脉冲单位时间内晶振的脉冲数值的平均值和方差。图6图7横坐标为时间,纵坐标为均值和方差,折线图直观的反映了均值和方差随着时间的变化趋势。表2统计了在导航卫星失连下不同时刻模拟秒脉冲与标准秒脉冲的误差。图8横坐标为时间,纵坐标为误差大小,折线图直观的反映了误差随着时间的变化趋势。

 

 

图 6 均值随时间变化折线图

 

图 7 方差随时间变化折线图

 

图 8 守时误差随时间变化折线图

表 2 导航卫星失连下守时误差Tab. 2 Punctuality error when navigation satellite lost

分类

误差/ns

时间

10 min

30 min

45 min

1 h

1号板

45

78

127

183

2号板

44

84

138

197

3号板

45

69

132

211

4号板

42

76

141

204

6 结语

本文通过统计30 min内标准秒脉冲每秒晶振脉冲数值的均值和动态方差,动态设置晶振计数模块计数阈值以产生模拟秒脉冲,以达到高精度守时目的。从实验可知,秒脉冲在导航卫星失连1 h内,与标准秒脉冲相比秒头误差不超过250 ns,符合电力、靶场等系统守时要求。

有关精准时间,基于FPGA高精度守时(授时)方法研究的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  8. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

随机推荐