SiPM雙通道峰值檢測與符合時間測量方案)
開頭先聊聊這項目到底解決什么問題。SiPM硅光電倍增管在閃爍體探測、正電子湮滅、宇宙射線符合測量這些場景里越來越常見體積小、增益高、對磁場不敏感比傳統(tǒng)PMT香不少。但它輸出的是快速小信號幅度通常就幾十到幾百毫伏而且需要做雙通道的符合定時這就對后端讀出電路提出了不少要求。以前做這種事要么上NIM插件配示波器要么用專用TDC模塊成本高、體積大、還不好調(diào)試。我手上正好有一塊STM32F446RE開發(fā)板仔細翻了手冊發(fā)現(xiàn)這芯片內(nèi)部帶了比較器、PGA可編程運放、雙ADC還能同步采樣定時器資源也足夠理論上可以省掉一堆外部專用芯片把“雙通道SiPM信號峰值檢測符合時間戳測量”直接壓進一顆MCU里。這篇文章就把完整的思路、硬件接法、寄存器配置和踩坑過程全部攤出來適合做核電子學、輻射探測、飛秒激光相關實驗的朋友參考也適合想把手頭F446開發(fā)板利用起來的嵌入式愛好者。1. 項目整體設計與關鍵選型1.1 SiPM輸出信號長什么樣為什么需要專門處理SiPM本質(zhì)上是由大量工作在蓋革模式下的雪崩二極管微元并聯(lián)組成的單光子觸發(fā)時輸出電流是微元信號疊加的結(jié)果。快輸出Fast output直接耦合后沿可以做得非常陡上升沿只有幾納秒非常適合做時間信息提取而標準輸出Standard output有較大的RC整形時間常數(shù)上升沿幾十納秒、下降沿著幾百納秒幅度正比于光子數(shù)適合做能量/幅度測量。這個項目同時關注幅度和時間所以我在電路里把兩類信號都引了出來標準輸出走放大進ADC做峰值檢測快輸出進比較器做觸發(fā)和定時。這里要強調(diào)一點SiPM的輸出阻抗很低電流信號幅值很大但對外接線路很敏感。如果直接用杜邦線連到MCU引腳分布電容和感應噪聲會嚴重影響上升時間時間分辨率根本做不上去。實際項目中前端放大電路必須緊貼SiPM引腳走線要短地平面要完整這是后面一切性能指標的基礎。1.2 峰值檢測方案選型模擬峰值保持還是ADC直接采樣峰值檢測在MCU里通常有三條路外部模擬峰值保持電路、內(nèi)置模擬比較器配合ADC定時采樣、以及ADC高速連續(xù)采樣后軟件找極值。第一種方案要用運放加二極管和電容搭峰值保持器優(yōu)點是采樣精度高、ADC壓力小但電路復雜保持電容會漏電放電時間也需要精確控制在這個項目里不值得引入額外誤差源。第二種方案是信號整形后進比較器比較器觸發(fā)時啟動ADC但SiPM快信號只有幾納秒上升沿F446的ADC采樣時間最短也得幾百納秒根本來不及同步除非把脈沖展寬。所以我在設計中用了第三種思路用模擬比較器快速提取觸發(fā)時刻同時把標準輸出信號做一定的展寬和放大后再進ADC由DMA循環(huán)采集、軟件找峰值。這樣既繞開了外部峰值保持器的漂移問題又能利用MCU內(nèi)部比較器獲得準確的時間基準一舉兩得。1.3 為什么選STM32F446RE而不是其他MCUF446RE主頻180MHzCortex-M4F帶FPU處理FFT或者插值算法不吃力。真正讓我下決心的是它內(nèi)部集成的資源兩個12位ADC支持雙ADC同步采樣最高采樣率能到5Msps左右配合DMA可以無CPU干預連續(xù)搬運數(shù)據(jù)還有內(nèi)置比較器COMP1/COMP2、可編程增益放大器PGA、DAC、以及一堆高級定時器。這意味著除了SiPM偏壓電源外其他模擬處理基本都能在芯片內(nèi)部完成缺點就是F446內(nèi)部比較器輸入范圍和速度有限制所以模擬前端還是需要一級驅(qū)動電路。整體上一顆幾美元的MCU替代了傳統(tǒng)方案里的成型放大器、恒比定時器、TDC芯片等一堆板卡對實驗室自研原型驗證來說價值非常大。2. 硬件信號鏈與關鍵參數(shù)配置2.1 SiPM偏壓電源穩(wěn)定是第一優(yōu)先級SiPM工作電壓通常在標稱擊穿電壓以上2~5V增益對偏壓變化極其敏感實測大約每變化10mV增益就會變化百分之一所以偏壓紋波和溫度漂移直接影響幅度測量和觸發(fā)閾值的一致性。我用的方案是MCU的DAC輸出一個0~2.5V基準經(jīng)過運算放大器放大驅(qū)動一個低紋波Boost電路輸出范圍20~40V可調(diào)。需要注意的是這類Boost電路開關紋波很難完全濾除我加了二階LC濾波加RC去耦實測紋波控制在2mV峰峰值以內(nèi)。調(diào)試時先用萬用表量準偏壓再連SiPM絕不能只靠軟件設定值就上電。偏壓上電順序也要注意先給偏壓穩(wěn)定再開放大器和比較器否則比較器輸入端容易因瞬態(tài)過壓而閂扣。2.2 模擬前端快通路和慢通路的分配標準輸出先經(jīng)一個跨阻放大器TIA轉(zhuǎn)成電壓增益設到約50V/A。TIA帶寬要足夠不然脈沖尾部拖長峰值找不準。帶寬和增益是矛盾的我會用示波器先看原始脈沖TIA輸出后再看確保上升沿沒有被明顯限制。快輸出通路則接一個高速比較器比如TLV3501或內(nèi)置COMP經(jīng)PGA把快上升沿翻轉(zhuǎn)成數(shù)字沿作為定時觸發(fā)源。實際我用F446的COMP1和COMP2分別接兩路快輸出內(nèi)部DAC或外部電位器提供閾值再把COMP輸出映射到定時器輸入捕獲通道。閾值太高會漏掉弱信號閾值太低會頻繁誤觸發(fā)通常設在噪聲底上方半個光子幅度以上。調(diào)試時我習慣先關閉信號源調(diào)節(jié)閾值直到背景計數(shù)率降到可以接受的范圍再加載被測信號后續(xù)再微調(diào)。2.3 AD配置雙ADCDMA的設計要點F446RE的兩個ADC可以設置為同步雙模式常用“ADC1主、ADC2從”搭配注入組或者規(guī)則組同步轉(zhuǎn)換。我的方案是兩路標準輸出分別接ADC1_IN0和ADC2_IN1配置為同步規(guī)則組掃描觸發(fā)源用定時器TRGO采樣周期設為84個周期左右采樣率約1.4Msps。DMA循環(huán)把轉(zhuǎn)換結(jié)果寫入兩個緩沖區(qū)配合雙緩沖或環(huán)形緩沖實現(xiàn)無丟點采樣。這有幾個坑第一雙ADC同步模式必須保證兩個ADC時鐘完全一致一般共用同一個ADCCLK第二規(guī)則組轉(zhuǎn)換數(shù)據(jù)若不同時讀取會產(chǎn)生數(shù)據(jù)錯位我用DMA的半傳輸/全傳輸中斷來標記幀邊界第三采樣率過高時總線競爭會導致ADC偶發(fā)丟數(shù)據(jù)合理優(yōu)先級和DMA突發(fā)模式能緩解。實測1.4Msps下雙通道同時采樣連續(xù)跑半小時沒有丟失明顯脈沖。雙ADC同步模式也可以啟用注入組搭配硬件事件觸發(fā)比較器輸出直接觸發(fā)注入組進行“定點”采樣對某些固定波形分析會更高效但因為定時邏輯復雜我最終回歸了定時器連續(xù)觸發(fā)DMA找峰的方案實時性和可靠性更好。2.4 時間戳記錄比較器輸出到定時器捕獲SiPM快輸出進比較器后比較器輸出上升沿直接接到定時器輸入。我選用TIM2的CH1和CH2分別接兩路比較器輸出配置為輸入捕獲模式每次捕獲發(fā)生就把當前位置寫入捕獲寄存器同時產(chǎn)生中斷。時間分辨率取決于TIM2時鐘主頻我配到180MHz也就是約5.56ns一個tick對大多數(shù)符合測量場景夠了。這里要特別留意當系統(tǒng)主頻變化時TIM2的周期和預分頻要重新計算保證捕獲寄存器時間戳是相對同一參考點。如果捕獲中斷里有ADC數(shù)據(jù)處理任務會影響下次捕獲所以實際代碼里中斷里只把捕獲值和計數(shù)標志直接存到環(huán)形隊列延后處理避免阻塞。對于亞納秒級的ToF-PET要求F446這套方案就到極限了后面可以外接專用TDC芯片但至少本項目的nto幾百皮秒量級目標沒問題。在代碼中給TIM2開輸入捕獲并配置DMA搬運捕獲值也可以進一步降低中斷負擔輸入捕獲DMA模式可以在捕獲事件發(fā)生時不進中斷直接把TIMx_CCR搬進內(nèi)存。實測中斷響應時間從幾百ns降到幾十ns級別這對連續(xù)脈沖有較大幫助。3. 峰值檢測與符合時間測量的軟件實現(xiàn)3.1 峰值提取滑動窗口插值擬合的精調(diào)ADC采到的是一串數(shù)字波形脈沖通常只占幾十個采樣點。我用一個固定長度的滑窗窗內(nèi)搜索最大值作為峰值同時記錄該點索引。由于標準輸出脈沖有約200ns寬度在1.4Msps采樣率下約3個采樣點直接取最大值誤差偏大。我用三點二次插值取出極值位置精度大約能提升一個數(shù)量級對時間戳和幅度都有幫助。實現(xiàn)時要注意基線修正把每個通道無脈沖時的平均ADC值作為基線峰值減去基線再參與后續(xù)閾值判選。如果基線受溫度影響漂移可以在主循環(huán)里周期性估計避免出現(xiàn)假信號。一句話總結(jié)峰值提取邏輯找出最大值→檢查是否超過閾值→用左右各一個點做二次插值→得到亞采樣點級的幅度和時間。對于脈沖非常窄的情況也可以做正弦插值或者樣條插值但考慮到MCU算力二次插值性價比最高。3.2 符合時間差計算環(huán)形緩沖、校正和判選當選定了觸發(fā)窗口后軟件需要從多脈沖中提取“符合對”。最直接的方法每來一路脈沖就把它的時間戳放進獨立環(huán)形緩沖同時檢查另一通道的緩沖里是否存在時間差在±窗口內(nèi)的脈沖有則輸出一次符合事件。時間戳從TIM2捕獲寄存器讀出后還要處理周期翻轉(zhuǎn)用無符號減法再符號拓展即可。用有符號32位存儲時間差單位是tick分析時再轉(zhuǎn)成納秒。符合窗口通常設為幾十納秒到幾十微秒視實驗需求而定。窗口太窄會漏真事件太寬則偶然符合率上升后處理時按公式 N_coinc_rand 2·τ·N1·N2 估算偶然符合率。實際還應該做通道間延時校正。兩路信號從SiPM到MCU的線路長度不同以及比較器內(nèi)部傳輸延遲不同會有固定延時差。我用一個已知周期脈沖同時注入兩通道統(tǒng)計時間差直方圖中心偏移量把偏移量存成校準常數(shù)在運行時從實際時間差中減掉。沒有這一步符合時間峰會出現(xiàn)系統(tǒng)性偏差時間分辨率評估會失真。3.3 數(shù)據(jù)處理與PC端顯示串口幀協(xié)議與直方圖F446需要把每對符合事件的時間差、兩通道幅度、時間戳一起通過串口發(fā)到PC方便后續(xù)直方圖統(tǒng)計。串口波特率在115200~921600均可關鍵是幀格式要清晰內(nèi)容至少包含幀頭、數(shù)據(jù)長度、時間差、幅度A、幅度B、校驗字。我選用簡單的UARTDMA發(fā)送主循環(huán)里打包避免阻塞。PC端推薦用Pythonpyserial讀取串口后按幀解析直接畫時間差直方圖、雙通道能譜直方圖、二維符合散點圖。直方圖分bin通常設為幾百皮秒到1ns用于評估時間分辨率。實測在50ns符合窗口、約100k事件統(tǒng)計下時間差直方圖呈現(xiàn)高斯形狀其σ可以換算成系統(tǒng)時間分辨率。處理的時候會碰到一個問題USB串口在Windows下傳輸不穩(wěn)定Windows自帶CDC驅(qū)動偶爾丟包導致幀錯位??梢栽趲锛娱L度和校驗讀端做狀態(tài)機恢復同時幀內(nèi)容不帶0xAA這種轉(zhuǎn)義字節(jié)避免誤同步。3.4 參數(shù)調(diào)試順序與關鍵閾值調(diào)試時我按這個順序來先不接SiPM加測試脈沖檢查偏壓、比較器翻轉(zhuǎn)、捕獲中斷是否正常再接入SiPM看暗電流計數(shù)率然后開ADC看基線最后引入放射源或激光源看符合峰是否出現(xiàn)。每步都要用串口打印關鍵內(nèi)部變量不要一口氣全跑。閾值電壓我通常會留一定遲滯避免毛刺抖動比較器模塊內(nèi)部可以配置遲滯或者直接靠比較器RC反饋實現(xiàn)。閾值每調(diào)小一點計數(shù)率會顯著上升所以一定要在信號幅度分布基礎上決定閾值不要盲目壓噪聲。ADC采樣率也建議從低往高試采樣率越高數(shù)據(jù)量越大處理不過來反而丟事件。4. 調(diào)試中的疑難問題與排查方法4.1 暗計數(shù)率過高閾值、噪聲和偏壓現(xiàn)象沒有放射源時符合事件頻繁產(chǎn)生計數(shù)率高得離譜。排查順序先看偏壓是否過高通常SiPM工作電壓超過擊穿電壓1~3V合適再看閾值是否接近噪聲底把閾值抬高試試最后看電路板上是否有開關電源噪聲耦合到信號線。柵極感應、地彈也能導致誤觸發(fā)盡量把模擬地數(shù)字地單點連接。另外環(huán)境光也會大幅增加暗計數(shù)SiPM封裝遮光必須嚴密。有一次我調(diào)試半天暗計數(shù)居高不下后來發(fā)現(xiàn)是透鏡窗口側(cè)面漏光貼了黑膠布解決。這類問題優(yōu)先硬件排查軟件閾值是輔助。4.2 峰值幅度偏小或ADC飽和TIA增益設得合適但發(fā)現(xiàn)幅度總是偏小??赡茉蛞皇荢iPM偏壓實際值低于設定值用萬用表復測二是信號經(jīng)過長線衰減快脈沖高頻分量損失導致峰被削平盡量縮短SiPM到TIA的距離三是ADC輸入阻抗不夠信號源阻抗太高造成分壓。偏大的原因通常是增益太高、ADC參考源問題或者基線漂移檢查基線并調(diào)整通道增益。峰值飽和則說明增益過大或動態(tài)范圍不夠可以在代碼里用飽和標志位剔除這類事件但更根本的是調(diào)小TIA反饋電阻或程序里限制最大閾值。4.3 雙通道時間戳不同步或亂序兩個ADC同步采樣但時間戳序列交錯常見原因是DMA緩沖區(qū)半滿和全滿中斷處理不及時導致部分數(shù)據(jù)丟棄時間戳錯位。解決方案是把DMA中斷優(yōu)先級提高或者改為雙緩沖并確保讀取操作和DMA寫入不會碰撞。更穩(wěn)妥的辦法是在數(shù)據(jù)幀里帶上通道標識解析時嚴格校驗防止錯幀。時間戳亂序還有一個來源是TIM2輸入捕獲的DMA搬運和中斷處理順序如果捕獲太頻繁且中斷響應太慢后到的捕獲事件會覆蓋舊的啟用多個捕獲緩沖或開多個DMA通道可以規(guī)避。4.4 符合峰PWHM惡化和時間分辨率變差符合峰展寬是多因素疊加的結(jié)果。首先檢查兩通道線路延時差是否校準其次快比較器閾值變化會導致不同幅度脈沖的觸發(fā)時刻漂移即時間游動閾值應盡量固定在一個合適的幅度比例上再有ADC插值對時間分辨率的貢獻也會體現(xiàn)在符合峰里如果插值算法不夠準時間差分布自然變寬。如果時間分辨率遠差于預期我通常會做一個簡單測試用同一個信號分兩路同時進兩個通道測時間差分布。這樣能剝離SiPM本身的時間抖動單獨評估電路和軟件帶來的影響再針對性地做優(yōu)化。4.5 常見問題速查表現(xiàn)象可能原因快速排查方法暗計數(shù)高偏壓過高、封光不嚴、閾值過低測偏壓、遮光、抬高閾值幅度偏小偏壓不對、信號衰減、輸入阻抗失配萬用表測偏壓、縮短走線、檢查ADC輸入幅度飽和增益過高調(diào)小TIA增益、檢查基線時間差漂移延時校準不準、閾值漂移、溫度變化重新校準、穩(wěn)定溫度和偏壓隨機事件丟包DMA中斷處理慢、串口過載提高優(yōu)先級、降采樣率/串口降速數(shù)據(jù)亂序緩沖競爭、幀同步失敗雙緩沖、幀校驗恢復5. 性能評估與方案擴展5.1 實測時間分辨率能達到什么水平我的評估方法接一個探測系統(tǒng)用放射源或LED脈沖模擬符合事件統(tǒng)計時間差直方圖的σ。目前這套F446方案在雙通道之間測到的時間差σ大概在1~3ns主要限制來自比較器閾值定時的時間游動和ADC采樣率。如果進一步優(yōu)化TIA帶寬、采用恒比定時CFD算法處理采樣后的脈沖前沿理論上可以把時間分辨率壓縮到幾百皮秒。但STM32F446在180MHz下的實時處理能力和ADC速度決定了它上限就在這再往上就需要FPGA或?qū)S脮r間數(shù)字轉(zhuǎn)換芯片了。對于學術實驗中的慢符合測量比如宇宙射線符合、普通閃爍體探測這套系統(tǒng)的性能綽綽有余。對于ToF-PET這類追求高時間分辨的場景可以作為前端數(shù)字處理部分仍然很有價值。5.2 外設還能怎么玩利用PGA、DAC和FPUF446內(nèi)部PGA除了用于放大快信號外還能做基線消除把信號背景抬升到一個適合ADC采集的區(qū)間。DAC可以輸出雙閾值一個低閾值用來觸發(fā)一個高閾值用來剔除大脈沖構成能窗。FPU可以跑一些簡單的數(shù)字濾波如移動平均、一階IIR進一步壓低噪聲。計算資源允許時還能在MCU內(nèi)部做小規(guī)模符合統(tǒng)計直接輸出符合計數(shù)率省去PC端實時處理。5.3 后續(xù)擴展方向外接TDC和高通道數(shù)如果繼續(xù)做這個方向我建議在F446后面接一片高精度TDC芯片比如GPX2、TDC7200用SPI把MCU的捕獲事件傳過去時間分辨率能做到幾十皮秒級。多通道符合則可以級聯(lián)多片F(xiàn)446用同一個外部時鐘同步或者在一個主F446上擴展外部比較器陣列由GPIO擴展觸發(fā)。代碼架構上把時間戳模塊抽象成獨立驅(qū)動換TDC時只需要改底層接口這樣后續(xù)升級成本更低。寫完這些我個人最大的體會是用MCU做核電子學信號處理關鍵不是堆參數(shù)而是把模擬前端和數(shù)字處理的邊界切分清楚。哪些事交給硬件比較器、哪些事交給ADC軟件插值心里一定要有數(shù)。我踩過最深的坑就是把ADC采樣率調(diào)到最高結(jié)果DMA帶寬不夠反而丟了無數(shù)事件后來老老實實降采樣率、用雙緩沖系統(tǒng)才真正穩(wěn)定下來。做這種實時采集系統(tǒng)穩(wěn)定性永遠比峰值指標重要。如果你們也要復現(xiàn)這個項目建議先從暗計數(shù)和測試脈沖開始一步步建立信心再接真實信號源整個過程會很順利。