站内搜索
发作品签到
专业版

便携式NaI(Tl)闪烁体环境伽玛射线能谱测量系统

工程标签

9.3k
0
0
42

简介

便携式NaI(Tl) 闪烁体能谱测量系统,以NaI(Tl)闪烁晶体为核心。其能精准测量环境中的伽玛射线,统计给出辐射能量分布,帮助识别射线来源和强度。由于其便于携带造价低廉,可为环境辐射监测等提供支持

简介:便携式NaI(Tl) 闪烁体能谱测量系统,以NaI(Tl)闪烁晶体为核心。其能精准测量环境中的伽玛射线,统计给出辐射能量分布,帮助识别射线来源和强度。由于其便于携带造价低廉,可为环境辐射监测等提供支持
星火计划2025
复刻成本:1600

开源协议

CC BY-NC-SA 4.0

创建时间:2025-02-11 18:56:30更新时间:2025-11-06 09:24:12

描述

0、简介
  0.1 应用场景
    便携式 NaI (Tl) 闪烁体环境伽玛射线能谱测量系统在多个领域发挥着关键作用。在个人安全防护方面,可帮助人们及时了解所处环境的辐射水平及辐射的能量分布,比如在核设施周边(常见被分析核素为Cs-137(铯-137),全能峰662keV)、医疗辐射区域活动时(各类γ源、软X射线源等),个人能借助该系统实时监测环境伽玛射线水平,预防辐射过量对身体造成伤害;对于环境保护而言,它能对不同区域的环境辐射进行监测,精准识别辐射异常区域,为生态环境评估提供重要依据。通过长期监测数据,还可追踪环境辐射变化趋势,及时发现潜在辐射污染问题。如若发生射线源丢失等严重危害公众安全的核安全事故后,便携式闪烁体能谱仪可用于大范围的放射源寻找;其次在其他领域,如在矿藏勘探领域,该系统优势显著。不同矿物质会释放特定能量的伽玛射线,利用其能谱测量功能,可分析射线特征,精准定位放射性矿藏,估算其储量和品位,为矿产资源勘探提供高效、准确的探测手段,推动相关产业发展。
  0.2 本文所涉及的理论、开发工具等
    1. 相关物理基础:粒子与物质的相互作用(可参考《原子核物理》卢希庭,北京:原子能出版社,1981、《原子及原子核物理》郭江,北京:科学出版社,2023)、射线粒子的电子学探测(可参考《粒子探测技术》汪晓莲,合肥:中国科学技术大学出版社,2009);
    2. 使用到的开发工具:Vivado2022.2、Vitis2022.2、MatLab2021b、Qt5.14.2;
    3. 关于电荷灵敏前置放大器的基本原理可参考哔哩哔哩视频(讲得很不错):https://www.bilibili.com/video/BV1S44y1u7Kc/?vd_source=817cd67fd12cc8c79d28007400d43c00
    *4. 本项目继承自本人2024星火计划:https://oshwhub.com/steve-don/digital_multichannel_analyzer。 希望能做出一个更完美、更简单的设备。
        *本项目对去年的项目电路进行了重绘,删除了大部分无用的部分,将ZYNQ7020、DDR、ADC等部分集成到单板上,PCB缩小至银行卡大小;
        *对FPGA Verilog代码进行完全的重构,修改了很多不安全、不规范的写法,优化了逻辑设计:包括将所有状态机修改为标准三段式、使用Skid Buffer方式替换了以前有时序问题的ram转AXI Stream总线模块,时序安全且完整、使用双端口ram模板替代了原有IP核,将算法模块整体封装为IP核(内不含任何Vivado IP)、使用标准化AXI Lite和AXI Stream接口进行算法IP核配置和数据传输,相比之前更加的标准化及方便移植;
        *补充了探头的电子学设计,整个谱仪从此完整。
    5. 电离辐射与物质作用的定性原理我将放在文末做简单的介绍,可能对于大家理解原理有帮助,如若不感兴趣可跳过。
    0.3 前言
    因为涉及专业方向有一些深度的内容,所以本文还是以科普结合设计为主,所有需要了解的理论知识都以定性的方式描述,也尽可能缩短篇幅。如果各位有兴趣深入了解粒子探测技术、粒子间的相互作用、甚至是反应堆、同步辐射光源相关的内容都可以私下讨论。我觉得知识本应该是相互传播、彼此开放的,没有什么专业壁垒是打破不了的,我们了解这些知识的人更不应该藏着掖着,能够向有兴趣的朋友传播知识是我的荣幸。当然了不可涉及任何危害国家安全等的相关内容,这是底线。
   其实本项目从最开始立项是打算还有配套的安卓移动端应用的,可是也未曾想到会这么忙,是在积累不到安卓开发的经验,所以为了尽快结项,先把完成的部分公开,这部分已经包含了所有的完整功能,只是上位机软件是在Windows上运行的,稍微偏离了便携式这个点、以及还有3D打印外壳等,这些内容将在后续全部OTA上😭。当然了,由于缺乏安卓开发经验以及平时很忙,所以后续打算使用linux开发板整一个便携终端吧,如果有朋友愿意帮忙完成安卓部分,那就很感谢了。
   最后欢迎相关和不相关专业的朋友学习和指正!本作品应该是能谱探测的终章了,因为作者研究生去搞同步辐射光源了,就此终结吧。由于是做束测,所以后面大量接触高速数字系统的设计,也许有空下一年会开一个Kintex Ultrascale或者Zynq Ultrascale系列的板子,会使用Cadence绘制(不用期待,多半没空😭)。如果后续有朋友能做出更优秀的作品,那我觉得我还是起到了一点点作用。 
 
      ****25/11/2更新,qt和vitis下调波特率为460800保证传输稳定,重新上传qt及固件。上传演示视频、软件教学 以及 伽玛射线能谱物理原理及解读视频。
     ****视频也同时在B站上传:https://www.bilibili.com/video/BV1oTydBcEWN/?share_source=copy_web&vd_source=d2cca38d09662f5199e01e6be23f32f6
 
  0.4 目录
    1. 电离辐射与物质的相互作用
       因为篇幅较多,故略😁。如有需求我可以有空直接出系列视频专门从理论讲一下。
 
    2. 仪器原理及采集部分电路设计
       2.1 NaI(Tl)闪烁体探测器工作原理
         2.2.1 NaI(Tl)闪烁体探头组成及原理
         2.2.2 数字多道脉冲幅度分析器组成及原理
       2.3 系统ZYNQ采集板硬件设计
         2.3.1 电源组成
         2.3.2 外设组成
         2.3.3 ADC及差分前端
 
    3. NaI (Tl) 闪烁体探头的制作与组装
       3.1 PMT的选型
       3.2 高压电源的选择
       3.3 PMT分压网络
       3.4 电荷灵敏前置放大电路
       3.5 极零相消PZC
       3.6 放大与电压偏置电路
       3.7 机械设计及组装
 
    4. FPGA核脉冲信号的数字化处理算法
       4.1 数字梯形成型
       4.2 成形算法逻辑的实现
         4.2.1 梯形三角混合成型
         4.2.2 脉冲起始检测
         4.2.3 脉冲基线估计
         4.2.4 脉冲堆积判弃
         4.2.5 脉冲峰值提取
         4.2.6 能谱成形
       4.3 逻辑行为级仿真验证
         4.3.1 梯形成形算法及外围逻辑算法仿真
         4.3.2 能谱成形算法仿真
         4.3.3 AXI Stream总线转换逻辑仿真
 
    5. Vitis下位机软件
         5.1 定时器及中断
         5.2 串口及中断
         5.3 DMA及中断
         5.4 运行主逻辑
 
    6. PC上位机
 
    7. 测量与评价
         7.1 ILA关键信号采样
           7.1.1 AXI-Stream数据流
           7.1.2 成形算法数据流
         7.2 系统性能测试
 
    8. 后记
 
