1. 项目缘起与整体设计思路PLFM_RADAR 这个名字拆开看PLFM 大概率是 Pulse Linear Frequency Modulation脉冲线性调频的缩写也就是我们常说的线性调频脉冲雷达。这类雷达体制在测距和测速上有一套非常成熟的数学基础核心思想是把一个频率随时间线性变化的信号发射出去遇到目标反射回来之后和本振信号做混频得到一个差频信号。这个差频信号的频率和目标的距离成正比而多普勒频移则对应目标的速度。听起来简单但真正把它做成一个能跑起来的系统涉及的知识面非常宽射频前端、高速 ADC 采样、FPGA 实时信号处理、STM32 系统控制与人机交互每一块都有各自的坑。我之所以选择 FPGA STM32 这个双核架构而不是用一颗高性能 DSP 或者纯 FPGA 方案是经过实际权衡的。FPGA 的优势在于并行处理和确定性时序做数字下变频、FFT、CFAR 检测这些运算时可以做到流水线全速跑延迟可控。而 STM32 的优势在于丰富的外设接口、成熟的生态和较低的控制逻辑开发成本适合做系统调度、参数配置、结果显示和上位机通信。两者通过 SPI 或者 FSMC 总线连接FPGA 负责“算”STM32 负责“管”分工明确各司其职。这个项目的目标很明确做一个完整的、可复现的线性调频脉冲雷达原型系统能够实现目标测距、测速的基本功能并且把整个信号链路的参数都开放出来方便调整和实验。适合的读者是有一定 FPGA 和 STM32 基础想找一个综合性项目来打通“信号采集—实时处理—系统控制”全链路的开发者。如果你之前做过 FPGA 高速 ADC 采样、STM32 项目开发但还没把它们串成一个完整的雷达系统那这个项目就是为你准备的。整个系统的信号链是这样的FPGA 控制 DAC 或者 DDS 芯片产生线性调频信号经过射频前端发射出去接收端把回波信号放大、滤波后送到高速 ADC 进行采样FPGA 对采样数据进行数字下变频、低通滤波、抽取然后做 FFT 得到距离-多普勒二维谱STM32 通过总线读取处理结果做点迹凝聚、目标跟踪最后在 LCD 上显示或者通过串口传到上位机。这个链路里FPGA 和 STM32 的协同工作是关键数据怎么传、什么时候传、传什么格式都需要仔细设计。2. 核心细节解析与实操要点2.1 线性调频信号的参数计算与生成线性调频信号的核心参数有三个带宽 B、脉冲宽度 T、调频斜率 K B/T。这三个参数决定了雷达的距离分辨率和最大探测距离。距离分辨率 ΔR c/(2B)其中 c 是光速。假设我们要做到 0.5 米的分辨率那么 B c/(2ΔR) 3e8/(2*0.5) 300 MHz。这个带宽对 ADC 采样率的要求就很高了根据奈奎斯特采样定理采样率至少要是带宽的两倍也就是 600 MSPS 以上。实际工程中我们通常会采用带通采样或者数字下变频的方式把中频信号降到基带再处理这样对 ADC 的要求可以适当降低。在实际项目中我用的是一块 AD9361 射频捷变收发器它内部集成了 12 位 ADC 和 DAC采样率可以到 61.44 MSPS通过数字下变频可以把中频信号搬到基带。FPGA 这边用 DDS IP 核产生线性调频信号通过 SPI 配置 AD9361 的发射通道。DDS 的相位累加器位宽选 32 位频率控制字根据调频斜率和系统时钟计算。假设系统时钟 100 MHz调频斜率 K 1e12 Hz/s那么每个时钟周期的频率增量就是 K/100e6 10000 Hz对应的频率控制字就是 10000 * 2^32 / 100e6 ≈ 429497。这个计算过程看起来简单但实际调试时DDS 的输出频率范围要受限于 DAC 的采样率和模拟前端的带宽不能无限制地往上调。注意DDS 输出信号的杂散性能很依赖相位累加器的位宽和查找表的精度。如果发现频谱上有明显的杂散优先检查查找表的地址位宽是否足够以及是否有相位截断误差。2.2 FPGA 端数字信号处理链路设计FPGA 端的处理链路是整个系统的核心直接决定了雷达的实时性能。我把它分成四级流水线第一级是数字下变频把 ADC 采样的中频信号乘以本振信号搬移到基带第二级是低通滤波和抽取降低数据率减轻后续 FFT 的运算压力第三级是加窗和 FFT得到距离维的频谱第四级是 CFAR 检测和点迹提取。数字下变频用两个乘法器分别乘以 cos 和 sin 本振得到 I/Q 两路信号。本振频率要和发射信号的载频保持一致否则会有固定的频偏。低通滤波器的截止频率要略大于信号带宽的一半抽取因子根据数据率来定。假设 ADC 采样率 61.44 MSPS信号带宽 20 MHz那么抽取因子可以取 8抽取后数据率降到 7.68 MSPSFFT 的点数取 1024频率分辨率就是 7.5 kHz。这个分辨率对应的距离分辨率是 c/(2B) 3e8/(220e6) 7.5 米对于近距离探测来说够用了。FFT 用 Xilinx 的 FFT IP 核配置成 1024 点、流水线模式、自然顺序输出。加窗用汉明窗目的是抑制旁瓣减少强目标对弱目标的掩盖。CFAR 检测用单元平均恒虚警参考单元数取 16保护单元数取 4门限因子根据虚警率来定。这些参数在实际调试时都需要根据场景调整没有一套放之四海而皆准的配置。2.3 STM32 系统控制与数据交互STM32 在这个项目里扮演的是“管家”角色负责初始化 FPGA、配置雷达参数、读取处理结果、驱动 LCD 显示、通过串口和上位机通信。我选的是 STM32F407主频 168 MHz带 FSMC 接口可以和 FPGA 的并行总线直接对接。FSMC 配置成 SRAM 模式地址线和数据线分开读写时序根据 FPGA 端的时序要求调整。实测下来FSMC 的读写速度可以到 20 MB/s 左右对于传输点迹数据来说绰绰有余。STM32 和 FPGA 之间的数据交互协议我设计得比较简单FPGA 处理完一帧数据后拉高一个中断引脚STM32 收到中断后通过 FSMC 读取结果寄存器获取目标个数、距离、速度等信息。然后 STM32 把这些信息格式化显示在 ILI9341 LCD 上。LCD 驱动用 SPI 接口初始化时读 ID 是 0xA1A1这个在调试时经常用来确认屏幕是否正常。如果读不到正确的 ID优先检查 SPI 的时钟极性和相位配置以及复位时序是否满足手册要求。提示STM32 和 FPGA 共地非常重要尤其是高速数据传输时地弹噪声会直接影响通信稳定性。建议在 PCB 布局时把两者的地平面尽量靠近并在关键信号线上加匹配电阻。3. 实操过程与核心环节实现3.1 硬件平台搭建与供电检查硬件平台是基础搭不好后面全是坑。我用的是一块 FPGA 核心板加底板的结构核心板是 Xilinx Artix-7 系列底板集成了 AD9361 射频模块、STM32 最小系统、LCD 接口和电源管理。供电部分要特别注意AD9361 需要 1.3V、1.8V、3.3V 多路电源而且对电源纹波很敏感。我用的是低压差线性稳压器每路电源都加了足够的去耦电容实测纹波在 10 mV 以内。上电顺序也有讲究AD9361 要求先给数字电源再给模拟电源否则内部电路可能进入不确定状态。我在电源管理芯片上做了时序控制确保上电顺序符合手册要求。第一次上电时不要急着接射频天线先用频谱仪看 DDS 输出的信号是否正常确认没有自激和杂散后再接天线。3.2 FPGA 工程创建与 IP 核配置FPGA 工程用 Vivado 创建顶层模块例化了 DDS、数字下变频、抽取滤波、FFT、CFAR 和总线接口这几个子模块。DDS IP 核配置成正弦波输出相位累加器位宽 32 位输出位宽 12 位匹配 DAC 的精度。数字下变频用乘法器和累加器实现本振信号也用 DDS 产生频率和发射信号一致。抽取滤波用 FIR 编译器生成截止频率 10 MHz抽取因子 8通带纹波 0.1 dB阻带衰减 60 dB。FFT IP 核配置成 1024 点流水线模式输入数据位宽 16 位输出位宽 16 位缩放方式选块浮点。CFAR 检测用 Verilog 手写参考单元和门限因子都做成寄存器可配置方便在线调整。总线接口用 AXI4-LiteSTM32 通过 FSMC 模拟 AXI 时序读写寄存器。整个工程综合后资源占用在 Artix-7 上大概 60% 左右时序收敛在 100 MHz 时钟下没有问题。3.3 STM32 固件开发与联调STM32 固件用 Keil 开发主要模块包括 FSMC 初始化、LCD 驱动、串口通信和中断处理。FSMC 初始化时地址建立时间、数据保持时间这些参数要根据 FPGA 端的时序来调。我一开始设的地址建立时间是 2 个 HCLK结果读数据不稳定后来加到 5 个 HCLK 才正常。LCD 驱动用 SPI初始化序列按照 ILI9341 手册来读 ID 是 0xA1A1 说明通信正常。联调时先用 FPGA 产生一个固定的测试数据STM32 读回来在 LCD 上显示确认数据通路没问题。然后逐步接入 ADC 数据观察 FFT 输出的频谱是否正确。如果频谱不对优先检查 ADC 的采样时钟是否稳定以及数字下变频的本振频率是否准确。我遇到过本振频率偏了 1 kHz导致 FFT 谱峰偏移了好几个 bin后来用高精度时钟源才解决。3.4 系统联调与性能测试系统联调是最考验耐心的环节。我先把发射功率调到最低用一根短线把发射和接收直接连起来看差频信号是否正常。然后接上天线在暗室或者空旷场地测试。测试时用一个角反射器作为目标放在不同距离上记录 FFT 谱峰的位置反推距离。实测下来在 10 米到 50 米范围内测距误差在 0.5 米以内测速误差在 0.2 m/s 以内基本满足设计预期。性能测试时我重点看了几个指标距离分辨率、速度分辨率、最大探测距离和虚警率。距离分辨率实测约 0.6 米和理论值 0.5 米接近速度分辨率约 0.15 m/s和理论值 0.12 m/s 接近最大探测距离在发射功率 10 dBm 时约 80 米虚警率通过调整 CFAR 门限因子控制在 1e-4 左右。这些数据都是在特定条件下测的实际使用时还需要根据场景重新标定。4. 常见问题与排查技巧实录4.1 FPGA 端常见问题FPGA 端最容易出问题的地方是时序不收敛和 IP 核配置错误。时序不收敛时Vivado 会报 setup 或 hold 违例这时候要优先检查跨时钟域的信号是否做了同步处理以及关键路径上的逻辑级数是否太多。我遇到过 FFT IP 核的输出时序不满足后来在输出加了一级寄存器才解决。IP 核配置错误也很常见比如 DDS 的输出频率范围设错了导致输出信号被截断或者 FFT 的缩放方式选错了导致输出数据溢出。这些问题在仿真时就能发现所以强烈建议每个 IP 核都单独做仿真验证不要等到上板才发现。4.2 STM32 端常见问题STM32 端的问题主要集中在通信和外设初始化上。FSMC 读写不稳定时优先检查时序参数和硬件连接。我遇到过 FSMC 的地址线和数据线接反了导致读回来的数据全是乱的后来用万用表一根一根对才找到。LCD 不显示时先读 ID如果 ID 不对检查 SPI 配置和复位时序如果 ID 对但不显示检查初始化序列和背光电路。串口通信突然连不上时优先检查波特率是否匹配以及是否有中断冲突。我遇到过串口中断和定时器中断优先级冲突导致串口数据丢失后来调整了中断优先级才解决。STM32 的 CAN 通信也有类似问题如果突然连不上检查终端电阻和总线电平是否正常。4.3 系统联调常见问题系统联调时最常见的问题是数据不同步和噪声干扰。数据不同步表现为 FFT 谱峰位置跳动或者目标距离忽大忽小。这时候要检查 ADC 采样时钟和 DDS 发射时钟是否同源以及 FPGA 内部的时钟域是否做了正确处理。噪声干扰表现为底噪抬高弱目标被淹没。这时候要检查电源纹波、地线布局和屏蔽措施。我整理了一个常见问题速查表方便快速定位问题现象可能原因排查方法FFT 谱峰偏移本振频率不准用频谱仪测本振频率底噪抬高电源纹波大用示波器测电源纹波数据跳动时钟不同源检查时钟树配置通信失败时序不匹配调整 FSMC 时序参数LCD 不显示初始化错误读 ID 确认通信正常目标丢失CFAR 门限过高降低门限因子注意排查问题时一定要遵循“先静态后动态、先局部后整体”的原则。先把每个模块单独调通再联调整个系统否则问题会像滚雪球一样越滚越大。4.4 实操心得与避坑技巧这个项目我前前后后做了三个月踩过的坑不计其数。最大的心得是不要试图一次把所有功能都做上去先做一个最小可行系统比如只做测距不做测速等测距稳定了再加测速。这样每次只引入一个新的变量问题定位起来容易得多。另一个心得是仿真很重要但不要迷信仿真。仿真通过不代表上板就能跑时序、电源、信号完整性这些因素仿真里很难完全模拟。我一般会在关键节点加测试点用示波器或者逻辑分析仪抓波形眼见为实。还有一点文档和注释要写清楚。FPGA 工程里的信号命名要规范STM32 代码里的寄存器定义要加注释否则过两周自己都看不懂了。我吃过这个亏后来重新整理了一遍代码花的时间比写的时候还多。5. 系统扩展与进阶方向这个项目做完之后可以扩展的方向很多。比如把单通道接收改成多通道做数字波束形成提高角度分辨率或者把 FFT 点数加大到 4096提高频率分辨率还可以把 CFAR 换成自适应门限适应不同的杂波环境。如果算力允许甚至可以在 FPGA 里做脉冲压缩和相参积累进一步提高信噪比。STM32 这边也可以扩展比如加一个 SD 卡记录原始数据方便事后分析或者加一个以太网接口把数据传到上位机做实时显示。我最近在尝试用 STM32 的 USB 接口做一个虚拟串口把雷达数据直接传到电脑上用 Python 做实时绘图效果还不错。最后分享一个小技巧调试雷达系统时用一个已知位置的角反射器作为参考目标每次测试都先测它确认系统状态正常后再测其他目标。这样可以快速判断问题是系统性的还是目标相关的。这个习惯帮我省了很多时间推荐你也试试。
阅读完成 · 觉得有帮助?