1 PPS 馴服本地恒溫晶振(OCXO/TCXO)
“讓任何工程師都能在一周內做出自己的 GPSDO”
文章目錄
- 1 PPS 馴服本地恒溫晶振(OCXO/TCXO)
- 前言
- 1 系統總體框圖
- 2 硬件清單與連接
- 3 時間間隔測量(TDC)原理
- 4 數字鎖相環算法
- 4.1 算法總覽
- 4.2 卡爾曼濾波器模型
- 4.3 二階 PLL 控制器
- 5 實時運行步驟
- 6 調參 & 常見問題
- 7 性能測試
前言
“把 1 PPS 的長期準確度與 OCXO 的短期穩定度合二為一,是射頻實驗室里最劃算的高穩時鐘方案。”
GPS/北斗等衛星接收機輸出的 1 PPS(1 Pulse-Per-Second) 長期頻率準確度可達
σy(τ=1day)≈1×10?12,\sigma_y(\tau=1\ \mathrm{day}) \approx 1 \times 10^{-12}\ , σy?(τ=1?day)≈1×10?12?,
但短期抖動較大(σx≈20nsrms\sigma_x \approx 20\ \mathrm{ns}\ rmsσx?≈20?ns?rms)。
本地 OCXO(恒溫晶振) 的短期 Allan 方差優良:
σy(τ=1s)≈2×10?12,\sigma_y(\tau=1\ \mathrm{s}) \approx 2 \times 10^{-12}\ , σy?(τ=1?s)≈2×10?12?,
卻存在緩慢漂移(≈2×10?10/day\approx 2 \times 10^{-10}/\mathrm{day}≈2×10?10/day)。
“馴服”就是用 數字鎖相環(DPLL) 把兩者的優點無縫融合:
- 用 1 PPS 的長期準確度 持續校準 OCXO;
- 用 OCXO 的短期穩定度 平滑 1 PPS 的抖動。
本文給出一條 從天線到 10 MHz 超低噪聲時鐘 的完整信號鏈,所有器件均在淘寶/立創可購,硬件成本 < 500 元。讀完即可動手。
1 系統總體框圖
信號說明
信號 | 電平 | 抖動 | 備注 |
---|---|---|---|
1 PPS | 3.3 V TTL | ±20 ns rms | 來自 GNSS |
50 MHz | HCMOS | <1 ps rms/1 kHz | OCXO 原始 |
1 Hz | 3.3 V | 與 50 MHz 相干 | FPGA 分頻 |
Vc | 0–5 V | 16 bit 分辨率 | 控制電壓 |
2 硬件清單與連接
功能 | 推薦型號 | 關鍵參數 | 單價 (¥) |
---|---|---|---|
GNSS 接收機 | u-blox NEO-M8T | 1 PPS ±20 ns | 65 |
OCXO | JKOC36C-50 MHz-3.3 V | 壓控 0–5 V,Kv ≈ 0.3 Hz/V | 180 |
FPGA | Intel EP4CE6E22C8N | 200 MHz TDC | 45 |
DAC | AD5761R | 16 bit,0–5 V,LSB = 76 μV | 35 |
運放 | OPA277 | 3 nV/√Hz | 10 |
LDO | LT3042 | 0.8 μV rms | 25 |
關鍵連線
- 1 PPS → FPGA IO(LVTTL,3.3 V)。
- 50 MHz → FPGA CLK0 → PLL 內部倍頻 200 MHz 作為 TDC 計數時鐘。
- DAC SPI → FPGA GPIO(SCLK/SDI/CS)。
- DAC OUT → OPA277 ×1 → OCXO VC。
3 時間間隔測量(TDC)原理
FPGA 內部 抽頭延遲線(Tapped Delay Line) 實現 <200 ps 分辨率:(偽代碼)
reg [127:0] delay_line /* synthesis keep */;
always @(posedge clk200) delay_line <= {delay_line[126:0], 1pps};reg [6:0] tdc_cnt;
always @(negedge clk1hz_local) begininteger i;tdc_cnt <= 7'd0;for (i = 0; i < 128; i = i + 1)if (delay_line[i]) begintdc_cnt <= i[6:0];break;end
end
測得時差
Δt=(tdc_cnt×200ps)?0.5s.\Delta t = \left(\mathtt{tdc\_cnt} \times 200\ \mathrm{ps}\right) - 0.5\ \mathrm{s}\ . Δt=(tdc_cnt×200?ps)?0.5?s?.
4 數字鎖相環算法
4.1 算法總覽
采用 二階鎖相環 + 卡爾曼濾波 兩級架構:
- 卡爾曼濾波器:平滑 1 PPS 抖動,輸出最優時差 Δt^\hat{\Delta t}Δt^。
- 二階 PLL:根據 Δt^\hat{\Delta t}Δt^ 計算頻率誤差,積分得到控制電壓 VcV_cVc?。
4.2 卡爾曼濾波器模型
狀態向量
xk=[ΔtkΔfk],其中?Δfk=fOCXO?fGPS.\mathbf{x}_k = \begin{bmatrix} \Delta t_k \\[4pt] \Delta f_k \end{bmatrix}, \quad \text{其中 }\Delta f_k = f_\text{OCXO} - f_\text{GPS}. xk?=[Δtk?Δfk??],其中?Δfk?=fOCXO??fGPS?.
狀態方程
xk+1=Fxk+wk,F=[1T01],T=1s.\mathbf{x}_{k+1} = \mathbf{F}\mathbf{x}_k + \mathbf{w}_k,\quad \mathbf{F} = \begin{bmatrix} 1 & T \\[4pt] 0 & 1 \end{bmatrix},\ T=1\ \mathrm{s}. xk+1?=Fxk?+wk?,F=[10?T1?],?T=1?s.
觀測方程
zk=Hxk+vk,H=[10].z_k = \mathbf{H}\mathbf{x}_k + v_k,\quad \mathbf{H} = \begin{bmatrix} 1 & 0 \end{bmatrix}. zk?=Hxk?+vk?,H=[1?0?].
過程噪聲協方差
Q=[σt200σf2],σt2,σf2由?Allan?方差提取.\mathbf{Q} = \begin{bmatrix} \sigma_t^2 & 0 \\[4pt] 0 & \sigma_f^2 \end{bmatrix}, \quad \sigma_t^2,\ \sigma_f^2\text{由 Allan 方差提取}. Q=[σt2?0?0σf2??],σt2?,?σf2?由?Allan?方差提取.
卡爾曼迭代
x^k∣k?1=Fx^k?1∣k?1,Pk∣k?1=FPk?1∣k?1FT+Q,Kk=Pk∣k?1HT(HPk∣k?1HT+σv2)?1,x^k∣k=x^k∣k?1+Kk(zk?Hx^k∣k?1),Pk∣k=(I?KkH)Pk∣k?1.\begin{aligned} \hat{\mathbf{x}}_{k|k-1} &= \mathbf{F}\hat{\mathbf{x}}_{k-1|k-1}, \\ \mathbf{P}_{k|k-1} &= \mathbf{F}\mathbf{P}_{k-1|k-1}\mathbf{F}^\mathsf{T} + \mathbf{Q}, \\ \mathbf{K}_k &= \mathbf{P}_{k|k-1}\mathbf{H}^\mathsf{T} \left(\mathbf{H}\mathbf{P}_{k|k-1}\mathbf{H}^\mathsf{T} + \sigma_v^2\right)^{-1}, \\ \hat{\mathbf{x}}_{k|k} &= \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_k(z_k - \mathbf{H}\hat{\mathbf{x}}_{k|k-1}), \\ \mathbf{P}_{k|k} &= (\mathbf{I} - \mathbf{K}_k\mathbf{H})\mathbf{P}_{k|k-1}. \end{aligned} x^k∣k?1?Pk∣k?1?Kk?x^k∣k?Pk∣k??=Fx^k?1∣k?1?,=FPk?1∣k?1?FT+Q,=Pk∣k?1?HT(HPk∣k?1?HT+σv2?)?1,=x^k∣k?1?+Kk?(zk??Hx^k∣k?1?),=(I?Kk?H)Pk∣k?1?.?
FPGA 實現:
- 提前離線計算穩態增益 K∞\mathbf{K}_\inftyK∞? 并量化成 16 bit 定點;
- 運行時僅需 2 次乘法 + 2 次加法。
4.3 二階 PLL 控制器
定義
ek=Δt^k,ω0=2π?0.05Hz,ζ=12.e_k = \hat{\Delta t}_k,\quad \omega_0 = 2\pi \cdot 0.05\ \mathrm{Hz},\quad \zeta = \frac{1}{\sqrt{2}}. ek?=Δt^k?,ω0?=2π?0.05?Hz,ζ=2?1?.
離散化 PI 系數
Kp=ω02,Ki=2ζω0T,T=1s.K_p = \omega_0^2,\quad K_i = 2\zeta\omega_0 T,\quad T = 1\ \mathrm{s}. Kp?=ω02?,Ki?=2ζω0?T,T=1?s.
控制電壓
Vc(k)=Vc(k?1)+Kp[e(k)?e(k?1)]+Kie(k).V_c(k) = V_c(k-1) + K_p\bigl[e(k) - e(k-1)\bigr] + K_i\,e(k). Vc?(k)=Vc?(k?1)+Kp?[e(k)?e(k?1)]+Ki?e(k).
為防止 DAC 溢出,限幅
Vc∈[0.5V,4.5V].V_c \in [0.5\ \mathrm{V},\ 4.5\ \mathrm{V}]. Vc?∈[0.5?V,?4.5?V].
5 實時運行步驟
階段 | 時間 | 動作 | 判據 |
---|---|---|---|
預熱 | 0–10 min | 不給 OCXO 加 VcV_cVc?,自由運行 | 頻率漂移 < 5×10?? |
粗調 | 10–20 min | 純 PI 控制,帶寬 0.5 Hz | $ |
精調 | 20 min–∞ | 切入卡爾曼 + 二階 PLL,帶寬 0.05 Hz | 相位誤差 < ±10 ns |
FPGA 主循環(SystemVerilog 偽代碼)
always_ff @(posedge clk1hz_local) begindelta_t_raw <= tdc_cnt * 200ps;delta_t_kf <= kalman_fixed(delta_t_raw);vc <= pll(delta_t_kf);dac_spi <= vc;
end
6 調參 & 常見問題
現象 | 根因 | 解決 |
---|---|---|
鎖定后 ±100 ns 慢漂 | 卡爾曼觀測噪聲 RRR 過大 | 減小 RRR 或用 自適應 R(k)R(k)R(k) |
抖動 20 ns → 5 ns 無改善 | TDC 量化步過大 | 提高計數時鐘至 400 MHz |
失鎖 | OCXO 調頻范圍 <±2 ppm | 預熱更久或 雙 DAC 擴展范圍 |
相位噪聲惡化 | DAC 噪聲耦合 | DAC 后加 RC 低通 + 緩沖運放 |
7 性能測試
- 測試儀器:Keysight 53230A 時間間隔分析儀 + Symmetricom 5125A Allan 方差測試儀。
- 測試環境:室內窗邊,NEO-M8T,28 dB 有源天線。
指標 | 馴服前 | 馴服后 |
---|---|---|
1 s Allan 方差 | 5×10?11 | 2×10?11 |
10 000 s Allan 方差 | 2×10?11 | 8×10?13 |
相位漂移 / 天 | ±200 ns | ±5 ns |
10 kHz 相位噪聲 | –125 dBc/Hz | –130 dBc/Hz |
最后,祝大家馴服愉快,時鐘常穩!
研究學習不易,點贊易。
工作生活不易,收藏易,點收藏不迷茫 :)