CONTENT - END
 
     
    2. 仪器原理及采集部分电路设计

      2.1 NaI(Tl)闪烁探测器

      2.2.1 NaI(Tl)闪烁体探头组成及原理

    当带电粒子或γ射线进入闪烁体时,会通过电离或激发作用使闪烁体原子/分子受激,退激时发射可见光或紫外光(称为闪烁光),这些光子被光电转换器件(如PMT)捕获并转为电信号,从而实现对粒子的探测。

    *能量转换过程​​:入射粒子在闪烁体中损失能量,产生电子-空穴对(无机闪烁体)或激发分子(有机闪烁体)。这些激发态通过辐射跃迁退激,发射出波长在可见光或近紫外区域的光子。

    *注意:电子等带电粒子是直接导致的电离激发,而γ、X等光子辐射是先通过三大效应(光电效应、康普顿散射、电子对效应)转换成电子后再电离激发物质!

    目前,闪烁探测器已成为广泛应用的核辐射探测器之一,几乎可以用于核辐射测量的各种场合,这其中 NaI(TI)闪烁体由于成本相对较低、探测效率高以及对射线的阻止本领强,是应用最广泛的闪烁体探测器之一,也是本文所采用的探测器。

 

    上图展示了闪烁体探测器探头的组成结构:

    ​​入射窗​​:透光材料,如石英或透紫玻璃,用于保护光阴极并允许光子通过。

​​    光阴极​​:光敏材料,如Sb-Cs或双碱阴极,将光子转换为光电子。

​​    电子倍增系统​​:由多个打拿极(Dynode)组成,每级通过二次电子发射实现电子倍增。

​​    阳极​​:收集倍增后的电子,输出电流信号。

    *工作原理​​:光子透过入射窗→光阴极发射光电子→电子光学系统聚焦→打拿极逐级倍增(每级增益3-6倍)→阳极收集电子并输出脉冲信号。总增益可达10⁶~108

    当γ射线进入NaI(Tl)晶体后使其发射可见光子,光子经过光耦合被引导进入光电倍增管,在管的光阴极上通过光电效应打出光电子。光阴极后方是多级的金属电极,被称为倍增级或打拿级,它们通过外部的电阻分压网络形成梯度电压,让光电子在行进过程中被电场加速,打到每一级倍增级进行电子倍增,最后在输出时积累到可观的电荷数目。后续经过前端电子学部分转换后交给后端处理。

       
         2.2.2 数字多道脉冲幅度分析器组成及原理

    探头输出的电压脉冲信号经过一系列的模拟信号调理电路以适合ADC的输入范围。调理结束后由高速ADC进行数字化采集,并在FPGA等数字器件中进行算法处理。

    本文在FPGA内也实现了数字多道所需的全部算法。数字化后的核脉冲信号最重要的就是提取其脉冲幅度,因为实际核衰变是存在随机性的,所以采集到的信号也可能出现堆积的情况,实际堆积是没法区分两峰值的原始值的,所以需要一些算法逻辑来丢弃这些脉冲,最终再形成不同脉冲幅度的统计直方图(能谱)。

 
       2.3 系统ZYNQ采集板硬件设计
 

    上图描述了本文设计的测量系统的硬件结构图。由光电倍增管输出的电荷信号经电荷灵敏前置放大器后积分为电压脉冲信号,该核脉冲信号为双指数衰减信号。脉冲经过极零相消电路可减小其衰减时间常数,减小了脉冲堆积的可能性,而后小幅度的脉冲经过主放大器、直流偏置调整至-1V~+1V范围后输入ADC进行采集。

    本文选择的FPGA为Xilinx ZYNQ7020 SOC芯片,其除了FPGA外还集成了ARM处理核心,提供了非常强的通用处理能力。故将采集、数字成形、堆积丢弃、能谱成形等逻辑置于FPGA中完成,而整机的控制、上下位机的交互便置于ARM端完成,两端各司其职使得仪器的设计更加方便快捷。
   该部分后续将介绍ZYNQ采集板的设计,探头及软件等后续章节介绍😁。下图是PCB实物,使用嘉立创SMT服务。(可以看到其实板子很早就做好了,因为中间事儿太多了,改Verilog和上位机软件也花了很多时间。)
 
   
         2.3.1 电源组成
    上图是采集板的电源网络结构,遵循DS191要求。但其实实测不影响,完全可以同时上电。
    参考其他开源项目,选择了TPS82130,由于其片上集成电感,非常大节省PCB空间,设计和焊接都更方便。
    ADC和差分运放正电源选择高PSRR的LDO LT3045,这个LDO有点小贵(主要是自己库存没用完),个人认为对于本文应用AMS1117-3.3也不是不行,只要布局合理。负电源使用了SGM3204这颗常用的电荷泵芯片,也由LDO进行供电。如果你想要自行修改ADC、差分运放等芯片,请务必考虑LDO功率!LT3045最高支持输出500mA。
 
         2.3.2 外设组成
    上图展示了本文所设计采集板的硬件组成,包含了512Mbytes的DDR3颗粒、256Mbits的QSPI-Flash存储器、TF存储卡电路及PS与PL端各自的串口。
    关于DDR3原理图部分倒没有过多需要讲解的,但本文在绘制时虽包含了命令和地址的戴维宁终端匹配电阻,但在网上搜索后似乎发现ZYNQ对于单颗DDR可以不用布放终端匹配。虽然官方文档没有提及可以这样做,文档要求单端40R、差分80R的阻抗要求,那么地址和命令线也需要40R的终端匹配电阻来减缓信号的反射。不过如果考虑传输线效应,本文采用的DDR3电源电压为1.35V,所以终端开路反射不过加倍为2.7V左右,也许对于DDR3颗粒也是可忍受的?而且命令和地址是单向传输,反射对发射端也没有大影响?当然了,如果是多颗DDR颗粒就必须进行终端匹配了,不然由于反射传输线中段信号完全是不可用的。(这是一个值得研究的问题,不过就实际应用而言,单颗DDR3对于ZYNQ7020不进行终端匹配是可以稳定运行在533MHz下的,所以请注意PCB上不包含DDR原理图中框选区域电阻!)
    上图是DDR颗粒的读写测试,533MHz下全部通过。
 
