ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

FPGA+STM32脉冲线性调频雷达系统设计与实现

FPGA+STM32脉冲线性调频雷达系统设计与实现 1. 项目缘起与整体设计思路PLFM_RADAR 这个名字第一次看到的时候我脑子里蹦出来的就是 Pulse Linear Frequency Modulation Radar也就是脉冲线性调频雷达。说白了就是一套自己动手搭的雷达信号处理系统核心是用 FPGA 做高速信号采集和预处理再用 STM32 做系统控制、数据管理和人机交互。这个组合在雷达、测距、测速、成像这类场景里非常经典属于“高速前端 灵活主控”的典型架构。我之所以对这个项目感兴趣是因为它把几个热门技术点全串起来了phased array相控阵、FPGA 高速 ADC 采样、DDR 多端口读写、STM32 USB 设备、CAN 通信、定时器捕获测频率、ILI9341 显示等等。这些关键词单独拎出来都是独立的技术模块但放在一个雷达项目里它们必须协同工作时序、带宽、功耗、成本都要平衡。这也是为什么我觉得这个项目值得深挖——它不是简单的模块堆砌而是一个完整的信号链系统工程。从整体设计上看PLFM_RADAR 的核心思路可以拆成三条线。第一条是射频前端与天线负责发射线性调频信号并接收回波相控阵在这里的作用是通过多个天线单元的相位控制实现波束扫描不用机械转动就能覆盖一定空域。第二条是高速数据采集与预处理FPGA 在这里承担主力因为线性调频雷达的带宽通常比较大中频采样率动辄几十兆甚至上百兆STM32 的 ADC 根本扛不住必须用 FPGA 挂高速 ADC 做实时采样再通过数字下变频、匹配滤波或者 FFT 把原始数据压缩成有用的距离信息。第三条是系统控制与数据交互STM32 负责配置 FPGA 的工作参数、管理 DDR 缓存、跑 USB 或 CAN 跟上位机通信、驱动显示屏做本地可视化。这个架构的好处很明显FPGA 做它擅长的高速并行处理STM32 做它擅长的控制和协议栈两者通过 SPI、FSMC 或者并口通信各司其职。如果全用 FPGA 做开发周期长软核处理器跑协议栈也麻烦如果全用 STM32 做采样率和处理能力又不够。所以这个分工是经过实际工程验证的合理选择。提示如果你打算复现类似项目先明确你的雷达体制。脉冲线性调频和连续波调频在硬件架构上差别很大前者需要收发开关和脉冲时序控制后者更依赖隔离度和线性度。PLFM_RADAR 从名字看更偏向脉冲体制所以收发切换的时序设计是第一个要啃的硬骨头。2. 核心模块拆解与关键技术点2.1 相控阵天线与波束控制相控阵这部分很多人一开始会觉得离自己很远觉得那是军工或者大厂才玩的东西。其实用低成本方案也能做出简易的相控阵验证平台。核心原理就是每个天线单元后面挂一个移相器通过控制每个通道的相位差让合成波束指向特定方向。相位差的计算公式是 Δφ 2πd sinθ / λ其中 d 是阵元间距θ 是波束指向角λ 是波长。在实际操作中阵元间距通常取半波长这样可以避免栅瓣。比如你的工作频率是 2.4GHz波长约 12.5cm阵元间距就是 6.25cm。如果你用 4 阵元线阵波束宽度大约在 30 度左右扫描范围受限于阵元方向和互耦。移相器可以用数字移相芯片也可以用 FPGA 控制 DAC 产生模拟相位控制电压后者成本更低但精度和一致性需要校准。我在测试中发现相控阵最容易被忽视的是通道间幅度和相位的一致性。哪怕你相位算得再准如果每个通道的增益不一致波束指向也会偏移旁瓣也会抬高。所以校准环节不能省通常需要在暗室或者开阔场做一次通道校准把每个通道的幅度和相位误差测出来然后在 FPGA 里做补偿。2.2 FPGA 高速 ADC 采样与数据预处理FPGA 在这个项目里干的活最重。线性调频雷达的中频信号通常在一个比较高的频率上比如 60MHz 或者 120MHz根据奈奎斯特采样定理采样率至少要两倍于最高频率分量。实际工程中为了留裕量采样率往往是信号带宽的 2.5 到 4 倍。假设你的 LFM 信号带宽是 20MHz中频是 60MHz那最高频率分量大概在 70MHz 左右采样率选 200Msps 就比较稳妥。高速 ADC 和 FPGA 之间的接口通常是 LVDS 或者 JESD204B。LVDS 在中等采样率下很常见布线要注意差分对等长和阻抗匹配。JESD204B 更高速但协议复杂需要专门的 IP 核。对于 PLFM_RADAR 这种项目如果采样率在 200Msps 以内LVDS 接口的 ADC 比如 AD9233 或者 ADS4149 就够用了FPGA 端用 IBUFDS 加 IDDR 原语接收再送进 FIFO 做跨时钟域处理。数据预处理部分FPGA 通常要做数字下变频DDC和抽取。DDC 就是把中频信号搬移到基带方便后续做低通滤波和降采样。具体做法是用 NCO 产生正交本振信号跟 ADC 采样数据做复数乘法得到 I/Q 两路基带信号。然后通过 CIC 滤波器或者 FIR 滤波器做抽取把数据率降下来减轻后续处理压力。这里有个坑我踩过NCO 的频率字计算要非常小心。假设系统时钟是 200MHz你想产生 60MHz 的本振频率字就是 round(60e6 / 200e6 * 2^32)。如果频率字算错下变频后的信号会偏后续匹配滤波就对不上。建议在 MATLAB 或者 Python 里先仿真验证频率字再写到 FPGA 里。2.3 DDR 多端口读写与缓存管理FPGA 采集完的数据不能一直放在片内 RAM 里因为片内 BRAM 容量有限通常只有几兆比特。雷达一帧的数据量可能几十兆字节必须外挂 DDR 做缓存。DDR 的带宽很高但控制逻辑复杂尤其是多端口读写的时候多个模块同时请求访问 DDR仲裁没做好就会丢数据或者时序违例。常见的做法是用 Xilinx 的 MIG 或者 Intel 的 UniPHY 生成 DDR 控制器然后在上面挂一个 AXI 互联矩阵把多个 AXI Master 接到 DDR 控制器上。每个 Master 对应一个数据流比如 ADC 写入流、FFT 读取流、STM32 读取流。AXI 互联会自动做仲裁但你需要给每个 Master 设置合理的优先级和突发长度。实测下来DDR 的带宽利用率能到 70% 到 80% 就算不错了。如果你发现带宽不够先检查突发长度是不是太短AXI 的突发长度建议至少 64 拍最好 128 拍。另外读写切换太频繁也会降低效率尽量把读操作和写操作分开批量处理。注意DDR 的引脚分配和时序约束非常关键尤其是 DQS 和 DQ 之间的 skew。如果你用的是自己画的板子一定要做信号完整性仿真否则调 DDR 会调到怀疑人生。我第一次调 DDR 的时候因为 DQS 和 DQ 的走线长度差了 200mil数据眼图几乎闭合后来重新等长才解决。2.4 STM32 系统控制与通信接口STM32 在这个项目里扮演的是“管家”角色。它不直接处理高速数据但负责整个系统的调度上电初始化、配置 FPGA 寄存器、监控温度和工作电压、管理 USB 或 CAN 通信、驱动本地显示屏。STM32 的选型要看你的接口需求如果要用 USB 做设备通信F4 或者 F7 系列比较合适因为它们的 USB OTG 控制器支持高速模式配合 DMA 能跑到几十兆字节每秒。USB 设备开发这块STM32 的 HAL 库已经封装得比较好了但有几个地方容易出问题。第一是端点缓冲区分配如果你用 CDC 类做虚拟串口端点缓冲区大小要跟主机端的驱动匹配否则会出现数据截断。第二是 DMA 和 USB 中断的优先级USB 中断优先级要高于 DMA否则高速传输时容易丢包。第三是枚举过程如果你自己写描述符VID 和 PID 不要跟系统里已有的设备冲突否则枚举会失败。CAN 通信在雷达系统里也很有用尤其是多雷达组网或者跟其他车载设备通信的时候。STM32 的 CAN 控制器支持标准帧和扩展帧波特率可以到 1Mbps。但 CAN 有个坑总线终端电阻必须匹配两端各 120 欧姆中间节点不能加。如果通信突然连不上先查终端电阻再查波特率配置最后查收发器的供电和使能引脚。2.5 本地显示与数据可视化ILI9341 是一块很常见的 2.4 寸或 2.8 寸 TFT 屏分辨率 240x320SPI 接口STM32 驱动起来不难。但雷达数据显示跟普通 UI 不一样你需要实时刷新距离-多普勒图或者 A 显。如果每帧都全屏刷新SPI 的带宽根本不够屏幕会闪得厉害。我的做法是只刷新变化区域把雷达数据映射到屏幕的特定区域用 DMA 把像素数据直接搬到 SPI 数据寄存器减少 CPU 干预。另外ILI9341 的读 ID 是 0xA1A1 还是其他值取决于厂家有些兼容芯片会返回不同的 ID。如果你读到的 ID 不对先检查 SPI 模式ILI9341 通常用 Mode 0 或 Mode 3再检查复位时序复位脉冲宽度至少 10 微秒。3. 实操流程与关键环节实现3.1 硬件选型与板级设计先说 FPGA 选型。PLFM_RADAR 这种项目逻辑资源不用太大但 DSP 切片和 BRAM 要够用。Xilinx Artix-7 系列的 XC7A100T 或者 XC7A200T 是比较平衡的选择DSP48E1 切片有几百个做复数乘法、FIR 滤波、FFT 都够。如果你预算有限Spartan-6 或者安路 FPGA 也能跑但开发工具和 IP 核的丰富程度差一些。STM32 这边我推荐 STM32F407 或者 STM32F767。F407 便宜USB OTG 和 CAN 都有主频 168MHz跑控制逻辑绰绰有余。F767 主频更高带 LCD-TFT 控制器可以直接驱动 RGB 屏不用 SPI 慢慢刷。如果你要用 USB 高速模式记得选带 ULPI 接口的型号外挂 USB PHY 芯片。ADC 选型要看你的中频和带宽。AD9233 是 12 位 125MspsLVDS 输出性价比很高。如果你需要更高采样率ADS4149 是 14 位 250Msps但功耗和价格都上去了。DAC 这边如果你要自己产生 LFM 信号AD9767 是 14 位 125Msps双通道可以产生 I/Q 两路。电源设计容易被忽视。FPGA 和 ADC 对电源噪声很敏感尤其是 ADC 的模拟电源一定要用 LDO 单独供电不要跟数字电源混在一起。DDR 的电源也要干净VREF 和 VTT 要加足够的去耦电容。我见过一个案例ADC 的电源纹波大了 50mV结果信噪比直接掉了 6dB。3.2 FPGA 逻辑设计与时序约束FPGA 逻辑设计的第一步是画框图。我习惯把整个逻辑分成几个独立的模块ADC 接口模块、DDC 模块、DDR 控制模块、FFT 模块、STM32 通信模块。每个模块单独仿真验证最后再集成。ADC 接口模块的关键是 IDDR 和 ISERDES 的使用。如果你用 LVDS 接口数据是双沿传输的需要用 IDDR 原语把上升沿和下降沿的数据分开再拼成完整的采样字。时序约束要设置输入延迟根据 ADC 的输出时序参数和 PCB 走线延迟来算。如果约束不对数据会错位表现为频谱上出现杂散。DDC 模块里NCO 用 Xilinx 的 DDS Compiler 生成输出正弦和余弦两路。复数乘法用 DSP48 实现注意位宽要留够否则会溢出。CIC 滤波器的抽取因子和阶数要根据你的带宽和采样率来定。比如采样率 200Msps你要降到 1Msps抽取因子就是 200。CIC 的阶数一般取 3 到 5 阶阶数越高阻带衰减越好但通带衰减也越大需要后级 FIR 做补偿。FFT 模块用 Xilinx 的 FFT IP 核配置成流水线模式点数根据你的距离分辨率要求来定。比如你要 1 米的分辨率光速 3e8 m/s带宽 150MHz距离分辨率是 c/(2B) 1 米。FFT 点数至少要是采样点数的两倍避免频谱混叠。提示FPGA 的时序约束文件XDC 或 SDC一定要认真写尤其是跨时钟域路径。我见过太多项目因为 CDC 没处理好跑起来偶尔出错查了好几天才发现是亚稳态。建议所有跨时钟域信号都加两级同步器数据总线用异步 FIFO。3.3 STM32 固件开发与协议实现STM32 固件我习惯用 CubeMX 生成初始化代码然后手写业务逻辑。USB CDC 类直接用 HAL 库的例程改注意把缓冲区设大一点比如 1024 字节减少中断频率。如果你要传雷达数据到上位机建议自定义一个简单的协议帧头 长度 数据类型 数据 校验。帧头用 0xAA55 这种不容易冲突的值校验用 CRC16。CAN 通信的初始化要注意波特率计算。STM32 的 CAN 波特率 APB1 时钟 / (分频系数 * (1 BS1 BS2))。比如 APB1 是 42MHz你要 500kbps分频系数取 6BS1 取 10BS2 取 3算下来就是 42e6 / (6 * (1 10 3)) 500k。如果算错了通信会不稳定或者完全连不上。ILI9341 的驱动我建议用硬件 SPI 加 DMA不要用软件模拟 SPI太慢。初始化序列要严格按照数据手册来尤其是电源控制和伽马校正少写一条都可能显示异常。如果你读 ID 是 0xA1A1说明是兼容芯片初始化序列可以通用但伽马值可能需要微调。3.4 系统联调与性能测试联调阶段最考验耐心。我的顺序是先单独测电源确认各路电压正常再测 FPGA 配置用 LED 或者串口打印确认 FPGA 跑起来了然后测 ADC 采样用信号发生器输入单音信号看 FPGA 抓到的数据频谱对不对接着测 DDR 读写用伪随机数写入再读出比对是否正确最后测 STM32 跟 FPGA 的通信确认寄存器读写正常。性能测试主要看几个指标距离分辨率、测距精度、测速范围、信噪比。距离分辨率取决于信号带宽测距精度取决于信噪比和插值算法测速范围取决于脉冲重复频率。如果你发现信噪比不够先查 ADC 的输入匹配网络再查 DDC 的滤波器系数最后查 FFT 的窗函数。4. 常见问题与排查技巧实录4.1 FPGA 相关故障速查现象可能原因排查方法FPGA 配置失败配置时钟不对、配置模式引脚接错用示波器看 CCLK 和 DIN 波形检查 M[2:0] 引脚ADC 数据错位LVDS 时序约束不对、走线不等长用 ILA 抓 IDDR 输出对比已知测试图案DDR 读写错误时序约束不满足、VREF 不稳跑 MIG 的自带测试检查 VREF 电压和去耦FFT 结果异常输入数据位宽不够、缩放因子不对用 MATLAB 对比仿真结果检查 IP 核配置跨时钟域数据丢失没加同步器或 FIFO 深度不够用 ILA 抓 CDC 路径增加同步级数或 FIFO 深度4.2 STM32 相关故障速查现象可能原因排查方法USB 枚举失败描述符错误、VID/PID 冲突用 USB 分析仪抓包检查描述符和供电CAN 通信连不上终端电阻不匹配、波特率错误测总线电阻用示波器看 CAN_H 和 CAN_L 差分波形SPI 读 ILI9341 ID 不对SPI 模式错误、复位时序不对检查 CPOL 和 CPHA延长复位脉冲定时器捕获测频不准输入滤波没开、预分频不对配置输入捕获滤波检查 ARR 和 PSC 计算延时函数卡死中断优先级冲突、SysTick 配置错误检查中断嵌套用示波器看 SysTick 计数4.3 独家避坑经验第一个坑是电源上电顺序。FPGA 和 ADC 对电源上电顺序有要求通常核心电压先上IO 电压后上否则会有闩锁风险。我建议用电源管理芯片做时序控制或者至少加一个 RC 延时电路。第二个坑是DDR 的 VREF 电压。VREF 应该是 VDDQ 的一半但实际中因为电阻分压的精度和温漂VREF 可能偏了 几十毫伏。这个偏差会导致 DDR 读写误码率上升。我的做法是用一个高精度基准源产生 VREF而不是简单电阻分压。第三个坑是STM32 的 USB 中断优先级。如果你把 USB 中断优先级设得比 DMA 低高速传输时 USB 中断会被 DMA 打断导致数据包丢失。正确的做法是 USB 中断优先级设为最高DMA 次之其他外设再低一些。第四个坑是FPGA 的复位脚。FPGA 没有固定的复位脚复位逻辑都是你自己写的。我建议用一个外部复位芯片比如 MAX811产生干净的复位脉冲再送到 FPGA 的普通 IO。不要用配置完成信号当复位因为配置完成后电源可能还没稳。第五个坑是相控阵的通道校准。如果你不做校准波束指向误差可能超过 10 度。校准的方法很简单在远场放一个信号源依次测量每个通道的幅度和相位然后在 FPGA 里做补偿。补偿系数可以存在 Flash 里上电时加载。5. 项目扩展与进阶方向PLFM_RADAR 这个框架搭好之后可以往几个方向扩展。第一个方向是增加通道数做真正的多通道相控阵这需要更多的 ADC 和更大的 FPGA但波束形成算法是一样的。第二个方向是提高带宽换更高采样率的 ADC 和更快的 FPGA距离分辨率可以做到厘米级。第三个方向是加入成像算法比如合成孔径或者逆合成孔径这需要更复杂的运动补偿和成像处理。如果你想把雷达数据传到手机或者云端可以在 STM32 上加一个无线模块比如 4G Cat.1 或者 LoRa。但要注意数据率和功耗的平衡雷达原始数据率很高必须先做压缩或者特征提取再上传。我在实际使用中发现PLFM_RADAR 最值得投入时间的地方是校准和测试。硬件搭起来只是第一步真正决定性能的是校准精度和测试覆盖度。我建议至少花 30% 的时间在测试上包括单元测试、集成测试和现场测试。现场测试尤其重要因为实验室环境和实际环境差别很大多径、干扰、温度都会影响性能。最后再分享一个小技巧如果你用 VSCode 开发 STM32可以装 Cortex-Debug 插件配合 J-Link 做在线调试比 Keil 的调试体验好很多。launch.json 里配置好 svd 文件路径就能在调试时查看所有外设寄存器非常方便。FPGA 这边Vivado 的 ILA 和 VIO 是调试利器但要注意 ILA 的采样深度和时钟域采样太深会吃光 BRAM时钟域不对会抓不到数据。
返回列表