Hotdry.

Article

RP2040 替代 FPGA:pic0rick 超声波 DMA 流水线设计

深入解析开源超声波采集板 pic0rick 的架构设计,揭示如何用 RP2040 PIO 与 DMA 协同实现 60 Msps 采样,替代传统 FPGA 定时方案。

2026-05-14systems

超声波脉冲回波采集长期依赖 FPGA 提供精确时序控制,导致入门门槛高、硬件成本昂贵。pic0rick 项目通过巧妙的 RP2040 PIO 状态机与 DMA 协同设计,在无需 HDL 知识的前提下实现了与 FPGA 方案相当的采集性能。本文深入剖析其信号链路的每一环节,从脉冲发射、TGC 增益控制到 ADC 采样与 DMA 传输,提供可直接落地的工程参数与调优策略。

架构演进:从 FPGA 到 RP2040 的路径选择

pic0rick 的设计哲学源于一个核心矛盾:超声波 A-scan 采集需要在微秒级精度上协调脉冲发射与回波采样,同时还要处理可变增益放大与数据传输。传统 FPGA 方案(如 un0rick 使用 Lattice iCE40 HX4K/HX8K)能提供精确的时钟域控制,但需要开发者掌握 Verilog 或 VHDL,并且每次修改时序参数都要重新综合,迭代周期长。RP2040 的出现提供了第三条路:其内置的 Programmable I/O(PIO)子系统可以在系统时钟(133 MHz)下运行确定性状态机代码,精度达到约 7.5 纳秒,足以覆盖大多数教育级和 NDT 场景的时序需求。

项目演进历程印证了这一选择的有效性。从 2016 年的 Murgen 原型机到 2024 年的 pic0rick,团队经历了 FPGA 方案(un0rick、lit3rick)的大量实践,最终在 RP2040 上找到了成本、复杂度和性能的最佳平衡点。关键转变在于认识到:对于单元素探头脉冲回波采集,不需要复杂的并行数据处理,核心需求是精确的触发 - 采样时序控制,而 PIO 状态机恰好擅长此类任务。RP2350 作为后续兼容平台,进一步扩展了 DMA 通道数量和内存寻址空间,为更长的采集窗口提供了硬件基础。

从系统分区角度看,pic0rick 将功能划分为三个独立模块:主板(核心采集)、pulser 板(脉冲生成)和 HV 板(高压供电)。这种模块化设计使得高压电路与低压数字电路物理隔离,既保障了安全性,也简化了调试 —— 你可以先用低压信号源测试主板功能,后续再接入完整的 pulser 链路。

信号链路深度解析:每一级的作用与选型依据

脉冲发射链路:三级 pulser 的电路设计

脉冲发射链路从 RP2040 的 GPIO 输出触发信号开始,经过 MD1210 高性能栅极驱动器与 TC6320 高压 MOSFET 的组合,产生三电平脉冲。设计选择三电平脉冲(正电压、负电压、地)而非简单的单极性脉冲,核心目的是优化探头带宽与发射效率。正负交替的激励波形能够在探头两端产生更大的压差,激励探头产生更宽频谱的超声波,同时减少直流分量对探头的不必要加热。

MD1210 在此处的关键作用是提供快速边沿和足够的驱动能力 —— 它能够在 20 ns 内完成电平切换,驱动容性负载(如探头阻抗约 1-10 kΩ 对应的寄生电容)而不产生明显的振铃。TC6320 作为 30V N 沟道 MOSFET,在 HV 板提供的 ±25 V 电源轨下能够输出峰值电流达数安培的脉冲驱动信号。设计中的输入保护二极管将正向电压钳位在安全范围,防止探头意外反接或静电放电损坏后级电路。