上图是DDR颗粒的读、写眼图测试结果。可以发现存在一定的通道不对称性,在读眼图(左)中眼宽最差71.88%,最优78.12%,存在不一致,这些走线中段感抗、容抗变化可能造成、中心位置偏移(LANE3:64, LANE1:58),这可能与线间等长差异有关。写眼图(右)整体更优,眼宽更宽、中心偏差小,但与整体稍左偏。当然了,对于这类低端应用,没有SI分析、也不需要过度考虑阻抗和反射,按照要求绘制PCB基本都是能用的,再说了也没有控制PCB阻抗,能有这个结果也不错。
    
    TF卡采用了常用的TXS02612电平转换芯片,无需多讲。只是在TF卡槽端我习惯对数据和CMD使用上拉电阻,不上拉有些烂一些的TF卡没法用😢。如果需要高速度注意不要使用过大的上拉电阻或不要上拉,电阻过大可能带来更大的信号上升时间或线间串扰。
 
         2.3.3 ADC及差分前端
 
    ADC依旧沿用了AD9245-80,80Msps的采样速率对于该应用是绰绰有余的。该ADC采用CMOS输出,直连FPGA即可不用过多考虑。注意MODE端口配置为2/3Vcc,输出数据格式此时为补码格式!即-8192~+8191。
    PCB走线上采用串联匹配,但实际上有点考虑过度了。对于点对点传输串联匹配是极好的,相比于并联匹配功耗低但上升时间较慢,不可用于高速应用。如果本文考虑下不加匹配所允许的最大传输线长度(实际尺寸需要小于0.5*电子学等效长度,可忽略因反射引起的信号畸变),一般FR4材料的PCB单位传输延迟~180ps/inch,若取信号上升时间是频率的10%(80Mhz->1.25ns),则估计最大传输线长度3.47inch = 3470mil,那这是远大于本文的PCB中ADC走线长度的,实际上不需要考虑阻抗匹配,只需要等长即可。且在现在看来使用排阻并不合适,这会加剧线间串扰。不过能用,那就不管了。
 
    差分运放也顺势沿用了设计AD4945,但对部分无用电路进行了删减和修改,若要修改放大倍数(默认G=1)具体的电阻值请参考数据手册计算修改。
 
 
    3. NaI (Tl) 闪烁体探头的制作与组装
 
    本文使用的是北京滨松光子的CR125光电倍增管,相关产品选型、数据手册或相关技术培训手册可在其官网搜索:https://www.hamamatsu.com.cn/cn/zh-cn/product/optical-sensors/pmt.html
    在光电器件邻域,日本滨松公司也算是大头了,所以某鱼上二手器件大大的有,本文使用的当然也是某鱼淘的二手器件,你问为啥不用新的?那也要买得起嘛😁。大家可以去某鱼找合适的管子用,我看CR125是存量最大的,也相对便宜且设计方便吧(400块买的)。当然大家自己有合适的管子也可以按照我的流程制作,这个是通用的。
    以及本文使用的NaI(Tl)闪烁晶体(只能到某鱼上慢慢淘了):
    NaI(Tl)发光效率高,密度大,含有大量原子序数高的碘,因此对γ射线探测效率高,有很好的能量分辨率,是探测γ射线的常用探测器介质。其由于非常容易潮解,常被密封在金属中,只有一端透光,如上图圆柱顶部。
 
       3.1 PMT的选型
    **提前强调一下,请不要在有光照的地方启动光电倍增管,强光照射极易烧毁管子!!!
    承接上文,为了考虑大家使用到的光电倍增管(PMT)的来源不同,所以在这一小结将简单介绍一下如何选型一只合适的PMT!首先PMT肯定是为了配合闪烁晶体而使用的,所以大家也可以轻易想到,闪烁体发光的波长肯定是与PMT各部分对波长的响应是相关的:
    上图展示了常见闪烁晶体对应的特征发光波长。这里先解释一下各个参数的意义:
            1. 峰值波长:也就是退激发光光谱的最强处对应的波长;
            2. 衰减时间:指发光的衰减,服从指数衰减规律。越快能分辨两个事件间隔越小,时间分辨越好;
            3. 相对荧光效率:也就是相对于NaI(Tl)晶体的发光产额。当然是越大越好,这样统计涨落更小,输出信号幅度更大,信噪比更好。
    那么回到正文,本文使用的是最常见的,也是相对廉价的NaI(Tl) 碘化钠(铊)无机闪烁晶体,其特征波长为410nm。光在传输中第一个需要面对的是PMT的入射窗:
    上图是一些常见的入射窗材料。其中硼硅玻璃是最常用的材料,其短波长限制为270nm,可以很好的匹配NaI(Tl)闪烁体。其他的更短波长的入射窗材料针对特殊的闪烁体制造。所以在购买PMT时一定要看数据手册的入射窗材料部分:
    上图是CR125 PMT的入射窗材料:硼硅玻璃
    之后就是另一个重要的选型:光阴极材料。其是负责接收光子并发射光电子的电极,负责完成光子到电子的转换。
 
    上图是几种常用光阴极的光谱响应。纵坐标QE是量子效率:光阴极受闪烁体发出的闪烁光的照射下发出光电子的概率,一般用发射光电子数与入射光子数的比值描述。所以当我们搜索420nm附近QE最大且在峰值处的材料只有:Bi-alkali,这个就是双碱金属材料。
    双碱:Sb-Rb-Cs, Sb-K-Cs, 与Sb-Cs具有相似的(300-550nm)光谱特性,但灵敏度高,暗电流小,与NaI(Tl) 的发光波长相配,应用广。另一种双碱Sb-Na-K,可耐175°C高温,可用于石油勘探等高温场合。室温下暗电流非常小,用于单光子测量和低噪声测量。
    上文对PMT最主要的两部分进行了介绍,几乎只要确定上述要求就可以锁定大体选型。后续就是一些电子学和机械设计上的要求。需要注意的是PMT的光阴极面积应该与闪烁晶体相匹配,如前述本文使用的NaI(Tl)闪烁体透光直径25mm,则PMT光阴极直径至少大于25mm,当然完全匹配是最好的!所以上上图片中PMT表格所示:阴极最小有效直径25mm,这是完全匹配的。
 
      3.2 高压电源的选择
    一般PMT正常工作需要提供几百到上千伏的直流高压电源。一般为了简化设计有直接使用成品隔离电源模块,当然如果你有能力自己设计低噪声&高稳定性的高压电源,那可以自己做(建议参数做到1.0kV@0.5mA以上)。最后本文使用的也是来自滨松公司的成品模块:CC228-01Y模块,因为CC228系列在某鱼上貌似还挺多的,拆机货也不太贵。
    注意了CC228-01Y是负高压模块、CC228P-01Y是正高压模块!!!购买请一定注意!!!
   相关参数如上表所示,最高输出能力±1.25kV@0.5mA,完全够驱动单只PMT了。实物如下:
    具体的外围电路设计那是相对简单的,该电源模块可电阻控制也可电压控制,所以可选择外部外接可调电阻或者用DAC实时控制高压(具体参见附件中的数据手册)。当然,本文并没有实时调压的需求,所以:
   还为了给整个探头前置电路供电,所以还需要正负电压源:
    由于高压模块需要+12V输入,所以首先对采集板输入的+5V电压进行升压。运放的正负电源由LDO和电荷泵实现。
 
 
      3.3 PMT分压网络
    因为PMT的构成及原理,需要给各个倍增极提供梯度高压以实现电子倍增,其中最简单的就是通过串联电阻网络进行分压,实际上也是这样应用的。
    当然,正负高压在这里都是可以应用的,无非极性转换一下,但还是强烈推荐采用负高压。在电路设计上会有些许差异:
    正高压:光阴极接地,阳极接正高压,输出端必须接耐高压的隔直电容。特点:暗电流噪声较低,工作稳定,适于高精度能谱测量,特别是低能低本底的能谱测量。但是但是,经本人实测,虽然输出端的隔直电容是nF级别,但是取值是由考究的,使用随意电容,很容易造成脉冲前沿的过度下冲,这对ADC采用非常不利,个人预测与阻抗匹配可能有一定关系,但未研究透彻:
    可以看到图中,双指数衰减前沿的下冲,这是由于隔直电容引起的。所以为了消除影响,本文采用了负高压电源,由于负高压分压时PMT的阳极输出端是接地的,根本无需隔直电容,可以直接输出:
    光阴极接负高压,阳极接地,输出端为零电位,无需耐高压电容。外壳和磁屏蔽壳必须与光阴极绝缘隔离。一般测量用负高压,电源开关时的跳变和电源纹波不易影响测量电路。所以,针对CR125就有了如下图的分压网络设计:
    首先,分压电阻取值考虑的是总体值,取值计算标准为在输出高压下必须保证电流小于高压电源额定值,比如本文使用-1kV作为工作电压,0.5mA输出峰值电流,对于11级倍增需要12各分压电阻,每级阻值不小于167kR、本文使用了220K或470K的1/4W色环电阻。还有一点,对于分压比不一定都是1:1:1...这需要具体参考数据手册分压比要求,常见的PMT都要求光阴极与第一倍增级大于1:1分压,也就是分压大一点,这对统计误差或提高能量分辨率有帮助,但具体还是参考数据手册。RL为输出的负载电阻,一般取10KR。
 
    *分压电阻的组装与焊接:
    前文以及解释了如何选择电阻阻值,本文选择220KR 1/4W的色环电阻。参考数据手册的针脚定义和上述负压分配网络,很容易得到电阻的连接图示:
    如果使用CR125的PMT,根据上图焊接电阻即可。其他PMT也是同理,自行参考对应的数据手册。实物如下图所示:
    如果购买的拆机PMT带有管座,则可直接使用色环电阻进行焊接,无需制作PCB板。若只有PMT管子,那可以购买电子管的那种插针座(子弹公母头?)可以插到PMT的引脚上(根据针脚直径购买),后续也可直接焊接电阻。
    
 
      3.4 电荷灵敏前置放大电路
    前置放大的存在是为了提高系统信噪比,  减小信号经电缆传送时外界干扰的影响。在PMT上应用的最常见的前置放大器类型主要有三类:
  • 电压灵敏放大器
  • 电荷灵敏放大器
  • 电流灵敏放大器

    *对于电压灵敏放大器:电压放大器直接连接在探测器输出端、探测器输出电流信号对输出回路的总电容充电,相应的,信
