模塊設(shè)計(jì):等精度測(cè)量原理與FPGA實(shí)現(xiàn)詳解)
1. 從實(shí)際需求出發(fā)頻率計(jì)模塊到底是什么1.1 一個(gè)真實(shí)的使用場(chǎng)景前幾年做一套多通道數(shù)據(jù)采集系統(tǒng)時(shí)我遇到一個(gè)特別頭疼的問題多塊采集板卡的采樣時(shí)鐘雖然標(biāo)稱都是10MHz但實(shí)測(cè)下來每一塊之間都有幾Hz到幾十Hz的偏差。這個(gè)偏差在短時(shí)間內(nèi)看不出問題一旦連續(xù)采集幾個(gè)小時(shí)各通道之間的時(shí)間戳就會(huì)越偏越大后期做數(shù)據(jù)對(duì)齊簡(jiǎn)直要命。當(dāng)時(shí)我用的是一臺(tái)普通臺(tái)式計(jì)算器但分辨率不夠而且測(cè)一次要手動(dòng)切換閘門時(shí)間數(shù)據(jù)還得自己記錄。后來同事建議我干脆自己做一個(gè)高精度通用時(shí)間測(cè)量頻率計(jì)模塊把基準(zhǔn)時(shí)鐘測(cè)量、頻率計(jì)數(shù)、閘門控制和數(shù)據(jù)輸出打包在一起直接嵌入到系統(tǒng)里用。這個(gè)思路后來被驗(yàn)證是對(duì)的省了大量重復(fù)勞動(dòng)。這個(gè)模塊說白了就是一個(gè)專門用來測(cè)量信號(hào)頻率、周期、時(shí)間間隔的硬件單元核心指標(biāo)就是“分辨率高、精度穩(wěn)、響應(yīng)快”。它需要解決的核心問題是被測(cè)信號(hào)到底是多少赫茲、和參考時(shí)鐘差多少、能不能在惡劣環(huán)境下一直保持這個(gè)測(cè)量準(zhǔn)確度。1.2 為什么說頻率測(cè)量本質(zhì)上是時(shí)間測(cè)量很多人剛接觸頻率計(jì)模塊時(shí)會(huì)有一個(gè)誤區(qū)覺得頻率測(cè)量就是“數(shù)一數(shù)一秒鐘內(nèi)有幾個(gè)脈沖”。這個(gè)說法在低速、低精度場(chǎng)合勉強(qiáng)能用但它掩蓋了一個(gè)關(guān)鍵問題——你根本不知道“一秒鐘”到底有多準(zhǔn)。頻率的定義是單位時(shí)間內(nèi)的周期數(shù)也就是 f N / T。如果 T 不夠準(zhǔn)哪怕 N 數(shù)得再準(zhǔn)算出來的頻率也是錯(cuò)的。所以真正的頻率測(cè)量核心其實(shí)是“時(shí)間測(cè)量”你要用一段盡可能準(zhǔn)確的閘門時(shí)間去卡住一個(gè)信號(hào)周期的整數(shù)倍再用計(jì)數(shù)結(jié)果反推頻率。想通了這個(gè)邏輯整個(gè)模塊的設(shè)計(jì)思路就清晰了與其拼命提高計(jì)數(shù)器的最高頻率不如把精力花在時(shí)基的準(zhǔn)確度和測(cè)量算法的抗誤差能力上。這也是我后來選型時(shí)堅(jiān)持走“高精度通用時(shí)間測(cè)量”路線而不是單純做“高速計(jì)數(shù)”路線的根本原因。1.3 這塊模塊適合誰、能解決什么問題高精度通用時(shí)間測(cè)量頻率計(jì)模塊的應(yīng)用對(duì)象大體分三類一是實(shí)驗(yàn)室做信號(hào)源校準(zhǔn)、晶振老化測(cè)試的測(cè)試工程師二是做嵌入式系統(tǒng)時(shí)鐘同步、PLL調(diào)試的硬件工程師三是做計(jì)量?jī)x器、工控設(shè)備、通信設(shè)備里頻率監(jiān)控單元的開發(fā)者。它解決的問題也很聚焦普通計(jì)數(shù)器測(cè)低頻信號(hào)時(shí)誤差大測(cè)高頻信號(hào)時(shí)又容易被輸入阻抗、觸發(fā)電平影響而等精度測(cè)頻模塊能在很寬的頻率范圍內(nèi)保持同樣的分辨率同時(shí)把時(shí)基誤差、觸發(fā)誤差、計(jì)數(shù)誤差都納入設(shè)計(jì)和校準(zhǔn)范圍輸出可復(fù)現(xiàn)、可追溯的測(cè)量結(jié)果。對(duì)新手來說可能覺得這東西“不就是頻率計(jì)嘛”但真正用起來才發(fā)現(xiàn)從輸入整形到時(shí)基選型到固件補(bǔ)償每一個(gè)環(huán)節(jié)都藏著影響精度的坑。下面我把整個(gè)模塊的設(shè)計(jì)思路、關(guān)鍵參數(shù)和實(shí)操步驟拆開講一遍。2. 整體設(shè)計(jì)思路與方案選型2.1 三種常見實(shí)現(xiàn)路徑對(duì)比在設(shè)計(jì)頻率計(jì)模塊前首先得確認(rèn)走哪條技術(shù)路線。我對(duì)比過三種主流方案各有適用場(chǎng)景。第一種是純MCU實(shí)現(xiàn)。用單片機(jī)內(nèi)部定時(shí)器做輸入捕獲配合外部晶振作為時(shí)基。優(yōu)點(diǎn)是成本低、開發(fā)快缺點(diǎn)是受MCU主頻和定時(shí)器位寬限制測(cè)量范圍窄、分辨率有限。適合做個(gè)玩具級(jí)、教學(xué)級(jí)的低頻計(jì)數(shù)器想做到高精度很難。第二種是“MCUCPLD/FPGA”的組合。這是目前模塊級(jí)產(chǎn)品最常用的結(jié)構(gòu)FPGA/CPLD負(fù)責(zé)閘門控制、計(jì)數(shù)、時(shí)間戳生成MCU負(fù)責(zé)數(shù)據(jù)處理、顯示和通信。FPGA的并行特性可以保證等精度測(cè)頻的“同步閘門”邏輯非常干凈計(jì)數(shù)通道可以同時(shí)開多路測(cè)頻、測(cè)周期、測(cè)時(shí)間間隔都能實(shí)現(xiàn)。缺點(diǎn)是需要懂一點(diǎn)Verilog/VHDL開發(fā)和調(diào)試門檻稍高。第三種是直接用專用時(shí)間數(shù)字轉(zhuǎn)換芯片加前置分頻電路。比如用TDC芯片做時(shí)間間隔測(cè)量分辨率能到皮秒級(jí)別但成本高而且這類芯片的測(cè)量范圍和輸入信號(hào)調(diào)理需要額外設(shè)計(jì)通用性不如FPGA方案靈活。從“高精度通用”這個(gè)定位來看我最終選了第二種FPGA做計(jì)時(shí)核心MCU做控制和通信。原因很直接FPGA可以把等精度測(cè)量的同步邏輯做成硬邏輯不受中斷和軟件調(diào)度影響測(cè)量行為確定性強(qiáng)同時(shí)FPGA內(nèi)資源豐富后續(xù)想擴(kuò)展多通道測(cè)量、時(shí)間戳記錄、脈沖計(jì)數(shù)等功能都不用改硬件架構(gòu)。2.2 等精度測(cè)量原理核心中的核心等精度測(cè)量也被稱為同步閘門測(cè)量是整個(gè)模塊的算法基石。傳統(tǒng)的直接計(jì)數(shù)法有一個(gè)繞不開的問題被測(cè)信號(hào)和閘門信號(hào)不同步時(shí)閘門開關(guān)瞬間可能正好落在某個(gè)被測(cè)周期的中間導(dǎo)致首尾各多計(jì)或少計(jì)一個(gè)脈沖這就是所謂的±1計(jì)數(shù)誤差。而這個(gè)誤差在低頻段會(huì)被放大得很難看。等精度測(cè)量的思路則完全不同。它不再用固定的“1秒閘門”而是讓閘門信號(hào)與被測(cè)信號(hào)同步先打開預(yù)閘門等待被測(cè)信號(hào)的上升沿到來時(shí)才真正開始計(jì)數(shù)同樣的在預(yù)閘門結(jié)束邊沿等待被測(cè)信號(hào)的下一上升沿才停止計(jì)數(shù)。這樣實(shí)際的閘門時(shí)間不是固定1秒而是被測(cè)信號(hào)周期的整數(shù)倍。之后再用參考時(shí)鐘對(duì)這個(gè)實(shí)際閘門時(shí)間進(jìn)行精確測(cè)量得到閘門內(nèi)參考時(shí)鐘的計(jì)數(shù)值。被測(cè)頻率的公式變?yōu)?f_x N_x * f_ref / N_ref其中 N_x 是被測(cè)信號(hào)在閘門內(nèi)的計(jì)數(shù)值N_ref 是參考時(shí)鐘在閘門內(nèi)的計(jì)數(shù)值f_ref 是參考時(shí)鐘頻率。這樣做最關(guān)鍵的好處在于被測(cè)信號(hào)和閘門的同步消除了被測(cè)通道的±1計(jì)數(shù)誤差剩下的誤差只取決于參考時(shí)鐘在閘門內(nèi)的計(jì)數(shù)是否恰好壓線。因?yàn)閰⒖紩r(shí)鐘頻率遠(yuǎn)高于被測(cè)頻率這個(gè)誤差折算到相對(duì)值上就小得多。整個(gè)模塊的精度上限實(shí)際上就從“被測(cè)信號(hào)進(jìn)出閘門的隨機(jī)相位”轉(zhuǎn)移到了“參考時(shí)鐘的穩(wěn)定度”上。用生活化的類比來說傳統(tǒng)測(cè)頻是拿一把有刻度的尺子去量一截不規(guī)則長(zhǎng)度的繩子首尾對(duì)齊全憑運(yùn)氣等精度測(cè)量則是先讓繩子自己“對(duì)齊”尺子的刻度再來量“實(shí)際長(zhǎng)度”誤差一下子就小了一個(gè)數(shù)量級(jí)。2.3 技術(shù)指標(biāo)怎么定分辨力、精度和閘門時(shí)間模塊最終要應(yīng)對(duì)的指標(biāo)無外乎三個(gè)頻率分辨力、測(cè)量精度、響應(yīng)速度。這三個(gè)指標(biāo)互相制約必須提前想明白優(yōu)先級(jí)。頻率分辨力指的是“最小能分辨的頻率差異”。在等精度測(cè)量中理論分辨力等于 f_ref 除以閘門內(nèi)的參考計(jì)數(shù)也就是說參考時(shí)鐘越高、閘門越長(zhǎng)分辨力越好。比如參考時(shí)鐘是100MHz閘門是1秒理論分辨力大約是1e-8量級(jí)測(cè)10MHz信號(hào)時(shí)能分辨0.1Hz左右。測(cè)量精度則要綜合考慮時(shí)基誤差、觸發(fā)誤差、量化誤差。量化誤差是等精度測(cè)量的固有尾巴它由參考時(shí)鐘周期決定觸發(fā)誤差來源于輸入信號(hào)噪聲和比較器抖動(dòng)時(shí)基誤差來源于參考晶振的校準(zhǔn)誤差和溫漂。這三個(gè)誤差分量按均方根合成才是最終的實(shí)際精度。響應(yīng)速度主要取決于閘門時(shí)間。閘門開1秒刷新率就是1Hz開0.1秒刷新率就是10Hz但分辨力會(huì)相應(yīng)下降。實(shí)際項(xiàng)目里需要根據(jù)被測(cè)信號(hào)的穩(wěn)定程度做取舍測(cè)恒溫晶振的穩(wěn)定度時(shí)我通常用1秒甚至10秒閘門測(cè)普通PLL輸出時(shí)用0.1秒就夠了。這里補(bǔ)充一個(gè)我自己反復(fù)強(qiáng)調(diào)的經(jīng)驗(yàn)指標(biāo)設(shè)計(jì)時(shí)別只看“標(biāo)稱分辨率”要把“在什么閘門下達(dá)到什么精度”寫清楚否則很容易在驗(yàn)收時(shí)扯皮。3. 核心模塊設(shè)計(jì)與關(guān)鍵參數(shù)解析3.1 輸入前端整形、阻抗匹配與保護(hù)電路頻率計(jì)模塊的信號(hào)輸入是整個(gè)測(cè)量鏈路的第一道關(guān)也是最容易出問題的地方。被測(cè)信號(hào)到了模塊內(nèi)部首先不是直接進(jìn)FPGA而是要經(jīng)過一個(gè)“清洗”過程把各種形狀的信號(hào)變成干凈的標(biāo)準(zhǔn)方波同時(shí)保證幅度在FPGA邏輯電平范圍內(nèi)。這個(gè)“清洗”通常由比較器或者施密特觸發(fā)器完成。我習(xí)慣在輸入端放置可調(diào)閾值比較器比如用高速比較器做滯回比較通過DAC設(shè)定觸發(fā)電平。這樣既能適應(yīng)TTL電平也能適應(yīng)正弦波、三角波等模擬信號(hào)。滯回窗口的存在可以大大減小輸入噪聲引起的反復(fù)觸發(fā)抖動(dòng)。輸入阻抗也要支持兩種模式50歐姆和1兆歐姆。50歐姆模式用于射頻信號(hào)測(cè)試減少反射1兆歐姆模式用于普通低頻信號(hào)的測(cè)量電路上通過繼電器或模擬開關(guān)切換。很多模塊精度上不去不是算法不行而是前端阻抗沒匹配好信號(hào)反射疊加后產(chǎn)生過零點(diǎn)的位置漂移直接體現(xiàn)為測(cè)得頻率的隨機(jī)跳動(dòng)。保護(hù)電路同樣不能省。輸入端必須加隔直電容、限幅二極管和TVS管防止被測(cè)信號(hào)帶有直流偏置或意外過壓燒毀比較器。我踩過一次坑直接用模塊測(cè)一個(gè)未加隔離的直流耦合信號(hào)結(jié)果比較器輸入端灌入直流電平導(dǎo)致閾值失效讀數(shù)整體漂了幾十赫茲。后來老老實(shí)實(shí)加了隔直和鉗位電路問題立刻消失。3.2 時(shí)基系統(tǒng)選擇TCXO還是OCXO時(shí)基是整個(gè)模塊的靈魂。前面公式里的 f_ref 如果本身不確定后面所有補(bǔ)償都是空中樓閣。所以這一步的選擇我給的建議很直接預(yù)算允許優(yōu)先用OCXO恒溫晶振預(yù)算緊張至少用高穩(wěn)TCXO溫補(bǔ)晶振并且要確認(rèn)溫漂指標(biāo)。TCXO的優(yōu)勢(shì)是體積小、功耗低、上電即可用典型頻率穩(wěn)定度在0.1ppm到1ppm。對(duì)大多數(shù)普通測(cè)頻需求來說這個(gè)指標(biāo)已經(jīng)夠用。但如果你要做高精度測(cè)量TCXO的溫度漂移會(huì)直接限制模塊的長(zhǎng)期穩(wěn)定性溫度變化5攝氏度頻率就可能漂移零點(diǎn)幾個(gè)ppm在100MHz參考時(shí)鐘上折算出來就是幾十赫茲的偏差。OCXO通過內(nèi)部的恒溫槽把晶振溫度維持在一個(gè)恒定值短期穩(wěn)定度通常在1e-9量級(jí)老化率更低。缺點(diǎn)是體積大、啟動(dòng)慢、功耗高預(yù)熱需要幾分鐘才能進(jìn)入穩(wěn)定狀態(tài)。在需要高精度、長(zhǎng)時(shí)間測(cè)量、環(huán)境溫度多變的場(chǎng)合我都是直接上OCXO。還有一個(gè)中間選項(xiàng)是GPS馴服時(shí)鐘。如果模塊使用場(chǎng)景允許外接參考信號(hào)可以通過外部1PPS信號(hào)對(duì)內(nèi)部時(shí)基進(jìn)行馴服讓它長(zhǎng)期鎖定到衛(wèi)星時(shí)標(biāo)。這個(gè)設(shè)計(jì)我一般在固定實(shí)驗(yàn)室場(chǎng)景使用效果很好但要注意模塊固件里必須實(shí)現(xiàn)頻率誤差閉環(huán)調(diào)整否則馴服只是擺設(shè)。3.3 FPGA資源分配與計(jì)數(shù)邏輯設(shè)計(jì)FPGA里的邏輯設(shè)計(jì)核心就是一個(gè)同步閘門狀態(tài)機(jī)加若干計(jì)數(shù)器。等精度測(cè)量中被測(cè)計(jì)數(shù)器 N_x 和參考計(jì)數(shù)器 N_ref 要同步開啟、同步停止這個(gè)邏輯在Verilog里寫起來并不復(fù)雜但有幾個(gè)細(xì)節(jié)決定成敗。第一被測(cè)信號(hào)的同步處理。外部輸入信號(hào)進(jìn)入FPGA后一定要經(jīng)過兩級(jí)D觸發(fā)器做跨時(shí)鐘域同步防止亞穩(wěn)態(tài)導(dǎo)致計(jì)數(shù)錯(cuò)誤。別覺得這是小事我曾經(jīng)因?yàn)樯偌右患?jí)同步導(dǎo)致高速測(cè)量時(shí)偶發(fā)計(jì)數(shù)跳變排查了整整兩天。第二計(jì)數(shù)器的位寬要留夠。假設(shè)閘門時(shí)間最長(zhǎng)10秒?yún)⒖紩r(shí)鐘100MHz那么 N_ref 最大可能到1e9對(duì)應(yīng)的二進(jìn)制位寬至少30位被測(cè)信號(hào)如果最高到100MHz10秒閘門內(nèi)也有1e9次計(jì)數(shù)同樣要30位。實(shí)際設(shè)計(jì)時(shí)我習(xí)慣統(tǒng)一用32位計(jì)數(shù)器避免溢出。第三預(yù)閘門和實(shí)際閘門的概念要分開。預(yù)閘門由MCU設(shè)定決定測(cè)量周期實(shí)際閘門由預(yù)閘門邊沿和被測(cè)信號(hào)邊沿共同決定。狀態(tài)機(jī)在預(yù)閘門開啟后等待被測(cè)上升沿記錄實(shí)際閘門起始時(shí)刻預(yù)閘門結(jié)束后再等待被測(cè)上升沿記錄停止時(shí)刻。中間所有計(jì)數(shù)結(jié)果存入寄存器等待MCU讀取。3.4 通信接口與數(shù)據(jù)協(xié)議設(shè)計(jì)模塊最常用的通信接口有三種UART、SPI、USB。UART簡(jiǎn)單通用適合調(diào)試和低速數(shù)據(jù)輸出SPI適合做主從式嵌入式系統(tǒng)內(nèi)部集成USB則方便連接PC端軟件做波形分析和數(shù)據(jù)記錄。我的設(shè)計(jì)習(xí)慣是同時(shí)提供UART和SPI通過跳線或寄存器配置切換。數(shù)據(jù)幀格式要盡量簡(jiǎn)單穩(wěn)定幀頭、測(cè)量模式、閘門時(shí)間、計(jì)數(shù)值、計(jì)算后的頻率值、校驗(yàn)字。頻率值如果在內(nèi)核里直接算成浮點(diǎn)數(shù)輸出注意精度轉(zhuǎn)換時(shí)要設(shè)置足夠浮點(diǎn)位數(shù)否則顯示值會(huì)引入新的舍入誤差。另外模塊最好內(nèi)置一個(gè)EEPROM或者Flash區(qū)用于存放校準(zhǔn)參數(shù)、溫度補(bǔ)償曲線和序列號(hào)信息。每次測(cè)量初始化時(shí)由MCU讀出并寫入FPGA寄存器這樣同型號(hào)模塊之間可以直接互換無需每塊重新標(biāo)定。4. 實(shí)操過程與性能驗(yàn)證4.1 固件狀態(tài)機(jī)設(shè)計(jì)與測(cè)量流程MCU固件端的核心任務(wù)是下發(fā)測(cè)量配置、等待FPGA完成一次測(cè)量、讀取計(jì)數(shù)結(jié)果、計(jì)算頻率并輸出。整個(gè)流程我建議設(shè)計(jì)成一個(gè)簡(jiǎn)單的狀態(tài)機(jī)避免阻塞式等待。測(cè)量開始時(shí)MCU先向FPGA寫入閘門時(shí)間配置和觸發(fā)模式然后給一個(gè)啟動(dòng)脈沖。FPGA進(jìn)入預(yù)備狀態(tài)等待被測(cè)信號(hào)邊沿。此時(shí)MCU可以去做別的事情比如讀取溫度傳感器、刷新顯示或者響應(yīng)上位機(jī)命令。FPGA完成測(cè)量后通過一個(gè)中斷引腳通知MCUMCU再讀取兩個(gè)32位計(jì)數(shù)器值和實(shí)際閘門時(shí)長(zhǎng)。實(shí)際閘門時(shí)長(zhǎng)的獲取有一個(gè)容易忽略的點(diǎn)不要只依賴?yán)碚撻l門時(shí)間要從參考計(jì)數(shù) N_ref 反推實(shí)際閘門長(zhǎng)度。因?yàn)轭A(yù)閘門和真實(shí)閘門之間存在幾個(gè)參考時(shí)鐘周期的相位差直接用理論值會(huì)引入固定偏置誤差在測(cè)低頻時(shí)尤其明顯。頻率計(jì)算可以放在MCU端也可以放在FPGA端。我傾向于在MCU端用浮點(diǎn)計(jì)算因?yàn)镕PGA做除法占用資源多且時(shí)序不好收斂。MCU主頻不低的情況下一次測(cè)量值計(jì)算不會(huì)超過幾十微秒完全不影響整體刷新率。4.2 校準(zhǔn)流程如何把模塊調(diào)到最佳狀態(tài)新模塊焊接完成、基本功能跑通之后第一件正事是校準(zhǔn)時(shí)基這一步直接影響整機(jī)的精度天花板。最穩(wěn)妥的辦法是拿一個(gè)已經(jīng)是已知標(biāo)準(zhǔn)頻率的信號(hào)源做基準(zhǔn)比如銣原子鐘或者經(jīng)過計(jì)量的高精度信號(hào)發(fā)生器。如果手頭沒有這些設(shè)備也可以用GPS馴服后的1PPS脈沖配合時(shí)間間隔測(cè)量功能來間接校準(zhǔn)但操作要復(fù)雜一些。校準(zhǔn)流程大致是這樣的把標(biāo)準(zhǔn)信號(hào)源設(shè)為10MHz正弦輸出接到模塊輸入端模塊設(shè)1秒閘門連續(xù)測(cè)量10次記錄下頻率偏差的平均值和標(biāo)準(zhǔn)偏差。平均值代表當(dāng)前的系統(tǒng)偏置標(biāo)準(zhǔn)偏差代表測(cè)量系統(tǒng)的重復(fù)性。系統(tǒng)偏置通過調(diào)整參考晶振的負(fù)載電容或者保存到軟件校準(zhǔn)系數(shù)中消除如果偏差太大超出晶振微調(diào)范圍則說明晶振老化嚴(yán)重或者焊接存在問題需要先修復(fù)硬件再校準(zhǔn)。這里必須提醒一點(diǎn)校準(zhǔn)時(shí)的信號(hào)源一定要預(yù)熱穩(wěn)定。我見過有人拿剛開機(jī)的信號(hào)源直接做基準(zhǔn)結(jié)果基準(zhǔn)本身就在頻漂模塊怎么校準(zhǔn)都不對(duì)。標(biāo)準(zhǔn)操作是先預(yù)熱半小時(shí)以上再開始測(cè)量。校準(zhǔn)完成后應(yīng)該做一個(gè)溫度特性測(cè)試把模塊放入恒溫箱從-10攝氏度到50攝氏度每5攝氏度記錄一次頻率讀數(shù)形成溫度補(bǔ)償曲線。有了這條曲線固件里就可以在測(cè)量時(shí)實(shí)時(shí)讀取板載溫度對(duì)時(shí)基誤差做軟件修正可以把整個(gè)模塊的溫漂再壓低一到兩個(gè)數(shù)量級(jí)。4.3 提升測(cè)量分辨力的幾種實(shí)用手段等精度測(cè)量的理論分辨力已經(jīng)不錯(cuò)了但實(shí)際中我們還可以用一些工程手段“榨出”更高的性能成本不高但效果立竿見影。技術(shù)手段一是多周期平均。對(duì)穩(wěn)定信號(hào)連續(xù)做多次等精度測(cè)量取平均或取中位數(shù)值。隨機(jī)噪聲帶來的測(cè)量抖動(dòng)會(huì)被平均掉一部分分辨力和穩(wěn)定性都有改善。注意此時(shí)要用中位數(shù)而非平均值避免個(gè)別異常值拉偏結(jié)果。技術(shù)手段二是參考時(shí)鐘倍頻。FPGA內(nèi)部的PLL可以把外部參考時(shí)鐘從100MHz倍頻到200MHz甚至更高這樣閘門內(nèi)的參考計(jì)數(shù) N_ref 變多量化誤差相應(yīng)減小。但倍頻后的時(shí)鐘抖動(dòng)會(huì)引入額外噪聲需要權(quán)衡。我實(shí)測(cè)下來從100MHz倍頻到200MHz對(duì)低頻段改善明顯對(duì)高頻段反而可能略變差。技術(shù)手段三是插值法。這個(gè)適合需要極高時(shí)間分辨率的場(chǎng)合通過在FPGA里實(shí)現(xiàn)延遲線或者借助專用TDC單元對(duì)參考時(shí)鐘計(jì)數(shù)無法覆蓋的最后一段“尾巴”做內(nèi)插把時(shí)間分辨率從10納秒級(jí)別提升到皮秒級(jí)別。這個(gè)方案實(shí)現(xiàn)復(fù)雜度高我一般只有在客戶明確要求“亞納秒時(shí)間間隔測(cè)量”時(shí)才啟用。技術(shù)手段四是合理設(shè)置觸發(fā)閾值。被測(cè)信號(hào)的過零觸發(fā)點(diǎn)會(huì)受到信號(hào)幅度和直流偏置的影響如果把觸發(fā)電平精確設(shè)置在信號(hào)的中點(diǎn)并逐次測(cè)量中點(diǎn)電壓的漂移做補(bǔ)償觸發(fā)誤差會(huì)顯著減小。5. 常見問題與排查技巧實(shí)錄5.1 讀數(shù)跳變、精度上不去怎么辦現(xiàn)象連續(xù)測(cè)量同一個(gè)穩(wěn)定信號(hào)頻率讀數(shù)在最后一位或兩位不停跳動(dòng)看起來“測(cè)不穩(wěn)”。排查思路按下面的順序來。第一步查參考時(shí)鐘。用示波器看OCXO或TCXO的輸出波形和頻率確認(rèn)參考時(shí)鐘本身是否穩(wěn)定。如果手頭有更好的頻率計(jì)或計(jì)數(shù)器直接對(duì)比測(cè)量模塊的時(shí)基輸出。參考時(shí)鐘每偏差1e-9整個(gè)模塊的測(cè)量結(jié)果就會(huì)跟著偏同樣量級(jí)。第二步查輸入信號(hào)質(zhì)量。被測(cè)信號(hào)本身是否有毛刺、疊加噪聲或者緩慢的幅度波動(dòng)如果信號(hào)不干凈比較器的觸發(fā)點(diǎn)會(huì)左右抖動(dòng)等效成被測(cè)信號(hào)的周期抖動(dòng)讀數(shù)自然跳。第三步查供電紋波。FPGA和比較器對(duì)電源紋波都比較敏感紋波超過20mV時(shí)比較器參考電壓和FPGA時(shí)鐘都會(huì)受調(diào)制。在測(cè)量電路附近增加一級(jí)LC濾波或者低噪LDO往往能明顯改善讀數(shù)穩(wěn)定性。第四步查測(cè)量模式配置。確認(rèn)是不是閘門時(shí)間過短導(dǎo)致分辨力不足。比如0.1秒閘門測(cè)10MHz信號(hào)理論分辨力只有約1Hz此時(shí)最后一位跳動(dòng)是正常現(xiàn)象不是故障。5.2 低頻信號(hào)、高頻信號(hào)測(cè)不準(zhǔn)的原因測(cè)低頻信號(hào)比如幾十赫茲時(shí)用單純的頻率計(jì)數(shù)法效率很低因?yàn)殚l門內(nèi)被測(cè)信號(hào)周期數(shù)太少即使等精度測(cè)量結(jié)果也受觸發(fā)抖動(dòng)影響很大。這種情況的正確做法是切換為周期測(cè)量模式測(cè)出單個(gè)或多個(gè)周期的精確時(shí)間長(zhǎng)度再取倒數(shù)得到頻率。周期法在低頻段的分辨力遠(yuǎn)高于計(jì)數(shù)法。測(cè)高頻信號(hào)比如百兆赫茲以上時(shí)問題通常出在輸入端。FPGA普通IO很難可靠采集100MHz以上的方波信號(hào)前端必須使用高速比較器、高速緩沖器或者專用的射頻限幅放大器。同時(shí)連接線纜和PCB走線要注意阻抗連續(xù)性否則反射會(huì)導(dǎo)致波形畸變觸發(fā)位置來回跳。還有一種看起來是高頻才有的問題其實(shí)是通用問題輸入幅度過高導(dǎo)致比較器過驅(qū)動(dòng)恢復(fù)時(shí)間變長(zhǎng)輸出的方波占空比畸形。解決方法是增加輸入衰減電阻網(wǎng)絡(luò)或AGC電路讓信號(hào)始終保持在合適的幅度范圍。5.3 溫漂與開機(jī)預(yù)熱高精度測(cè)量繞不開的坎如果你的模塊用的是OCXO第一次上電后別急著開始測(cè)量。OCXO內(nèi)部恒溫槽從冷啟動(dòng)到穩(wěn)定通常需要3到10分鐘在這個(gè)預(yù)熱階段參考頻率會(huì)緩慢爬升并可能出現(xiàn)小幅過沖。這段時(shí)間測(cè)出來的數(shù)據(jù)不具備參考意義。用TCXO雖然啟動(dòng)快但環(huán)境溫度變化對(duì)它的影響更直接。我在做室外長(zhǎng)期監(jiān)測(cè)項(xiàng)目時(shí)吃過虧白天和黑夜溫差十幾度模塊測(cè)得的值跟著明顯漂移。后來給模塊套了被動(dòng)保溫外殼固件里加了板載溫度傳感器補(bǔ)償情況才好轉(zhuǎn)。軟件補(bǔ)償溫度漂移時(shí)要注意補(bǔ)償曲線應(yīng)該用“校準(zhǔn)后模塊的實(shí)際溫漂”做擬合而不是直接用晶振廠商給的標(biāo)稱曲線。因?yàn)槊颗尉д竦臏仄€離散度都不小用標(biāo)稱值補(bǔ)償反而可能引入二次誤差。5.4 踩坑記錄速查表現(xiàn)象可能原因快速排查/解決方法所有量程讀數(shù)整體偏高/偏低時(shí)基校準(zhǔn)系數(shù)錯(cuò)誤或未校準(zhǔn)用標(biāo)準(zhǔn)信號(hào)源重新校準(zhǔn)檢查EEPROM中校準(zhǔn)值低頻信號(hào)讀數(shù)跳動(dòng)大使用了頻率計(jì)數(shù)模式切換為周期測(cè)量模式單次測(cè)量偶發(fā)大誤差FPGA輸入未做同步或亞穩(wěn)態(tài)檢查兩級(jí)寄存器同步鏈增加冗余觸發(fā)輸入懸空時(shí)讀數(shù)亂跳前端無上拉/下拉比較器自激輸入端加合適偏置電阻或開路檢測(cè)數(shù)據(jù)輸出偶爾丟幀UART/SPI波特率誤差檢查MCU晶振是否準(zhǔn)確改用硬件流控或加CRC校驗(yàn)長(zhǎng)時(shí)間測(cè)量緩慢漂移晶振老化或溫度波動(dòng)定期校準(zhǔn)軟件溫度補(bǔ)償或升級(jí)OCXO高輸入幅度信號(hào)測(cè)不準(zhǔn)比較器過驅(qū)動(dòng)增加衰減或AGC電路這些坑看起來零散其實(shí)背后都是同一個(gè)邏輯把測(cè)量鏈路中的每一個(gè)環(huán)節(jié)都當(dāng)成潛在的誤差源來處理而不是只看算法。前端、時(shí)基、邏輯、固件一環(huán)扣一環(huán)任何一處漏了都會(huì)直接反映到最終讀數(shù)上。最后再分享一個(gè)小技巧模塊定型之后建議在固件里保留一個(gè)“工廠校準(zhǔn)模式”對(duì)應(yīng)一個(gè)獨(dú)立的調(diào)試命令。這樣每次復(fù)校時(shí)不用拆外殼改跳線也不用重新編譯固件直接通過串口發(fā)一條命令就能進(jìn)入校準(zhǔn)流程能省去很多重復(fù)勞動(dòng)。