从固件层面看,脉冲参数(脉冲宽度、重复频率)通过修改 PIO 程序中的时序寄存器实现,无需重新编译整个 FPGA 比特流。对于教学场景,这种灵活性意味着学生可以直观地观察脉冲宽度变化如何影响回波频谱 —— 缩短脉冲宽度会扩展频谱但降低能量,延长脉冲宽度则相反。典型脉冲重复频率(PRF)在 1-10 kHz 之间选择,受限于超声波在传播介质中的往返时间:A-scan 模式下,必须确保最深探测距离对应的回波时间小于下次发射前的空闲窗口。

TGC 放大链路:AD8331 与 SPI DAC 协同控制

回波信号返回后的第一个处理模块是 AD8331 可变增益放大器,这是整个接收链路的核心动态范围管理器。超声波在传播过程中遵循平方衰减定律:距离每增加一倍,信号强度下降 6 dB。对于典型 10 cm 深度检测场景,探头表面的最强反射信号与最深目标的弱回波之间可能相差 40-60 dB。AD8331 提供的 48 dB 连续增益范围(7.5 dB 到 55.5 dB)正好覆盖这一需求,配合时间增益补偿(TGC)逻辑,能够在不同深度的采样点上动态调整放大倍数,使弱信号得到足够放大,而强信号不会饱和 ADC 输入范围。

AD8331 的增益控制通过引脚电压实现,而 pic0rick 采用 MCP4812 SPI DAC 生成这个控制电压。MCP4812 是 10 位双通道 DAC,通过 RP2040 的 SPI 接口以软件方式更新增益值。TGC 曲线的设计需要根据具体应用场景调整:对于均匀介质(如水箱或生物组织仿体),可以使用线性或对数递增的增益曲线;对于界面复杂的检测场景,可能需要预置多个增益配置文件供用户选择。固件中典型做法是每隔 N 微秒(对应超声传播中的某个深度增量)更新一次 DAC 值,形成阶梯状或连续上升的 TGC 包络。

需要特别注意的是,AD8331 的输入阻抗约 1 kΩ,与探头输出以及 ADC 输入形成级联阻抗网络。高频采样(60 Msps)意味着输入带宽必须足够宽,否则会损失高频回波成分。设计中的 HV 保护电路(采用二极管钳位)虽然限制了输入电流,但也在高频段引入了一定的寄生电容,这是后续优化中可以关注的点 —— 使用更低电容的保护器件或增加缓冲级可以改善高频响应。

ADC 采样链路:60 Msps 的时序与带宽权衡

pic0rick 使用的 60 Msps 10 位 ADC 是整个系统的性能瓶颈,也是技术亮点所在。60 Msps 采样率对于 5 MHz 探头意味着每个超声周期有 12 个采样点,满足奈奎斯特准则且留有足够余量进行后续数字滤波。对于 2.5 MHz 低频探头,这个采样率可以捕获更丰富的波形细节,支持更精确的到达时间估计。

ADC 与 RP2040 的接口采用并行或高速串行(取决于具体型号)方式连接到 PIO 状态机。关键设计点在于:ADC 输出数据直接流入 DMA 通道的目的地 SRAM 缓冲区,CPU 核心在数据填充期间无需干预 —— 这被称为 "盲采样" 模式,CPU 可以同时执行其他任务(如实时显示、数据预处理或通信)。RP2040 的 DMA 控制器支持链式传输和多缓冲区切换,允许配置为 ping-pong 双缓冲模式:当一个缓冲区填充完毕时自动切换到另一个,CPU 处理完第一个缓冲区后再切换回来,最大限度减少数据丢失。

对于 RP2350,其 DMA 控制器进行了架构升级,支持更灵活的寻址模式(包括字节、半字、字混合访问)和更长的传输长度。这直接影响到可采集的最大深度窗口:假设超声波在钢中传播速度约 6,000 m/s,对应每微米深度需要 0.167 ns 往返时间;60 Msps 采样间隔为 16.67 ns,可探测的最大无模糊距离约为 50 米(受脉冲重复频率限制),实际可采集的样本点数由缓冲区大小决定 —— 典型配置下可达数千点,足够覆盖大多数 NDT 检测场景。

PIO 与 DMA 协同:确定性时序的软件定义

