十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

GPS驯服恒温晶振:基于TDC的时差测量与递推滤波设计

GPS驯服恒温晶振:基于TDC的时差测量与递推滤波设计 简介面向测控系统与时间频率同步领域的工程技术人员这篇PDF文献提出一种基于时间数字转换器TDC的GPS驯服恒温晶振系统设计方案旨在用较低成本解决传统高精度时间频率设备价格昂贵、恒温晶振频率准确度难以达标等实际问题。压缩包内仅1个PDF文档约251KB篇幅虽短但覆盖系统总体设计、硬件组成、TDC-GP1时差测量电路、优化递推平均滤波算法以及驯服精度分析等关键环节。已有337人学习关注度不俗。读者可由此掌握基于TDC实现250ps时差测量的具体方法理解如何利用GPS秒信号对恒温晶振进行实时校准并通过递推平均滤波抑制GPS信号抖动使频率驯服精度优于3×10^-10同时内容中对恒温晶振与铷原子钟方案的对比取舍、测控系统时间同步需求的分析也可为相关项目设计、论文写作或工程开发提供直接参考。1. 为什么说GPS驯服OCXO的关键不在GPS而在时差测量做时间频率系统的人大多遇到过这个尴尬铷钟短期稳定度好、准确度高但一台商用铷钟的价格足够买几十只像样的恒温晶振而OCXO便宜、短稳出色频率准确度却会随老化漂移长期使用必须依赖外部参考来校准。测控站、卫星通信地面站和分布式测量网络偏偏需要长期稳定且成本可控的时间基准这迫使工程上把GPS的长期准确度和OCXO的短期稳定度拼在一起——用GPS秒脉冲做参考实时测出本地OCXO的频率偏差并修正这就是GPS驯服恒温晶振系统。拆过这类系统的人会告诉你所谓驯服本质上是一个长时间测量加反馈控制的闭环。GPS只负责提供一个长期统计意义上准确的1PPS信号而真正决定驯服精度的是时差测量的分辨率你能把OCXO分频出的1PPS和GPS秒信号之间的相位差量到多准就能把频率偏差算得多准。2011年《电讯技术》上发表的这篇基于TDC的GPS驯服恒温晶振系统设计恰好把这条链路上最核心的器件选型、时序约束和滤波策略都讲清楚了里面用到的时间数字转换器方案放到今天的低抖动时钟驯服项目里依然有参考价值。这套系统用TDC-GP1芯片把时差测量做到250ps分辨率配合窗口为120的递推平均滤波驯服后频率准确度优于3×10⁻¹⁰驯服时间约1200秒。下面从测量链路、分频时序、滤波算法和压控校准几个层面把整个方案拆开看。2. 高分辨率时差测量方案对比与TDC-GP1的选型逻辑2.1 三种时差测量方案的工程取舍时差测量的本质是把两路秒脉冲前沿的时间间隔转化为数字量。2007年左右的文献里主流方案有三条路线FPGA延迟线内插、模拟内插和时间数字转换器专用芯片。FPGA延迟线内插法利用FPGA内部的进位链作为延迟单元测量分辨率可以做到121ps但缺点是延迟单元的温漂和非线性难以补偿标定麻烦而且为了布一条稳定的延迟链要占用大量逻辑资源成本并不低。模拟内插法通过电容恒流充放电来扩展时间尺度能把分辨率做到400ps量级但模拟电路对噪声敏感板级布局稍微不合理读数就跳调试周期长。TDC-GP1是德国acam公司现为ScioSense推出的专用时间数字转换芯片内部采用门电路延迟链加粗计数结合的方案典型分辨率可以做到250ps左右。相比前两种方案它的优势在于把延迟链和校准逻辑封装在芯片内部用户只需要关心SPI接口读写和测量范围的约束。对做工程的人来说这意味着不用跟延迟线的温漂搏斗也不需要在PCB上精心呵护模拟充放电回路。论文里选择TDC-GP1本质上是在分辨率、开发成本和可维护性之间取了平衡。用表格把三条路线放在一起看更直观测量方案分辨率主要问题适用场景FPGA延迟线内插121ps非线性差、标定复杂、成本高已有FPGA且需要集成测时功能模拟内插400ps易受噪声干扰、实现困难对分辨率要求不高的低速场合TDC-GP1专用芯片250ps测量范围受限、需要SPI驱动独立时差测量模块性价比高2.2 TDC-GP1测量电路与时序约束TDC-GP1的测量原理是被测信号START触发延迟链开始传播STOP信号到来时锁存延迟链状态粗计数器记录整周期数细计数部分由延迟链插值得到亚纳秒级的时间余量。在系统里START信号由分频模块产生STOP信号来自GPS秒信号测量得到的时间间隔就是晶振1PPS与GPS秒信号之间的时差。实际使用TDC-GP1时有几个参数必须严格满足否则测量结果根本不可信。首先是被测信号脉冲宽度要求大于2.5ns这很容易满足GPS模块输出的秒脉冲宽度通常在几十毫秒到几百毫秒其次是START与被测信号之间的时间间隔要落在3ns到7.6μs的范围内。这个约束非常关键意味着上电后不能直接开始测量必须先把粗同步做好让两个秒脉冲之间的相位差小于3μs之后TDC才能稳定工作。这里有一个工程上容易忽略的细节论文中专门提到在测量开始前要进行初步时间同步确保GPS秒与晶振1PPS之间的时差小于3μs。这个粗同步靠CPLD里计数器清零来实现本质上是先把细测量需要的窗口建立起来。如果忽略这一步TDC-GP1可能测量出错误值而且这种错误不是滤波能消除的。2.3 系统硬件组成与信号流整个系统的信号流可以这样概括GPS模块输出1PPS信号恒温晶振输出10MHz信号送到CPLD分频模块分频得到本地1PPS本地1PPS与GPS 1PPS同时送入TDC-GP1测量时差TDC把时差数字值通过SPI送给数据处理单元MCU或DSP数据处理单元根据时差序列计算频率偏差控制DAC8571输出压控电压调整OCXO的频率。值得注意的是GPS秒信号本身存在抖动。论文采用的GPS模块是Motorola M12在位置保持模式下输出秒信号的抖动方差小于20ns。20ns的抖动和TDC的250ps分辨率放在一起意味着单次测量的噪声主要来自GPS而不是TDC本身靠后级的递推平均滤波来压低。3. CPLD分频与测量窗口控制的时序设计与实现3.1 分频计数逻辑的搭建分频模块的功能可以拆成两路一路把10MHz分频得到1PPS另一路把GPS秒信号延时约999996μs生成START信号。之所以延时999996μs而不是1000000μs是为了让START信号超前GPS秒信号约4μs这样TDC-GP1测量得到的间隔落在其3ns到7.6μs的线性范围内。用VHDL描述这个分频逻辑并不复杂核心是一个模10000000的计数器加上比较器-- 分频模块核心逻辑 -- clk_10m: 恒温晶振10MHz输出 -- gps_pps: GPS秒脉冲 -- pps_out: 本地分频1PPS -- start_out: START测量信号 process(clk_10m, rst_n) begin if rst_n 0 then cnt (others 0); pps_out 0; elsif rising_edge(clk_10m) then if cnt 9999999 then cnt (others 0); pps_out 1; else cnt cnt 1; pps_out 0; end if; end if; end process;这个10MHz的计数器每计数到9999999时拉高一个时钟周期的pps_out等效于1Hz脉宽100ns的脉冲。分频系数是10000000任何OCXO频率偏移都会直接反映在pps_out的相位漂移上后续的TDC测量就是量化这个漂移量。3.2 START信号的延时生成与粗同步生成START信号需要把GPS秒信号延时999996μs这同样可以通过计数器实现。这里的关键是理解延时差4μs的设计意图如果GPS秒和本地1PPS完全对齐START会超前GPS秒4μsTDC测得的时差就是4μs附近的值落在3ns到7.6μs的测量窗口内。但晶振存在频率偏差本地1PPS会相对GPS秒缓慢漂移。当漂移量超过3μs时TDC测量值就会超出范围此时需要通过计数器清零来强制同步-- 粗同步逻辑 -- 当本地pps与gps_pps时差超过3us时用gps_pps清零计数器 process(gps_pps, rst_n) begin if rst_n 0 then cnt (others 0); elsif rising_edge(gps_pps) then cnt (others 0); -- 强制对齐 pps_out 1; end if; end process;这段代码的逻辑是每次GPS秒到来时清零本地计数器强制本地1PPS与GPS秒对齐。清零后本地计数器继续以10MHz自由运行直到下一次GPS秒到来再次清零。由于OCXO短期稳定度很高相邻两秒内的相位漂移远小于3μs所以这个粗同步机制只需要在驯服初期或GPS信号重新锁定后起作用。我一般在调试这类系统时会用一个示波器同时观察GPS秒、本地PPS和START三路信号重点确认两件事一是本地PPS与GPS秒的相位差在清零后是否小于1μs二是START是否确实超前GPS秒约4μs。前者决定TDC能否正常工作后者决定测量值是否处于线性区间中部。3.3 时差测量与频率偏差计算的关系有了稳定的时差测量值后频率准确度的计算基于频率和周期的倒数关系Δf/f (Δt₂ - Δt₁)/(t₂ - t₁)。其中Δt₁和Δt₂分别是在t₁和t₂时刻测得的本地1PPS与GPS秒之间的时差值。这个公式的含义很直观如果本地晶振频率比GPS参考频率高本地1PPS会逐渐超前GPS秒Δt随时间变大反过来则变小。相邻两次测量之间的时间间隔是1秒所以分母t₂ - t₁约等于1秒。如果Δt₂ - Δt₁为300ns则频率偏差为3×10⁻⁷这个量级的偏差通过DAC压控完全可以修正。单次测量的250ps分辨率对应2.5×10⁻¹⁰的单次频率测量误差这个数值已经接近设计指标3×10⁻¹⁰所以必须靠多次平均来降低随机噪声。4. 递推平均滤波算法的原理、实现与参数选择4.1 为什么GPS秒信号抖动不能直接硬扛GPS秒信号的抖动来源很多电离层和对流层延迟变化、接收机内部环路带宽、多径效应、位置保持模式下的定位噪声等。M12的抖动方差小于20ns看起来不大但换算成频率测量误差就是2×10⁻⁸的量级比目标精度3×10⁻¹⁰差了接近两个数量级。如果直接用单次时差测量值计算频率偏差并驱动DAC调整压控电压会剧烈抖动OCXO输出频率跟随着抖动短稳反而变差。所以必须对时差数据序列做滤波把GPS秒的随机抖动平滑掉同时保留OCXO频率漂移的趋势信息。4.2 递推平均滤波的窗口选择与优化递推平均滤波的本质是移动窗口平均取当前时刻前n个时差测量值求平均作为当前时差的估计值。窗口n越大对随机抖动的抑制越强但对频率变化的响应越慢。论文给出的窗口是120对应120秒的数据平滑时间。基本递推平均公式可以写成def recursive_average(delta_t, window_size120): delta_t: 时差测量值序列单位ns window_size: 滑动窗口长度 返回滤波后的时差序列 filtered [] acc_sum 0.0 for i, x in enumerate(delta_t): acc_sum x if i window_size: acc_sum - delta_t[i - window_size] if i window_size - 1: filtered.append(acc_sum / window_size) return filtered这段代码维护一个长度为120的累加和每来一个新测量值就加入累加器同时移除窗口最老的测量值避免每次重新求和。这个实现方式的时间复杂度是O(n)在MCU上运行没有任何压力。论文中提到的优化是针对频率准确度计算本身的。基本递推平均能得到平滑后的时差序列但直接对这个序列做差分计算频率偏差时噪声依然不小。优化的做法是对平均后的时差序列再做一次间隔取样用每隔120个数据的时差值计算频率偏差等效于在更长的时间尺度上观察频率漂移进一步抑制短时波动。4.3 滤波参数对驯服时间的影响滤波窗口越大GPS秒抖动抑制越强但系统响应越慢。如果按最小二乘拟合的频率偏差来做修正窗口太小时驯服过程可能出现频率过冲——DAC调整量过大OCXO频率越过目标值然后反向修正形成衰减振荡。论文中给出的实测结果是不采用滤波算法时频率驯服时间为数小时采用滤波算法后缩短为约1200秒。这个提升来自两个方面一是滤波去掉了GPS抖动的高频分量让频率偏差估计更稳定DAC可以更快地收敛二是优化后的间隔取样减小了差分运算引入的噪声放大效应使每次校正量的可信度更高。我在类似项目中会做一个简单的参数扫描分别用窗口60、120、240跑同一段采集数据对比驯服后的频率准确度和驯服时间。窗口120在多数情况下是合理的折中但如果你用的GPS模块抖动更大比如低成本陶瓷天线加长馈线窗口可能需要放大到300甚至600。5. 频率驯服收敛判断与压控校准的实用技巧5.1 16位DAC压控分辨率的工程限制频率修正链路中数据处理单元计算出的频率偏差最终要通过数模转换变成压控电压施加在OCXO的控制端。系统采用的DAC8571是16位I²C接口的DAC输出电压范围0到5V对应MV180 OCXO的±3×10⁻⁷牵引范围。把这个指标换算一下5V对应6×10⁻⁷的总牵引范围±3×10⁻⁷16位DAC的1个LSB对应的电压是5V除以65536约76μV对应的理论频率调谐灵敏度约1×10⁻¹⁰。这意味着DAC的最小调整步进在1×10⁻¹⁰量级和驯服目标3×10⁻¹⁰相比余量不大所以DAC输出的噪声和基准电压稳定性必须重视// DAC8571 I2C写电压示例 #include stdio.h void dac8571_set_voltage(uint8_t i2c_addr, float voltage, float vref) { // DAC8571是16位DAC输出范围0~vref // 计算对应的12位/16位码值此处按16位全量程计算 uint16_t code (uint16_t)((voltage / vref) * 65535.0f); printf(I2C addr 0x%02X, DAC code 0x%04X\r\n, i2c_addr, code); }这里的参数说明i2c_addr是DAC8571的7位地址默认是0x4Cvoltage是目标压控电压vref是DAC参考电压实际使用中最好用独立的高精度基准源不要直接拿DAC供电电压当基准。OCXO的牵引特性不是严格线性的如果追求更高的频率准确度需要做三点或五点的压控曲线标定。5.2 驯服收敛的判断方法驯服过程的收敛判断在实际调试中很关键。理论上当频率偏差估计值在连续多个周期内保持在一个死区范围内就可以认为驯服基本完成。死区一般设为频率准确度指标的1/3到1/2即1×10⁻¹⁰到1.5×10⁻¹⁰这样留有裕量。一个实用的判断方法是观察时差序列的二阶差分。驯服收敛后本地OCXO频率与GPS参考频率的残余偏差很小时差序列应该呈现近似线性的缓慢漂移二阶差分接近零。如果二阶差分持续为正或负说明还存在频率偏差需要继续调整def check_convergence(delta_t, threshold0.5): 通过时差序列二阶差分判断驯服是否收敛 delta_t: 滤波后的时差序列 threshold: 二阶差分阈值单位ns 当连续50个点的二阶差分绝对值均小于阈值时认为收敛 if len(delta_t) 52: return False second_diff [] for i in range(2, len(delta_t)): second_diff.append(delta_t[i] - 2 * delta_t[i-1] delta_t[i-2]) trailing second_diff[-50:] return all(abs(x) threshold for x in trailing)这段代码里threshold如果设成0.5ns二阶差分小于0.5ns意味着频率变化率已经很小。这个判据依赖于时差测量的噪声水平TDC-GP1的250ps分辨率在滤波后支撑这个阈值是足够的。实际项目中我会把这个判别函数放进周期为1s的定时器任务里一旦连续判定收敛就关闭DAC更新只保留监测逻辑。5.3 位置保持模式带来的周期性误差用GPS驯服OCXO时还有一个容易踩的坑GPS模块在位置保持模式下秒信号抖动虽小但卫星几何分布变化会导致定位解算中的钟差估计产生低频漂移这个漂移会缓慢地影响秒信号的长期均值和短期抖动特性。实际采集到的滤波后时差曲线往往不是平滑直线而是带有周期性起伏。如果直接用线性拟合的斜率做频率修正周期残余会造成修正量的波动。我一般会在滤波后的时差序列上先做一次剔除粗差的预处理去掉因为GPS失锁、TDC测量异常等原因产生的偏离点再做滑动平均或卡尔曼滤波提取频率偏差。对于2011年的系统来说递推平均滤波是当时MCU算力下的合理选择今天的实现则可以考虑用一阶卡尔曼滤波替代响应速度和噪声抑制都能改善。老陆这篇论文的价值在于把TDC-GP1、CPLD分频、递推平均滤波和DAC压控这条完整链路串了起来设计思路到今天依然是低成本的GPS驯服时钟方案的基本范式。拿到这套系统后值得花时间细调的无非三件事TDC测量窗口的粗同步质量、滤波窗口与GPS抖动特性的匹配、DAC压控曲线和OCXO控制端增益的标定——把这三件事做透驯服性能和论文里报告的3×10⁻¹⁰才真正对得上。本文还有配套的精品资源点击获取
返回列表