号电荷量转变为电压幅度。但由于PMT、电路的杂散电容的存在容易分走部分电荷,这种测量方法的稳定性较差。但通常在输入端并联一个大电容可以很好的改善,不过会造成信噪比变差。该方法其的等效电路如下图:

    一般而言,都将探测器视为一个电流源。其中CA是运放的输入电容、CS是杂散电容、CD是探测器电容(如果是半导体探测器,其CD会随工作条件变化,导致稳定性更差)

    *对于电流灵敏放大器:电流放大器具有很小的输入阻抗和很大的输出阻抗。正是因为其输入电阻小,电流泄放快,杂散电容影响小,保留了电流形状。所以相比电压需要一定的时间进行充放电,电流前放应用于快速时间测量、高计数率场合或探测器必须远离测量仪器的场合。其等效电路如下图:

    *电荷灵敏前置放大器:是能谱测量中最常用的放大器电路,本文也是采用本电路设计的前放。电荷灵敏放大器具有很大的等效输入电容,导致探测器输出电容和杂散电容对信号电压幅度的影响可以忽略,可以获得较大和稳定的增益,因此具有很好的稳定性和很高的信噪比。其等效电路见下图:

    如果假设放大倍数为K,那么可以推导输入输出电压的差值,也即反馈电容两边的压差:

    反馈电容两端的电荷量(C=Q/U):

    一般而言,K都是远大于1的,此时反馈电容对放大器输入的影响相当于在输入端接了一个容量为(1+K)Cf的大电容!进一步可将输入电压表示为:

    易知则输出电压可表示为:

    在这也可以看出,输出电压是与输入电荷量成正比的(为了稳定性,Cf反馈电容建议使用高品质NP0电容),而从射线光子到相互作用产生的荧光在到最终输出的电荷数量都是与能量成正比的,所以在电路上,脉冲的幅度也就是与入射射线能量成正比了,这就是射线能谱测量系统的基础物理原理。

    如果还还想进一步深入了解电荷灵敏前放的物理原理及过程,请转到:https://www.bilibili.com/video/BV1S44y1u7Kc/?vd_source=817cd67fd12cc8c79d28007400d43c00

    所以依据上述原理和参考设计,前置放大电路如下图:

    图中U1组成的即为电荷灵敏前置放大器,运放使用AD8038电压反馈运放,其中R1为反馈电容的泄放电容,那么很容易知道输出脉冲都RC常数。所以后续的PZC电路其实不需要焊接R4的可调电位器,直接焊接C7和R6即可(RC常数一致即可)。经过PZC后信号脉冲的衰减时间将减小为(120R//499R)*10nF。

    在PZC后紧跟的是反相放大器,标准电路,就没什么可以解释的了。由于前放输出脉冲是负向的,所以经过反相后变成正向电压以便后续处理。此处放大倍数需要根据后续能谱结果进行调整,对于CR125而言,个人测试在2~3KR之间可以覆盖几十keV到3MeV的射线能量范围,完全可以满足自然环境的天然放射性核素的测量。前置放大部分PCB实物如下:

      3.5 极零相消PZC
    这部分在上一个项目中有详细的公式推导,详见:https://oshwhub.com/steve-don/digital_multichannel_analyzer 中2.2.1节。不再赘述了。
 
      3.6 电压偏置电路
    为了保证ADC输入范围合适(-1V~+1V)2Vpp内,需要对脉冲信号加以直流偏置。放大反相后的信号基线基本在几百mV上下,所以需要将其基线人为下移至-1V附近。
    很简单啊,模拟信号的加减法可以使用运放非常容易的实现,我们可以使用减法器将脉冲信号减去+1V的参考电压即完成了基线的搬移,参考电压可以使用可调电阻和电压跟随器实现:
    电压跟随器可以跟随R6调节的电压输出作为减法器的基线参考。根据虚短虚断可以很好的分析该电路,就不赘述了。
 
      3.7 机械设计及组装
     最终还需要对上述各部分PCB进行组装,因为并没有进行严格的机械设计,本着能用就行的态度就有了比较粗暴的方式。
    首先是两块圆形的信号前置电路PCB,在设计上这两块PCB是背对背焊接的,通过+5V、-5V电源处使用2.54mm插针焊接。如下图所示:
    图中红圈即背对背连接的位置,这样是比较牢固的,并不用担心脱落。两板之间除了电源外还有信号连接,可在夹层内用导线焊接:
    接下来是管座的连接,由于只有三根线,所以很好连接。信号输出(黄)直接连接到电荷灵敏前放的输入(GND不管)。高压负和GND可从PCB开孔传出引到上方连接电源模块:
      电源的焊接就是对应即可,最后打点热熔胶固定下线就可以了:
    整个探头内部装好后:
    需要提一嘴的:闪烁体与PMT入射窗的耦合一般需要硅油等光学耦合剂以减少传导中的损失,但是对于本文的应用中可忽略,所以直接耦合也无所谓,用透明胶直接围着粘一圈就行了。图中我用纸围了一圈主要是配合外壳的直径,避免内部的抖动。
 
 
    *最后的最后,就是壳子。这里有一个天才的想法,首先3D打印一个圆筒价格也是不便宜的,钢管也是贵的而且自己也切不了,所以直接用了PVC管作为外壳。因为塑料管子自己可以根据长度很方便的切割(有一根锯条即可,或者让商家帮你切),所以在考虑好直径和长度后就有了:
    管子尺寸就根据自己的组装情况而定了(以本文CR125为例,PVC外径40mm厚3mm),管底部使用硅胶管套密封隔绝(内径40.5mm)。注意一定要隔绝外界光线。上盖后续将使用3D打印件(静等后续OTA),顶部挡板见PCB文件,使用SMA进行电源输入和信号输出。
 
    4. FPGA核脉冲信号的数字化处理算法

    FPGA算法部分基于Z变换法推导的梯形成形实现。首先ADC采入的数据进行多级寄存器同步后经过FIR低通滤波器输出降噪后的核脉冲信号,对信号脉冲进行梯形及三角混合成形,利用三角成型便于寻找峰顶的特性可以更准确的确认核脉冲到达时间。而梯形成形用于提取脉冲的幅值。后根据脉冲起始信号将梯形脉冲用于提取基线和幅值,之后根据堆积判弃的结果确认当前计算的幅值是否可用于最终的能谱成形,并将谱数据通过DMA搬运到PS端DDR3存储器中。

    混合成形算法中存在大量的小数和有符号数的运算,在后文代码编写中统一采用固定小数位为16Bit表示。

       4.1 数字梯形成型
    关于这部分内容及MatLab仿真验证参见:https://oshwhub.com/steve-don/digital_multichannel_analyzer  中的第三章。
 
       4.2 成形算法逻辑的实现
         4.2.1 梯形三角混合成型

  梯形三角混合成形算法采用Z变换推导的梯形成形算法实现。根据梯形成形公式将整个成形过程分为四个模块实现:模块1实现输入信号延时nb并相减、模块2、3实现积分求和、模块4实现信na延时并相减。

  模块1将输入的原始脉冲信号进行延时nb时钟周期的操作,在FPGA中延时可以使用一定存储深度的寄存器进行移位操作实现,并动态选择输出位置:
    上述代码是模块1的核心实现,“REG_GLOBAL_LIMIT”为定义参数(默认300),复位时使用for循环将整个寄存器组复位,运行状态下每个时钟周期寄存器组进行一次移位并将ADC采样数据存入[0]寄存器。每个时钟周期并行的计算当前ADC采样输入值与延迟nb的差,存入寄存器“trapezd_alg_m1_dataout”作为该模块输出。
    模块2实现了输入信号的乘加运算:
    根据公式 ,运算结果是输入信号的单位时钟延迟与 d/na的乘积、输入信号与1/na的乘积以及输出信号的单位时钟延迟之间的加减运算。由于过程存在较宽的乘法运算,可能在FPGA中生成复杂的组合逻辑这里不应该直接在乘法之后进行加减运算,一般在乘法后进行寄存器锁存减小组合逻辑复杂程度以提高时序性能,代码中两乘法运算分别打一拍后进行最终的加减运算(ZYNQ中存在较多DSP资源,在综合时可以发现log显示自动使用DSP进行复杂运算)。式中 d/na和 1/na 在PS端运算后输入PL。
    模块3实现了简单的延迟加法:
    

     代码时序满足式y3 = y3(n-1)+y2(n-1) 。

    模块4与模块1类似,但由于道址并不存在小数,所以需在最终输出加入逻辑解决四舍五入与饱和溢出:
    首先代码使用组合逻辑解决了小数部分的截断及四舍五入的逻辑,“trapezd_alg_temp”为成形算法计算结果,共48位宽,其中低16位为小数部分,故代码第四行先根据数值的正负判断来分别计算进位值“carry_bit”。当数值为正时,只要trapezd_alg_temp[15]即小数最高位为1时,则数大于等于0.5,故进位,反之亦然。当数值为负时采用严格的四舍五入以减少累计误差,故不仅第16位为1,且低15位也需要不全为0。
    需要补充一点的是,三角成形与梯形成型原理是一致的,三角成形不过是梯形的平顶为0而已,故在使用时例化两组成形算法即可。这里使用三角成形是用于脉冲起始的判定。
 
         4.2.2 脉冲起始检测
    前文提及三角成形用于脉冲起始的判定,这利用了三角形峰值的特点,可以比较简单的确定顶点,如理论上通过比较当前值与前后点的大小即可判断。代码也确实基于该基础编写:
    首先,代码使用triangle_data_temp[2:0]寄存器组进行移位寄存输入的三角成形结果,通过if判断与用户输入的最低限制值来判断是否到达顶点值,但实际上ADC采入信号是叠加在各类噪声信号之上的,虽经过FIR滤波,但仍然会存在低频波动,这会导致假触发,即获得一些噪声引起的脉冲信号,这显然对于测量是有害的,所以在此基础上加入更多的判断逻辑。
    其一“threshold_count”寄存器将会在输入的三角成形值大于用户输入最低限制值“peak_threshold”后开始加一操作,当到达顶点时再判断该累加值是否大于用户输入的限制值(一般为8),这样可以避免因为噪声尖峰引起的误触发,当然也会抛弃一些幅度较低的脉冲。
    其二是判断两脉冲的间隔,当小于某值时不产生触发。逻辑使用“interval_count”寄存器计数上一个脉冲到当前顶点的间隔时间,当间隔大于na时可认为是真脉冲起点,反之亦然。
 
         4.2.3 脉冲基线估计
    因为输入信号的直流分量的存在,在经过成形算法后输出的信号将整个叠加在一定的基线上,这样必须将提取的梯形平顶峰值减去其基线结果才可以得到更为精确的脉冲峰值数据。所以在计算峰值前必须得出梯形成形信号的基线均值:
    代码的基础是求均值,上述代码中“delay_temp_trapezd”是寄存器数组,长度为:REG_GLOBAL_LIMIT + BASELINE_AVR_POINT + EXTRA_CONS(300+8+8),第一个参数是与前文一致的寄存器长度限制、第二个参数是均值点数,即8点求和求均值、最后一个为额外的提前点数。在前文提到过成形参数与图像的对应,由于使用三角成形用于脉冲起始判断,在逻辑识别到脉冲起始时,此时的梯形成形刚好是平顶起始点(但由于前文判断条件,这将延迟数个周期)。那么需要至少向前取 na+BASELINE_AVR_POINT+EXTRA_CONS点(EXTRA_CONS用于补偿延迟周期)。所以这需要一个较大的寄存器数组实现移位寄存好梯形成形数据,这样就方便的向前取点求和求平均。
    但是,以上的求解方式是有限制的,如果当两个输入脉冲小于这个间隔时,计算将得到错误的基线值。所以需要补充一些判断逻辑,这里采用间隔判断:当间隔大于特定限制时则计算新的基线值,如果相隔太近则继续使用上一个计算值:
    上述代码是产生基线值的核心逻辑,当有脉冲产生时,即“peak_start_flag”脉冲产生则表示峰值到来,此时还需要判断上一个脉冲距这个脉冲的间隔周期,也就是“interval_time_reg”,这里需要大于最小间隔:“interval_time”,该值为na+nb+BASELINE_AVR_POINT+EXTRA_CONS,该取值参考上一个项目的仿真结果。当符合间隔时,累加值除8得到基线,若不符合则维持原值。
  
         4.2.4 脉冲堆积判弃
    这部分逻辑是相对简单的,脉冲是否发生堆积判断只需要判断间隔即可得知,所以整体逻辑上只需要使用计数器即可实现。根据算法仿真结果,只需要脉冲间隔不小于nb即可:

    上述代码结合前文的脉冲起始判断计算两脉冲的间隔,当两者间隔小于nb时输出一个单时钟周期脉冲。

 
         4.2.5 脉冲峰值提取
    峰值提取将综合前述所有的输出信号进行综合的逻辑判断,故相对较为复杂,本文将使用三段式状态机进行实现。在解释代码前,先分析一下基础的实现逻辑。要实现峰值提取需要重点考虑脉冲堆积,当发生堆积时当前脉冲和前一脉冲都应该丢弃,那么逻辑就需要对当前及前一脉冲信号进行判断,堆积判断来自前文模块,首先前一峰值通过状态机进行峰值采集计算并扣除基线值(该脉冲与该脉冲的前一脉冲无堆积),当后一脉冲到来时先判定是否堆积,无堆积则可以放出上一脉冲的峰值,若堆积抛弃前一脉冲峰值以及当前脉冲的计算回到IDLE状态。
    状态机使用三段式模板,上述代码为状态转移的组合逻辑,IDLE为等待状态,当且仅当峰值到来时触发转移至下一状态;OUT为脉冲峰值输出状态,当满足不堆积条件时输出上一个脉冲的峰值并进入下一状态;DELAY为延迟状态,由于实际指数脉冲并非上升沿极短的理想指数衰减,而是由于分布电容、电感造成上升时间变长,成为双指数衰减信号、这会导致成形梯形信号拥有一定的上个升沿,所以一般会延迟数点后再计算平顶均值;ACC为累加均值计算状态,默认累加16个值后求解均值,均值求解再CALC状态;最后PILE_UP为堆积处理状态。在整个状态机中,不管在任何处理状态下发生堆积则立刻转移到该状态。下图展示了该逻辑的状态转移图:
    下文来具体解释一下各状态进行的处理:
   
    

    上述为OUT状态处理逻辑,是主要的输出判断,当脉冲到来时将判断当前是否发生堆积以及前一脉冲是否发生堆积,由此判断是否该输出前一脉冲峰值,两条件均满足即可输出,否则丢弃。

    DELAY部分使用计数器进行延迟,延迟周期由用户输入参数“peakext_delay_time”决定。
    

    上述代码是求取累加的逻辑,累加点数由参数“PEAK_AVR_POINT”决定,默认16点求和。当累加至设定值后,通过左移求解平顶均值,从而得到原始峰值数据。该数据将在CALC状态与基线值相减获得真实峰值数据。

    PILE_UP状态用于处理随时产生的堆积,该部分将复位所有过程寄存器,并记录下堆积状态用于下一脉冲到达时的判断。

    以上逻辑便实现了堆积丢弃和峰值计算及输出。
 
         4.2.6 能谱成形

    在经过上述逻辑运算后,模块将直接输出脉冲对应的幅度信息,这些幅度与输出脉冲电压相对应的、是与射线能量相对应的、也是与ADC采用位数相对应的。本文所采用的AD9245为14Bit、80MSPS的ADC芯片,故对应着16384个道址,能谱便是在对应道址上的累积,即探测到某个道址后在对应道址累积加一操作。

    所以这里可以使用一个存储深度为16384的RAM实现能谱成形及存储,首先需要执行读取、加一、写回的操作,其次还需要顺序读出数据转换到AXI4-Stream总线并传输到PS端,最后还需要有RAM复位逻辑。这样考虑,使用真双端口RAM实现是最为方便的。故这里使用了真双端口RAM的模板代码(具体见代码),在综合时将被综合器动识别并使用片上BRAM资源实现。

    同样的为了简化实现,这里使用了三段式状态机。状态机逻辑由前文逻辑输出的峰值及触发脉冲激活,激活后将使能RAM的端口A,并将WE=0(读模式),地址则是输入峰值,所有信号给定后,RAM将在下一时钟读取并取出地址值,而后状态机部分将在再下一个时钟读取到RAM值,所以实际设计中需要有两个时钟的延迟后才能读取到真是存储值。读取后将WE=1,改为写模式,在下一时钟值将被写回RAM,此时可回到IDLE并失能端口A。逻辑便完成了一次峰值记录。

    上述代码为状态机的逻辑转换部分,当“peak_value_ok”触发时状态机将进入一个新的读加写周期。

    除此以外,代码还需要实现RAM读取和复位,RAM的读取逻辑由总线转换部分生成,该部分内容在后续解释,复位逻辑如下:
    这里定义了寄存器“ram_reset_flag”用于标记复位正在进行。可知复位在全局复位结束后开始,具体逻辑见代码:
    

    在“ram_reset_flag”有效时,端口B被置为写模式,addrb为对于地址,依次递增,对RAM进行整体的写0操作。结束后“ram_reset_flag”将被置0,且将模式永久置为读模式,而使能也将一直开启。

    由于读出部分在其他逻辑中实现,故需将两个地址同时输入端口B,这里使用多路选择器的方式实现:

    在复位时使用addrb作为地址输入,而正常成谱状态下使用总线转换部分的读指针信号。

    最后就是前文所述的RAM转AXI4-Stream总线接口逻辑,ram2axis_skid一个高效无气泡的RAM到AXI Stream数据流转换器,通过三级流水线地址指针(s_read_pointerd0d1)同步RAM读取时序,并在tx_en(由下游就绪或缓冲状态控制)使能下递增地址,确保地址与ram_data对齐传输至AXI接口;为实现零气泡传输,模块采用Skid缓冲机制:当主输出(m_axis_tdata_reg)因下游反压阻塞时,新数据暂存至临时缓冲(temp_m_axis_tdata_reg),一旦下游恢复就绪则优先输出临时缓冲数据,否则直接更新主寄存器;同时在地址达到DEPTH-1时自动生成帧结束标志m_axis_tlast,整个设计以两级缓冲实现连续流控,适用于视频或ADC等需稳定高速数据流的场景。

    其次AXI4-Lite控制模块也使用Vivado模板修改而来,具体寄存器定义如下表所示:
    
    至此,所有主要算法逻辑全部实现。
 
 
       4.3 逻辑行为级仿真验证
 
         4.3.1 梯形成形算法及外围逻辑算法仿真
 
    上述代码是成形模块的顶层例化,成形参数采用手动计算,确定梯形上升周期为20、平顶周期为60、衰减时间常数为20、峰判断最低阈值设为1000、脉冲起始判断延迟为8、平顶均值计算点数为8。在Testbench中设置好时钟、复位等基础激励信号后,使用“$fscanf”读取COE波形文件,波形文件使用Matlab产生对应参数的理想指数衰减信号:
    

    使用Matlab产生量化位数10Bit,深度1024点的理想指数衰减(叠加高斯噪声),通过上述代码读入寄存器数组“coe_data”中供算法模块使用。

    由于实际ADC输出的是补码信号(-8192~8191),故在输入待测模块之前,进行依次有符号数减法模拟、并扩大一定倍数模拟真实操作,仿真结果如下:
    上图展示了算法的仿真结果,可以看到结果是符合预期设计的。首先由箭头1指引处,即三角成形的尖顶,峰起始判断逻辑成功发现了脉冲到来,并输出了一个脉冲;可以发现“stacking_flag”没有被触发,证明算法未发现脉冲堆积,从梯形成形结果来看,确实未发生堆积(两脉冲实际间隔为100);之后峰值提取逻辑也被随之触发,并输出了前一个脉冲的峰值以及脉冲“peak_value_ok”用于触发能谱成形逻辑。其次,箭头4所指引为基线计算结果,可以发现由于两脉冲间隔近,不满足间隔条件,所以基线计算结果不变,下图展示了平顶宽度减小的结果:
    可以发现,此时当间隔满足条件后可以对每个梯形前方基线单独计算。
    上图展示了堆积状态下的仿真波形,可以看到此时没有任何有效的峰值信息输出,“stacking_flag”一直在输出堆积脉冲标志信号。圈1处未输出有效脉冲是由于当前脉冲发生堆积,而圈2未输出则是由于前一脉冲发生堆积,这里需要区别一下。
 
 
         4.3.2 能谱成形算法仿真
 
    在前文提到了,RAM的复位是在“sys_rstn”有效结束后,即全局复位后立刻进行RAM复位。可以看到上图,在复位后“ram_reset_flag”置有效,RAM端口B web=1、enb=1,且地址开始自增。复位结束后查看仿真的Objects窗口中的信号列表发现RAM全复位。
    复位结束后,RAM即可从端口A进行读写操作:
    上图展示了复位结束后第一次读写RAM的操作流程。此时状态机逻辑由“peak_value_ok”触发,地址值即为峰值:5107。状态1即IDLE状态,在被触发后下一周期进入READ0,该状态对端口A进行了使能,并设置为读状态且输入读地址、后进入READ1周期进行单周期等待、在READ2状态将数值读出立刻加一输入端口A写通道,并修改为写模式、维持一个周期的写后数据被写入。在下一周期继续对该地址进行读写:
    可以发现,“doa”读出数据为1,故上一操作是成功的。
 
         4.3.3 AXI Stream总线转换逻辑仿真
    为了验证从RAM读取数据至总线Slave端接收数据的时序正确性,这里对算法逻辑进行了一定修改:首先去除RAM复位逻辑并使用“initial”手动初始化RAM(依次写入0至16383):
 
    使用任务编写,并在其他位置进行单次触发。主要逻辑为等待Master端准备好后立刻拉高“tready”信号,此时握手成功传输建立,后同步一下时序。后续在循环中反复判断是否是最后一个数据,当判断“tlast”有效后立刻拉低“tready”并关闭当前任务,结束一次传输。
    上图展示了一次连续的读时序(“tready”持续为高),在计算长度后得到的传输数据数量正好为16384个且在“tlast”后立刻拉低“tready”、观察波形知数据正好从0~16384依次传播,故接口数据传输时序正确。但实际上,正常传输过程中大部分时候会出现从设备“tready”突然为低的情况,所以需要仿真更为普遍的反压情况:
    上图展示了随机测试的部分波形结果。就该部分而言,“tready”在15555刚被读出时拉低,按照slave端时序,此时将不会读总线数据,该数据继续保持。在 “tready”重新拉高后,重新握手,之前保持的数据将在再下一个周期被slave取走,可以看到15555继续保持一个时钟周期让slave读取,而后在继续进行地址累加、数据连续输出。后续逻辑均如此。  
 
    5. Vitis下位机软件
    上图展示了整个Vitis程序的基本运行框架:首先初始化所有外设后,通过上位机发送命令参数从而启动测量,测量过程中通过私有定时器每2s触发一次AXI-DMA将谱数据搬运到PS端DDR中,搬运结束后通过终端触发串口数据上传。测量停止也通过 串口命令实现。后文将对每个部分进行解释(代码中提供的file(FatFS TF卡读写)、gpio(PL端GPIO)功能完整但实际未使用,可以自行参考):
         5.1 定时器及中断
    上述代码是定时器中断服务函数,主要控制一些标志位。“ms_read_flag”用于标志数据上传(有效时触发DMA搬运及串口数据上传)。“serial1_rx_count”是PL端串口超时的计数器(蓝牙或WIFI部分暂未启用,后续在完成便携终端后将重新上传新的代码部分)。关于定时器初始化、中断初始化请参考代码。
 
         5.2 串口及中断
    UART0(PS)用于与PC上位机软件沟通,负责接收命令和上传数据。因为在一开始就规定好命令帧的组成格式(8Bytes,4Bytes指令+4Bytes数据),所以在UART0的中断函数中只需要统计接收的字节数,达到要求后使能标志位,在主函数while中处理解析命令即可。
 
         5.3 DMA及中断
    AXI-DMA的配置代码,直接参考了数据手册的寄存器表写的,如果需要库函数可以自行参考Vitis提供的例程。在main中初始化时只需要配置好中断即可,在需要使调用该函数配置数据长度、目标地址就可以触发DMA运行。搬运完成后,进入S2MM通道的中断服务函数将标志位“axi_dma_flag”使能,该标志可作为UART0开始上传数据的启动标志。
 
         5.4 运行主逻辑
    接下来我们梳理一下while中代码运行逻辑。while中主要根据各个标志位来运行各种逻辑,首先当uart0接收数据完成后,调用函数“command_decode”函数解析命令并得到下传的参数,最终开始执行、第二个if主要判断uart1(PL)接收定时,定时达到自动认为接受结束、“ms_read_flag”是DMA手动触发的标志,可以通过上位机手动触发一次DMA搬运。
   
    “ms_stop_flag==1”和“ms_start_flag==0”是终止测量的标志位条件(command_decode函数中接收到终止测量指令后设置的标志位情况),此时需要读出PL端的计数器的数值,后续上传给上位机作为精确的活时间信息。
    后续“ms_start_flag”和“axi_dma_flag”均有效时即正在测量&DMA搬运结束,此时即可以开始UART数据传输,在这里就可以区分使用蓝牙还是UART0上传了,不过暂时未完成便携终端,所以if(1)了。蓝牙由于其传输数据太慢了,所以做了一个数据整合16384合并至2048,这可以大大减少传输时间,但如果后续考虑更换ESP01S就不合并了。
    这里需要说明一下上传数据的格式,首先包括帧头0XA5 + 16384 * 4Bytes谱数据 + 16Bytes的MD5校验值 + 0X5A帧尾。所以各位需要自己编写上位机的,需要在上位机上按照如上格式处理数据。
 
    6. PC上位机开发
    上位机软件使用Qt5.14.2开发,功能相对简单:包括文件保存读取操作、参数实时修改、测量控制。保留了最最基本的功能:
   
    软件在测量时可实时更新当前累积能谱值,也可显示计数率,但是计数率只能显示当前平均的每秒计数,并不直接对应剂量率,计数率与闪烁体体积正相关,越大则每秒可测量的射线数目越多。
    具体的能谱到剂量率的转换需要复杂的数学过程,最常用的如​​G(E)函数法。一般通过测量多个已知剂量率的放射源,拟合各能量区间的权重系数或者通过蒙特卡罗模拟或多项式拟合生成G(E)函数。这是精度极高的剂量率计算方法,远高于诸如盖格计数器之类的不针对能量反推剂量率的方式。但也可以像盖格计数器这样,通过单纯的计数率乘一个转换系数来做简单估计,但这些系数需要通过实验确定。所以实时计数率仅供参考,并不代表实际环境的高辐射!(如果有熟悉诸如MCNP5等蒙特卡洛仿真软件的朋友帮忙做一个G(E)拟合的那再感谢不过了)
    那么,软件如何使用呢?首先菜单栏:文件下可以打开和另存为.csv文件、设置下只有保存当前参数配置(修改参数后可通过此长期保存);串口设置:可搜索和连接指定设备(默认波特率750000);参数设置:可参考上一项目的视频或等待后续上传本项目的最新视频;测量设置就比较一目了然了。
 
    7. 测量与评价
         7.1 ILA关键信号采样
           7.1.1 AXI-Stream数据流
    上图展示了DMA读取谱数据的实际过程的部分波形,可以看到,与前文仿真逻辑一致,在“tready”拉低后“tdata”将维持不变,且在重新拉高后将维持一个时钟周期。

    图是数据传输的头尾部分(拼凑),这里将RAM的复位改为0~16383的自增且切断数据输入,综合实现后上板测试,数据流从0~16383结束,符合时序逻辑。

           7.1.2 成形算法数据流
 
   上图是实际的波形,可见采样的指数脉冲是有一定上升时间的双指数衰减信号,对实际信号进行成形可见梯形信号前沿变缓,更加的圆润。
 
         7.2 系统性能测试
    为了验证系统探测结果是否正确,这里使用了本人很久以前使用商用大体积NaI(Tl)探测系统测量的环境本底结果:
    上图为本文参考对象,可以发现比较明显的环境本底特征。如峰2是自然环境中K-40衰败的γ射线能量1.46MeV,这样可以预估峰1为环境正负电子湮灭峰0.511MeV,峰3为自然界存在的稳定衰变链钍系的衰变子体Tl-208释放的2.62MeV射线。而最大的峰为各类低能射线的叠加。
    本文所设计多道能谱系统测量结果如下:
    从上图可见谱型基本符合物理规律。由于闪烁体体积较小探测效率低,累积了60min依然没有得到理想的累积计数(前图所使用的闪烁晶体体积约本项目设备的13倍)。K-40峰位可见些许计数(319-383道直接),高能区几乎未探查到,这需要长达数小时的测量。
    但是呢,如果不小心搞到了什么矿石是吧:
    上图是对什么矿的测量结果,因为该次测量设置的前置电路放大倍数为1,所以整体峰前移,但可以发现很明显的峰值(63道右侧),这是衰变系的子体Bi-232的1.74MeV的γ射线。当然还有些低能射线被埋没在了本底中,不过就此特征而言可以确认本文设备的可用性。
    **因为现在实在搞不到Cs-137、Co60等常用的放射源,所以测量只能终止于此了。
 
 
*后记:
    8.1 文件组成结构
    由于Vivado、Vitis实在没有Project Archive功能,所以都是reset后上传到网盘的,实验之后是可以在其他电脑上打开的!接下来将对这些软件的目录结构进行讲解,以方便大家的进一步开发:
    (*25/8/5)3D外壳已绘制,包括探头的上盖(detector_cover)、ZYNQ采集板的盒子和盖子(zynq_box & zynq_cover)以及一个连接臂(3d_side_arm v6)用于连接探头和zynq采集盒,如果不需要可以分开使用。3D文件单独上传,在附件“3D外壳.7z”压缩包中不在百度网盘内!!
    当你们下载好文件后,可以发现主目录是这样的(红线划掉的不包含),主要文件在vivado_prj内:
    如果你们仅仅想使用打包的算法IP核,可以添加ip_repo目录到vivado中,具体如何使用IP核后文会提及。
    如果你只想使用比特流文件或编译好的固件,请继续打开Vitis目录:
    上图中BOOT.bin可放入SD卡或烧录到QSPI Flash中启动设备、system_wrapper.bit是Vivado综合导出的比特流文件。
    接下来解释一下Vivado项目中的文件结构:
    首先打卡Vivado项目后,Source有上图这些部分,除了system_wrapper和adc_fir是必要的其他都可以remove掉。注意,在打包上传时已经reset了整个项目,所以需要自己编译生成比特流,或者使用上文提到的比特流文件。
    上图是Block Design的结构,使用箭头标出了数据的流向。具体见下一节1.2。
 
    8.2 DMCA IP核使用手册
    在前文提到过,本文将整个算法打包为标准IP核,可以在Vivado中任意移植(QuartusII中需要自己重建项目,反正代码都在这儿)。为了保证通用性整个IP核中不包含其他Vivado IP,做了一些取舍,具体接口定义如下图:
    大部分接口作用是不需要进一步解释的,主要注意一下ADC数据输出仅是ADC原始数据(补码-8192~8191)转换到无符号数(0~16383)后的输出,该信号直接接入你们自己的各类滤波器模块,然后输出再接入到"adc_fir_datain"中,如果不使用任何滤波器,则直接相连即可。
    其次由于该IP不提供时钟管理能力,所以ADC驱动时钟请自行使用clock wizard生成一个相位提前/延后90~240度左右的同频时钟用于驱动ADC。具体相位自行调试以减少概率引起跨时钟域的亚稳态问题。
    将IP核导入Block Design后会有配置界面。主要需要根据自己的ADC进行频率及位数的修改(不建议AD位数超过15bit),请一定要修改这些参数!“Reg_Global_Limit”是算法中移位寄存器长度的限制,根据所需的Na、Nb进行减小可以显著降低LUT和FF的使用量、“Axistream Data W”是AXIS总线的宽度,不用修改。
 
    8.3 PCB文件说明
    1. downloader为xilinx jtag下载器,我画这个比较小;
    2. PMT_PWR 探头电源板;
    3. preAmp 包含电荷灵敏前置放大器及反相运放;
    4. preAmp_2 包含电压偏置电路;
    5. T113S3 想使用该芯片做一个Qt编写终端作为上位机,尚未完成请勿参考!
    6. ZYNQ7020为采集板PCB部分;
    7. 输出挡板是探头的SMA输出挡板。
 
    OK了,差不多零零散散写完了,真的写的我头疼。也不指望大家复刻,主要就是传播点知识,仅此。
    因为项目较大所以整个压缩上传了百度网盘:通过网盘分享的文件:zynq7020.7z  链接: https://pan.baidu.com/s/1-R_USTtVDSxuvuVmsE0XwA?pwd=5krp 提取码: 5krp
    也为了大家方便单独上传了:PC上位机release版本、vitis项目、DMCA IP核。
 
    最后最后,本项目完全个人原创,未参加任何相关比赛等,非本科、研究生等论文项目。请遵从本项目开源协议,禁止以任何形式的商业用途、禁止在科研论文中抄袭、复制本文成果、传播请标明出处及作者。如有违背,一经发现追责到底。
 
 
 
 

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
vitis.7z
134
2
ip_repo.7z
90
3
3D外壳.7z
45
4
BOOT_251102.bin
21
5
dmca_qt_251102.7z
27
6
参数设定_x264.mp4
20
7
使用演示_x264.mp4
15
8
伽玛能谱解读原理_x264.mp4
13
克隆工程
添加到专辑
0
0
分享
Logo GIF0
侵权投诉

工程成员

知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航