PIO 状态机的角色:精准定时与信号同步

RP2040 的 PIO 子系统是该设计成功的关键。不同于通用 CPU 核心执行指令时存在的中断延迟和流水线停顿,PIO 状态机以硬件方式执行简化的指令集,每个指令周期精确等于一个系统时钟周期(133 MHz 下约 7.5 ns)。对于 ADC 采样,开发者编写一段 PIO 程序,定义何时拉高触发线、等待多长时间后启动 DMA、采样持续多久后停止 —— 这些时序约束全部由状态机硬件保证,不受 CPU 负载影响。

pic0rick 固件中,PIO0 专门负责采集时序:它产生脉冲触发信号、监控触发完成后的等待间隔、在精确时刻启动 DMA 接收 ADC 数据流。PIO1 则可配置为输出 VGA 显示信号(通过扩展板实现),用于实时显示采集波形。两个 PIO 单元各有 4 个状态机实例,总计 8 个独立执行的定时序列,足够应对复杂的多探头或阵列采集场景。

从调试角度,PIO 程序可以通过连接逻辑分析仪观察 GPIO 引脚波形来验证。典型问题是触发信号与采样窗口之间的偏移 —— 如果 PIO 程序中存在未预料的等待周期,会导致采集窗口偏离预期深度范围。开源社区提供了用于 Saleae 或 Sigrok 逻辑分析仪的协议解码器,可以将采集的 GPIO 数据直接导入 Python 脚本进行分析。

DMA 配置:环形缓冲区与阈值中断

DMA 配置的核心参数包括:源地址(ADC 数据寄存器)、目的地址(SRAM 缓冲区)、传输宽度(通常为 1 字节或 2 字节,取决于 ADC 位宽)、步进值(连续地址递增)、传输总数(缓冲区大小)。对于 60 Msps 的持续数据流,DMA 需要以相同或更高的速率完成写入操作 ——RP2040 的 DMA 理论峰值带宽为单次传输 1-2 周期,实际在 133 MHz 系统时钟下可以轻松满足 60 Msps 的需求。

双缓冲策略的实现方式是配置 DMA 控制器产生中断:当第一个缓冲区填充到指定阈值(如半满)时触发中断,CPU 在中断处理程序中切换 DMA 目的地址到第二个缓冲区,然后开始处理第一个缓冲区的数据。这种乒乓操作将数据采集与数据处理并行化,代价是增加了软件复杂度。对于延迟敏感的场景(如实时显示),可以在 DMA 完成后直接通过 USB 批量传输而不经过 CPU 缓冲区。

从资源占用的角度,60 Msps 采样率、10 位 ADC 对应每秒 60 MB 原始数据量。RP2040 的 264 KB SRAM 只能容纳约 4 ms 的数据,因此必须及时通过 USB 传输或存储到外部存储设备。pic0rick 的设计选择是通过 USB 串口传输,典型吞吐量约 10-20 MB/s,足以支持降采样后的实时波形显示;完整原始数据的存储则需要 PSRAM 扩展板支持。

固件调度:双核协同与任务划分

RP2040 的双核设计为固件架构提供了灵活的分工选择。推荐的做法是:Core 0 专门负责 PIO 和 DMA 的配置与中断处理,确保时序关键代码不被其他任务抢占;Core 1 处理数据后处理(如带通滤波、包络检波)和通信协议。这种划分确保了即使 Core 1 负载波动,Core 0 仍能保持稳定的采集时序。

固件开发采用类似 Arduino 的环境,基于树莓派官方的 Pico SDK。开发者可以调用高级 API 配置 PIO 程序和 DMA 通道,无需直接编写 PIO 汇编指令;对于高级定制场景(如需要精确控制每个状态机指令周期),可以直接编辑 .pio 文件中的汇编代码。pic0rick 的 GitHub 仓库提供了多个参考例程,涵盖基本脉冲回波采集、TGC 动态增益控制和实时显示集成。

工程实践:关键参数配置清单

采样参数初始配置

