ARTICLE DETAIL

资讯详情

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

基于STM32F446的双通道SiPM符合测量与峰值检测系统

基于STM32F446的双通道SiPM符合测量与峰值检测系统 1. 双通道符合测量到底在测什么SiPM信号读数的核心命题在实验室里同时接两路SiPM比接一路要麻烦得多。我这次在STM32F446RE上做了一套双通道SiPM的信号峰值检测和符合计时说白了就是把过去用示波器加NIM插件机箱干的活搬进一颗Cortex-M4单片机里。它能直接解决一个很典型的物理测量问题两组探测器同时收到几乎同时到达的信号时怎么判断它们来自同一个物理事件并把每个信号的到达时刻和幅度都记录下来。这套系统的典型使用场景是闪烁体符合测量比如正电子湮灭、宇宙线缪子符合、或者两块SiPM夹着一块塑料闪烁体做粒子探测。两块探测器对称放置某个事件会在同一瞬间朝两个方向发射光子两边几乎同时出现脉冲。我们要做的就是在微秒甚至纳秒尺度上把它们挑出来同时把每路的峰值幅度量化出来因为峰值幅度对应的是能量信息。适合读这篇文章的人是手里刚好有SiPM和STM32F446RE开发板、想自己搭一套低成本符合测量装置的电子、物理或仪器方向的朋友。本文不会只给结论我会把从信号特征到硬件链路的取舍、再到固件外设配合的整套思路展开来讲。1.1 SiPM脉冲的物理特征为什么不能像读按键一样读探测器SiPM本质上是一堆工作在盖革模式下的雪崩二极管像素的并联阵列。每个像素击中一个光子就产生一个基本一致的雪崩脉冲输出电流脉冲的上升沿非常快通常在1到3纳秒量级下降沿由像素的恢复时间决定常见几十到几百纳秒。多个像素同时响应时输出就是这些基本脉冲的线性叠加峰值幅度近似正比于同时触发的像素数量。脉冲上升沿特别快意味着时间信息很锐利而下降沿被RC常数拉长意味着能量信息在时域上是分散的。这里有个天然矛盾如果你用ADC连续采样去追这个脉冲峰值要么ADC采样率足够高要么把脉冲成形拉宽。SiPM直接输出的脉冲在几十纳秒内就达到峰值而STM32F446RE的ADC最快大约2.4 MSPS单次转换就要416纳秒连脉冲都快结束了才采到第一个点根本追不上真正的峰值。所以双SiPM峰值检测设计的第一个关键问题跟模拟前端怎么把信号调理好有关但更核心的是选择一个匹配信号特征的采集策略。1.2 这个系统需要同时拿到的两个核心信息SiPM探测链路里有两类信息必须分开处理。第一是到达时刻也就是脉冲上升沿跨过某个阈值的瞬间它决定了两个通道是否满足符合条件也决定了时间差测量的精度第二是脉冲峰值幅度它反映了这次事件中光子数多少对应能量信息。很多第一次做SiPM采集的人上来就想在微控制器里直接用中断读GPIO或者用ADC反复采样找最大点。这两种做法一个丢了幅度信息一个丢了时间精度。符合测量真正关心的是两个通道的到达时刻差。比如说甲通道在T1时刻触发乙通道在T2时刻触发如果|T1 - T2|小于我们设定的符合窗口就判定为同一个物理事件。要在单片机上做这个事硬实时性是第一要求任何中断延迟、软件取反、循环轮询的不确定性都会直接变成时间差的噪音。所以从系统架构上就必须把时间戳的获取放到硬件外设里而不是靠CPU数指令周期。1.3 为什么选STM32F446RE这块板子STM32F446RE不是我手头最强的单片机但做这个项目很合适。它有双ADC可以同步转换两路模拟信号有多个支持输入捕获的定时器可以给两路比较器信号打时间戳CPU频率180MHzCortex-M4带DSP指令做简单峰值寻峰和符合判选绰绰有余。价格也合理一片几块钱到十几块钱比专门的TDC芯片或者高速示波器方案便宜太多了。它有一个不太被重视的优点ADC的模拟看门狗可以当做一个不完全的硬件比较器来用虽然时间精度不如外部高速比较器但至少提供了“信号超过阈值就触发中断”的能力。真正的符合测量还是需要外部比较器这个后面会详细讲。最终我是“定时器输入捕获给时间戳、ADC量化峰值、外部比较器负责纳秒级触发”三件套配合把分工彻底拆清楚。2. 峰值检测方案选型为什么我放弃了“纯高速ADC”路线这块内容我想放在所有固件细节之前因为方案决定成败。如果你直接照着数据手册把ADC配成连续采样模式然后企图在中断里找峰值大概率实测效果很糟糕。STM32F446RE的ADC确实能跑到2.4 MSPS但这个速度对SiPM直接输出信号来说是不够的。展开算一下你就有概念了。2.1 先算一笔时间账2.4 MSPS到底意味着什么STM32F446的ADC时钟最高36MHz采样周期可以设得很短但至少也要3个周期加上12个周期的逐次逼近转换时间一次转换最少15个ADC时钟周期。15除以36MHz等于大约416纳秒。也就是说如果开启连续采样每隔416纳秒才能拿到一个点。而SiPM经过前端放大后的脉冲上升沿可能只有几纳秒整个脉冲从基线到峰值到回落到半高也就一百多纳秒。用416纳秒的采样间隔去量一百多纳秒宽的脉冲大概率只能采到零点几伏的低电平峰值幅度几乎测不出来触发时刻更是无从谈起。如果强行把SiPM信号通过CR-RC成形网络拉宽到几微秒时间信息就被整形电路展宽了到达时刻的精度会明显变差。符合测量的目标本来就是找出两个通道的微小时间差你反而把一个纳秒级的事件人为扩大几百倍那前面做的快速上升沿就白费了。所以纯ADC连续采样的方案并不适合做这个项目的峰值检测和时间测量至少不适合直接用于时间戳部分。2.2 三种可选架构放在一起对比我在项目一开始列了三种常见方案各有取舍。第一种是 ADC连续采样DSP寻峰不做外部比较器全部靠CPU识别波形。优点是硬件最简成本极低缺点是采样率限制了时间精度只适合脉冲宽度被刻意拉宽到微秒级的系统。第二种是外部高速比较器触发一个定时器输入捕获引脚用硬件在上升沿瞬间锁存计数器值同时用ADC量化峰值。这个方案时间精度高MCU负载低是比较经典的核电子学套路。第三种是模拟峰值保持器慢速ADC把峰值幅度先用模拟电路保持住然后再让ADC慢慢读在物理实验仪器里很常用但多了一堆模拟器件双通道就要两套保持复位电路。下面是当时我列的对比表方案时间精度峰值精度硬件复杂度MCU负载适用场景ADC连续采样软件寻峰差受采样率限制中等低高慢脉冲、低频触发外部比较器定时器捕获ADC单次采样高可到纳秒级较高中低快速SiPM脉冲、符合测量模拟峰值保持器慢速ADC只负责时间时较高最高高低多道分析器、精密能谱2.3 我最终选择的组合我最后没有选单一方案而是把第二种和第三种各自最能发挥优势的部分合并了。时间戳部分用外部比较器触发定时器输入捕获在硬件层面拿到两个通道的到达时刻峰值部分用ADC在比较器触发后稍作延时再采样通过软件延时把ADC采样点对准脉冲峰值附近。这种方法不需要额外的峰值保持器幅度精度也足够用于符合事件筛选。为什么不用峰值保持器因为双通道各加一套高速二极管、保持电容和复位电路小型化困难而且复位时序如果和MCU配合不好很容易引入额外故障点。直接在比较器触发后延时几十纳秒再启动ADC采样虽然只能采一个点但恰好落在脉冲峰值平台附近对大多数符合测量来说已经足够区分开信号强度和噪声。后面实测也证明这种组合在成本和性能之间找到了一个比较理想的平衡点。3. 硬件链路从SiPM到STM32F446RE引脚的每一步都要有数现在聊聊模拟前端。很多单片机工程师对数字端非常自信觉得只要固件写得好信号进来总能用软件补救。但在SiPM这种弱信号、快脉冲场景下模拟前端做差了后面数字端再怎么优化都救不回来。我这次用的是两三片3mm SiPM配合塑料闪烁体输出电流峰值大约几毫安量级在50欧姆负载上形成几百毫伏的电压脉冲足够驱动后级比较器。3.1 SiPM偏置与信号提取SiPM工作电压需要超过击穿电压大约2到5伏典型偏置在28到30伏左右。这个偏置电压必须干净否则纹波会直接叠在信号上。我给每路SiPM的偏置都用了RC多级滤波靠近SiPM的地方还加了一个100纳法的贴片电容和10欧姆电阻组成低通把电源噪声压到几个毫伏以内。SiPM输出是电流源性质的我采用最简单的方法通过一个几十欧姆的取样电阻直接转换成电压信号再用同轴电缆或者短走线送到下一级放大。这里有个容易犯的错SiPM阴极接正高压阳极输出信号所以信号参考地是系统模拟地不要和单片机数字地混连。两路SiPM的偏置和取样电路我画PCB时尽量做到镜像对称这样两通道时间延迟、幅度响应才一致。符合测量的时间差是靠两路相对误差而不是绝对精度所以两路对称性比每一路独立做得多好更重要。3.2 放大与比较电路取样电阻产生的电压脉冲幅度大概在几十到几百毫伏比较器直接判别的阈值不太够稳定所以我在比较器前加了一级宽带放大器把信号放大到1伏左右。放大器我用的是高速电压反馈运放增益带宽积足够覆盖SiPM信号的主要频谱成分。比较器则选了传播延迟只有几纳秒的型号输出接一个上拉电阻然后直接送到STM32F446RE的定时器捕获引脚。阈值设得不能太低太低会把基线噪声当信号也不能太高太高会丢掉幅度小的真实事件而且会引入比较大的时间游动time walk因为不同幅度的脉冲到达同一阈值的时刻不一样。我先把比较器阈值设在噪声基线上方约3倍标准偏差处然后再根据实测峰高分布微调。如果你用微调电位器位置要稳定否则阈值温漂会导致触发率漂移调试时很烦人。3.3 PCB布局与双通道“镜像”设计双通道符合测量最忌讳的是两个通道延迟不对称。PCB上我会让两端SiPM到STM32F446RE的走线长度尽量相等误差控制在1到2毫米以内。信号走线两侧铺地铜并且给信号线周围打满过孔形成完整的地屏蔽。电源走线和信号走线一定分开尤其要避免数字引脚翻转时把噪声耦合到比较器输入端。还有一个细节STM32F446RE输入捕获引脚的浮空输入问题。比较器输出在空闲状态时是高电平还是低电平取决于你选择哪种输出极性。如果比较器输出是开漏结构外部上拉电阻必须接如果推挽输出但空闲电平刚好落在输入阈值附近也容易误触发。我是直接把比较器输出配置成推挽空闲为低电平只有事件来的时候跳高这样定时器在上升沿捕获逻辑最简单。4. 固件实现STM32F446RE的外设配合与中断流程硬件链路搭好以后剩下的事情就是把STM32F446RE的定时器、ADC、DMA和中断整理成一个流水线。我最开始想着在中断里把时间戳记下来然后立刻读ADC结果发现如果ADC转换时间太长会影响下一次事件捕获。后来才改成“定时器中断只记录时间戳和置位标志ADC值在主循环里读”整个系统的响应才稳定下来。4.1 外设资源分配表先给资源分配表后面讲配置时对着看比较清楚。功能外设输入引脚说明通道1时间戳TIM2_CH1PA0上升沿捕获32位计数器通道2时间戳TIM2_CH2PA1上升沿捕获和通道1共用TIM2通道1峰值幅度ADC1_IN0PA0实际测量时用另一路模拟引脚通道2峰值幅度ADC2_IN1PA1双ADC同步采样比较器触发LEDGPIOPC13调试用翻转观察触发率实际布局时ADC输入引脚和定时器捕获引脚可能会冲突因为STM32F446RE不能把同一个引脚同时配置成模拟输入和定时器输入。我最后的做法是两路比较器触发信号接PA0/PA1做时间戳两路模拟信号接PC0/PC1做ADC输入。硬件设计时就要提前把引脚分好不然固件改起来很痛苦。4.2 定时器输入捕获配置纳秒级时间戳核心思路是用TIM2的通道1和通道2分别捕获两路比较器上升沿。TIM2是32位自动重装载计数器时钟来自APB1最高90MHz计数一次大约11.1纳秒。虽然不如专用TDC芯片那么精细但对于符合窗口在几十到几百纳秒的场合完全够用。TIM2工作在自由运行模式自动重装载值设为0xFFFFFFFF溢出周期很长配合溢出中断处理时间戳就是连续的。以STM32 HAL库为例配置片段可以这么写htim2.Instance TIM2; htim2.Init.Prescaler 0; htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 0xFFFFFFFF; htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_IC_Init(htim2); // 通道1捕获上升沿 sICConfig.ICPolarity TIM_INPUTCHANNELPOLARITY_RISING; sICConfig.ICSelection TIM_ICSELECTION_DIRECTTI; sICConfig.ICPrescaler TIM_ICPSC_DIV1; sICConfig.ICFilter 0; HAL_TIM_IC_ConfigChannel(htim2, sICConfig, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1);捕获中断里只需要把计数器值存到全局变量然后清标志。关键点在于中断回调尽可能短不要在回调里做ADC轮询、串口打印这些操作否则第二路信号来了中断还没来得及处理就被丢掉了。void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_1) { t1_capture HAL_TIM_ReadCapturedValue(htim2, TIM_CHANNEL_1); event_flag | (1 0); } else if (htim-Channel HAL_TIM_ACTIVE_CHANNEL_2) { t2_capture HAL_TIM_ReadCapturedValue(htim2, TIM_CHANNEL_2); event_flag | (1 1); } } }这里有个容易被忽略的细节TIM2的通道1和通道2使用同一个捕获中断回调读取捕获值时顺序要一致不要让两次捕获间隔中被TIM2更新事件覆盖掉。另外如果开启TIM2更新中断做溢出计数注意退出中断前要清除TIM_SR_UIF标志否则溢出计数会一直触发中断严重挤压主循环时间。4.3 ADC采样与峰值提取由于时间戳已经由定时器捕获完成ADC就不需要连续高速采样了。我采用上升沿触发后的延时采样方案当比较器上升沿进入定时器捕获引脚时同时也连接到某个外部中断线在外部中断里开启一个短延时然后启动ADC转换。延时的长短要根据信号链路的脉冲宽度调试我这边大约延时30到60纳秒让采样点落在脉冲峰顶附近。ADC配置我用了注入组转换优先级高可以由外部触发启动。STM32F446RE ADC时钟最大36MHz配置为采样周期3个周期加转换12个周期单次转换大约416纳秒。虽然这比脉冲宽度长但只要延时对齐它采到的就是峰值附近的电平。实际测量中大信号和小信号的上升沿斜率不同固定延时会有系统性偏差这个我在后面的校准部分展开。// 通道1外部中断服务函数示意 void EXTI0_IRQHandler(void) { if (EXTI-PR EXTI_PR_PR0) { EXTI-PR EXTI_PR_PR0; // 延时约40ns具体值根据示波器波形调整 delay_ns(40); HAL_ADC_Start(hadc1); // 转换完成后在DMA或轮询中读取 } }双通道的ADC同步采样我没有依赖自带的同步模式因为我的两个触发脉冲本身已经由外部比较器分开更简单的做法是每路独立触发一次ADC。如果你想要严格同步采样同一个时刻的幅度那就要考虑ADC1和ADC2的同步规则模式把两个ADC的触发源配成同一个然后一次DMA搬运拿到两通道结果但时序上会复杂很多。对于符合测量项目我更推荐把通道独立处理各走各的触发链路时间戳确定以后再在软件层面做符合判选。4.4 主循环中的符合判选与事件处理中断只负责时间戳记录和标志位置位真正的判选逻辑放在主循环里。我在主循环里维护一个小的事件缓冲检测到两个通道的触发标志都置位后读取两个时间戳计算时间差判断是否落在符合窗口内。如果符合再读取各自ADC幅度值组成一个符合事件结构体存入环形缓冲供上位机读取或者串口输出。这里有一点很重要必须考虑两路触发并不是成对来的。可能通道1触发了好几次通道2一次都没触发这时候不能把通道1的旧时间戳和通道2的新时间戳匹配到一起。我采用的方法是给每次触发记录独立的时间戳和一个“已使用”标志每次匹配时都从最早未使用的事件开始搜索搜索窗口限制在几微秒之内这样能把偶然符合的概率控制住。如果项目对吞吐量要求高可以把环形缓冲做成无锁队列但我的触发率在几千赫兹以内普通数组加标志位已经足够了。5. 符合判选时间窗口怎么定偶然符合怎么扣符合测量核心是一个朴素逻辑真假事件都可能在两路产生脉冲我们需要用时间差把它们区分开来。真实的物理事件两路时间差很小噪声、暗计数、随机辐射造成的两个独立触发时间差则是均匀分布的。根据这个差异你可以把符合窗口内的计数当作真符合加偶然符合窗口外的计数当作纯偶然符合进而做本底扣除。5.1 符合窗口的确定窗口长度通常由系统时间分辨能力决定。STM32F446RE定时器捕获的时间戳分辨率大约11纳秒比较器引入的抖动大约几个纳秒如果SiPM和闪烁体的上升沿也很快整套系统的时间差分布半高全宽大概在十几到几十纳秒。符合窗口如果设得太小比如10纳秒会把一部分真实事件挡在窗外导致探测效率下降如果设得太宽比如500纳秒又会把大量偶然符合装进来真假难分。我建议先用示波器或者直接把时间差原始直方图打出来看真实符合峰大概在什么宽度再反推窗口。假设你测得的时间差分布半高全宽是25纳秒符合窗口取±50纳秒到±100纳秒既保留了大部分真实事件又有效抑制偶然符合。对于塑料闪烁体配合SiPM的快速系统这个窗口完全合理。5.2 偶然符合本底计算和扣除偶然符合率可以用两路单计数率乘积乘上符合窗口来计算。R_random N1 × N2 × 2ΔtN1和N2是两路各自的触发率2Δt是符合窗口总宽度。比如两路各500 Hz单触发率窗口±50纳秒那么偶然符合率就是500乘以500乘以100纳秒等于0.025 Hz。如果真实符合率是几个赫兹这个本底占比不算大但如果两路暗计数率高偶然符合会明显污染结果。实测数据里偶然符合表现为时间差直方图上叠加的平坦本底真实符合是在0附近的峰。数据处理时把峰外的平均计数作为本底扣除即可。如果窗口设在±50纳秒本底可以直接用±200到±500纳秒区间计数外推这个方法比单纯减偶然符合公式更贴近实际。5.3 判选状态机的具体行为我的判选状态机很简单每产生一个事件就检查另一路是否有时间戳落在当前时刻前后一个窗口宽度内。如果没有说明是单路触发直接丢弃或者记录为单计数如果有就把两个时间戳相减和窗口比较。为了让两路触发顺序不敏感我会把两个时间戳都转成同一个基准再取绝对值比较。调试时我习惯在GPIO上翻转一个引脚每次判选到符合事件就拉高100纳秒这样用示波器就能直接看到符合事件速率也能和串口打印的计数互相印证。这个调试手段非常实用比单纯看串口数值直观得多尤其在验证中断有没有频繁丢失时它能立刻暴露问题。6. 校准与性能验证实际上我是这样确认系统在工作的代码写完以后第一件事不是开始测真实物理源而是先校准。校准分两步单通道峰高响应和双通道符合时间分辨率。没有这一步你采到的“符合事件”可能只是两个通道的随机噪声刚好离得近而已。6.1 单通道峰高标定用LED脉冲验证线性最简单的标定方法是用一个LED和信号发生器给LED发极窄的光脉冲照射SiPM然后观察ADC峰位输出。连续改变LED驱动电压对比ADC峰位应该能看到近似线性的变化。这个测试能同时验证比较器阈值、ADC延时对齐和幅度采样是否正常工作。如果LED脉宽太宽SiPM输出的脉冲峰会和光强积分相关而不是峰值相关所以我会把LED脉冲宽度压在10纳秒以内。如果单通道峰高标定曲线在低端弯曲多半是比较器阈值切掉了一部分小信号高端如果出现饱和平台则是运放或者ADC量程到了头。调节运放增益或比较器阈值把动态范围压在ADC满量程的20%到80%之间这个系统最稳定。6.2 双通道符合时间分辨率的测量正式测量时我在两路SiPM之间放置一个位置随机的放射源让它在衰变时同时朝两个方向发射光子。如果两路探测器对称理论上符合时间差应该是0附近的对称分布。我实际采集到的时间差直方图呈高斯状中心在0附近半高全宽大约20到30纳秒对应前面估算的定时器量化和比较器抖动。这里有一个数字上常见的坑固定阈值比较器对不同幅度的脉冲触发时刻有依赖幅度大的脉冲更容易提前越过阈值这个效应叫时间游动。我在测量中看到时间差分布有时候会偏斜就是幅度差异造成的。解决的办法有几种一是在最终处理时用ADC幅度对时间差做校正这也是很多PET探测器的方法二是尽可能让比较器阈值低减少时间游动三是如果接受一定复杂度可以使用恒定分数定时器但那需要额外的模拟电路。我在这个项目里做了一版最简单的幅度校正效果非常明显。6.3 幅度信息在符合判选中的价值真正做符合测量的物理实验往往还需要幅度一致性筛选。来自同一事件的符合信号两路幅度应该存在一定相关性。通过双通道模式触发我可以用2D散点图观察两个通道幅度的对应关系。如果散射点落在一个对角线上说明两路探测到的是同一个事件如果散在四面八方大概率是偶然符合或噪声。这个信息在校准后用来进一步压低本底非常有效。在实测中我确实观察到单纯靠时间窗挑出来的“符合事件”有一小部分在幅度散点图上完全没关联。把这些事件剔除后有效符合计数更干净。所以完整的符合测量系统绝对不是只看时间差时间和幅度要联合使用。7. 调试过程中踩过的坑为什么我的触发经常“多出”一堆假事件这个项目调试最折磨人的不是算法而是各种偶发触发问题。我单步执行发现逻辑完全正确但放那跑一分钟计数就乱跳。这些坑很典型我列出来希望能帮你省几天时间。7.1 输入引脚浮空导致的随机触发一开始比较器输出到STM32F446RE的引脚没有配置上下拉空闲电平处于不确定状态。比较器输出虽然推挽高低电平很干净但STM32的GPIO寄存器如果配置错成浮空输入电平接近阈值时内部噪声就会触发定时器捕获。我在调试时发现即使拔掉比较器输出线定时器捕获中断依然在触发就是这个原因。后来把GPIO配置为输入模式并开启下拉电阻确保空闲状态为低问题立刻消失。7.2 ADC采样点没对准峰值峰位偏低我在刚开始的版本里用固定延时启动ADC但不同幅度信号的上升沿斜率不同到达阈值的时间点就会漂移固定延时自然无法保证每次都采在峰顶。我后来用示波器对比了实际脉冲波形和ADC采样点到峰位的偏差发现大信号偏差较严重小信号偏差较小。于是在固件里加了一维查表校正根据第一次采样到的幅度反推一个校正系数并重新采样或者用软件插值修正。这个方案不需要额外硬件效果也够用。7.3 调试工具对时序的影响使用ST-LINK在线调试时芯片时钟频率会因为调试器暂停或者断点而乱掉定时器计数器在单步执行时也不会正常走。遇到时间戳明显异常的现场你先别急着怀疑算法先断开调试器用独立供电跑一遍很大概率问题就消失了。我后来做计时相关实验全部改成串口打印结果或者上位机读取没有再依赖在线调试。7.4 中断里处理太多事导致事件丢失这个问题我说得太多次了但还是有人会犯。定时器捕获中断里如果去做ADC启动、串口发送、printf打印实际执行时间可能超过两路事件间隔第二路触发来了中断还挂在前面没退出。尤其printf这类阻塞调用一次可能几百微秒足够丢掉几十个事件。我的原则是中断里只做“记录时间戳、置标志、清中断标志”这三件事任何幅度采集、符合判选、数据输出全放主循环。实时性要求高的话可以把主循环里的代码再优化但绝不让中断变重。最后再说一个使用上的经验调试双SiPM符合线路手头一定要有一台能单次触发的示波器没有它你很难确认比较器输出和ADC采样点的相对位置。哪怕是入门级数字示波器只要能看到两个通道的脉冲波形就能省掉大量猜测的时间。整套系统跑通以后你会发现自己对“硬件外设如何协同工作”的理解比单纯写业务代码要深得多。
返回列表