对于未接触过超声波采集的开发者,以下是推荐的首次实验参数:脉冲宽度设为 2-3 个超声周期(对应 5 MHz 探头约 400-600 ns),脉冲重复频率从 1 kHz 开始以确保足够的数据采集间隔。TGC 初始增益设为中间值(约 30 dB),在观察到饱和时降低增益,在浅层信号信噪比不足时提高增益。DMA 缓冲区大小设为 4096 字节(对应约 68 μs 采样窗口),通过 USB 批量传输每 100 ms 更新一次显示。

对于不同探头频率的选择:如果使用 2.25 MHz 低频探头(常用于金属探伤),采样率 60 Msps 提供每周期 26.7 个采样点,建议将前段增益调低以避免表面反射饱和。如果使用 10 MHz 高频探头(用于分辨率要求高的浅层检测),注意探头带宽是否支持 60 Msps 对应的 30 MHz 采样时钟 —— 部分老旧探头的高频响应不足会在采样点间产生混叠。

信号质量评估与常见问题排查

ADC 输入端出现饱和是最常见的问题 —— 表现为波形顶部被截断,呈现平顶而非正弦形状。解决方案包括:降低 TGC 增益、检查探头与被测物体之间是否存在强反射界面(如空气 - 金属界面)、在探头上涂抹适量耦合剂以减少界面反射。对于 TGC 链路故障排查,应先验证 MCP4812 DAC 输出电压是否随固件更新而变化 —— 如果增益值不变但预期采样窗口内有信号衰减,说明 TGC 控制链路存在问题。

DMA 传输错误(如缓冲区覆盖导致的数据混乱)通常表现为波形沿时间轴抖动或周期性重复。排查方向包括:确认 DMA 完成中断能够被 CPU 正确响应、验证双缓冲区切换逻辑的原子性(避免在切换过程中触发新的中断)、检查 USB 传输延迟是否导致缓冲区溢出。如果使用 RP2350,还应关注其增强型 DMA 功能与旧代码的兼容性 —— 部分 DMA 通道配置参数在两个平台上有细微差异。

扩展板选型建议

VGA 扩展板通过 PIO1 输出 RGB 信号到显示器,适合需要现场实时显示波形曲线的教学演示场景。由于 PIO1 被 VGA 输出占用,在此模式下无法同时使用其他 PIO 扩展功能(如多路复用器切换),设计时需要权衡功能需求。

MUX 扩展板支持将脉冲信号切换到多个探头,实现多探头轮询采集或简易阵列成像。对于阵列成像应用,切换速度受继电器或模拟开关响应时间限制,通常在毫秒量级,适合静态目标的成像而非实时动态检测。PSRAM 扩展板提供额外的存储容量,可将原始数据先暂存到外部 SRAM,再批量传输到上位机处理,有效缓解 USB 带宽瓶颈。

开源硬件的设计哲学与社区价值

pic0rick 项目代表了一种重要的开源运动方向:将高成本的工业检测设备拆解为可复现的教育套件。通过在 GitHub 公开完整的 KiCad 设计文件、BOM 表和固件源码,任何人都能够从零开始制作自己的超声波采集平台。OSHWA 认证(FR000023)不仅是对项目规范性的认可,也便于在商业场景中引用和追溯。

项目配套的 30 多篇学术论文引用证明了其在研究社区的认可度。研究者基于 pic0rick 开发了改进的成像算法、新的探头接口协议和定制化的信号处理流程,这些改进又以 pull request 的形式回馈到主仓库,形成良性的技术迭代循环。对于系统工程师而言,这种 "可观测、可复现、可改进" 的特性正是现代工程教育所欠缺的环节 —— 学生不仅学习理论公式,还能亲手调试一个真实的物理采样系统,理解从传感器物理到数字信号处理的完整链路。

资料来源:pic0rick 硬件规格与架构文档(https://un0rick.cc/pic0rick)、GitHub 仓库(https://github.com/kelu124/pic0rick)。

systems

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com