ARTICLE DETAIL

资讯详情

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

从零搭建PLFM_RADAR:FPGA与STM32雷达信号处理平台实战复盘

从零搭建PLFM_RADAR:FPGA与STM32雷达信号处理平台实战复盘 1. 从零搭建一套PLFM_RADAR一个雷达信号处理平台的完整复盘雷达这东西很多人第一反应是军工、遥感、气象这些高冷领域离普通开发者很远。但如果你手上有几块FPGA开发板、一块STM32再加上对相控阵原理的一点好奇心其实完全可以自己搭一套小型的PLFM_RADARPulse Linear Frequency Modulation Radar脉冲线性调频雷达验证平台。我前后花了大概三个月时间把发射链路、接收链路、信号处理链路和上位机显示全部跑通中间踩的坑比想象中多得多。这篇文章就把整个项目的设计思路、核心参数计算、FPGA与STM32的分工、调试过程中遇到的各种诡异问题全部摊开来讲一遍。PLFM_RADAR的核心价值在于它用线性调频信号LFM也叫chirp信号作为发射波形通过脉冲压缩获得距离分辨率通过多普勒处理获得速度信息再配合相控阵天线实现波束扫描。整套系统涉及射频前端、高速ADC采样、FPGA实时信号处理、STM32系统控制与通信、上位机可视化等多个环节。适合有一定FPGA和STM32基础、想往雷达信号处理方向深入的同学参考也适合做毕业设计或创新项目的朋友直接抄作业。我用的硬件配置大致是这样的FPGA选的是Xilinx Artix-7系列具体型号XC7A35TSTM32用的是STM32F407ZGT6ADC是AD922612位、65MSPSDAC用的是AD976714位、125MSPS射频前端用了两片ADF4351锁相环做上下变频。天线部分先用的是4阵元的微带贴片阵列做原理验证后面再扩展到8阵元。整套系统的工作频率定在2.4GHz ISM频段附近主要是为了降低射频调试门槛也方便用现成的模块。2. 系统整体设计与方案选型拆解2.1 为什么选LFM波形而不是简单脉冲雷达波形的选择直接决定了整个系统的性能上限。最简单的单频脉冲雷达距离分辨率取决于脉冲宽度想要1米的分辨率就需要约6.67ns的脉冲宽度这意味着瞬时带宽要150MHz以上对ADC和信号链的压力极大。而LFM信号通过在大时宽脉冲内部扫频接收端做匹配滤波脉冲压缩后等效带宽就是扫频带宽距离分辨率等于光速除以两倍带宽。比如扫频带宽50MHz理论距离分辨率就是3米带宽100MHz分辨率就是1.5米。更关键的是LFM可以在不增加峰值功率的前提下通过增加脉冲宽度来提高发射能量从而提升探测距离。这就是所谓的大时宽带宽积优势。我最终选的参数是脉冲宽度20微秒扫频带宽50MHz调频斜率就是2.5MHz/微秒。这个参数下理论距离分辨率3米最大不模糊距离由脉冲重复周期决定我设的PRT是100微秒对应最大距离15公里。2.2 FPGA与STM32的分工逻辑很多人会问为什么不全用FPGA做或者全用STM32做这里涉及一个很实际的工程考量。FPGA的优势在于并行处理和确定性时序适合做高速ADC数据采集、数字下变频DDC、脉冲压缩、FFT这些运算密集型任务。STM32的优势在于控制逻辑、协议栈、人机交互适合做系统状态管理、参数配置、USB/以太网通信、上位机协议解析。我的分工是这样的FPGA负责从ADC读取原始中频数据做数字正交解调得到I/Q两路基带信号然后做脉冲压缩和相参积累把处理后的距离-多普勒矩阵通过FSMC或SPI传给STM32。STM32负责配置FPGA的工作参数通过SPI写寄存器、控制ADF4351的频率和扫频触发、管理USB CDC通信把数据打包发给上位机、以及处理按键和LCD显示。这样两边各司其职FPGA不用管复杂的协议栈STM32也不用被高速数据流拖垮。2.3 相控阵波束扫描的实现路径相控阵的核心是控制每个阵元通道的相位差从而实现波束指向的电子扫描。我用的方案是在发射端用FPGA产生多路相位可调的LFM信号通过多路DAC输出到各阵元的射频通道在接收端每个阵元通道独立下变频后由多路ADC采样FPGA内部对每路做数字下变频和相位加权再求和形成波束。对于4阵元、阵元间距半波长的线阵波束指向角θ与相邻阵元相位差Δφ的关系是Δφ 2π × d × sin(θ) / λ其中d是阵元间距λ是波长。在2.4GHz下λ约12.5厘米半波长就是6.25厘米。如果要扫描到30度Δφ 2π × 0.0625 × 0.5 / 0.125 π/2也就是90度相位差。FPGA里用CORDIC算法实时计算sin和cos值再乘以对应的I/Q数据就能实现数字波束形成。3. 核心细节解析与实操要点3.1 LFM信号生成的参数计算与DAC配置LFM信号的数学表达式是s(t) exp(j×2π×(f0×t 0.5×K×t²))其中f0是起始频率K是调频斜率。在我的系统里中频选的是60MHz扫频带宽50MHz意味着信号从35MHz扫到85MHz。DAC采样率125MSPS直接数字合成DDS的方式产生。具体实现时我用的是FPGA内部的DDS Compiler IP核相位累加器位宽32位频率控制字根据瞬时频率计算。每个时钟周期更新一次频率控制字累加器溢出就代表一个完整的扫频周期。这里有个细节调频斜率K B/T 50MHz/20μs 2.5MHz/μs换算成每个采样点的频率增量就是2.5MHz/μs ÷ 125MSPS 0.02MHz也就是20kHz。频率控制字Δf_word 20kHz × 2^32 / 125MHz ≈ 687。这个值在FPGA里用累加器实现每个采样时钟加一次累加到50MHz对应的控制字就复位。注意DDS输出的LFM信号一定要加窗否则脉冲压缩后的旁瓣会很高。我用的汉明窗旁瓣抑制能到-40dB左右。不加窗的话旁瓣只有-13dB强目标旁边的弱目标根本看不到。3.2 数字下变频与正交解调的FPGA实现ADC采样回来的中频信号是实信号需要做数字下变频得到I/Q两路基带信号。传统做法是乘以本地振荡器的cos和sin然后低通滤波。我在FPGA里用的是多相滤波架构先把ADC数据分成奇偶两路分别与NCO产生的cos和sin相乘再经过CIC抽取滤波和FIR补偿滤波。NCO的频率设的是60MHz和发射中频一致。这里有个坑NCO的频率控制字精度直接影响解调后的相位噪声。我一开始用的相位累加器位宽是24位结果解调出来的星座图旋转很厉害后来改成32位就稳定了。FIR滤波器的阶数选了64阶截止频率设的25MHz通带纹波控制在0.1dB以内。资源消耗方面一个64阶的复数FIR大概用了18个DSP48E1Artix-7 35T总共90个DSP还剩不少余量。3.3 脉冲压缩的匹配滤波实现脉冲压缩本质上就是发射信号的自相关在频域实现就是乘以匹配滤波器的频率响应。我在FPGA里用的是频域脉冲压缩先把接收到的I/Q数据做256点FFT然后与预存的匹配滤波器频域系数复数相乘再做IFFT。匹配滤波器的系数就是发射LFM信号的共轭频谱这个在MATLAB里提前算好量化成16位定点数存在FPGA的ROM里。256点FFT在Artix-7上大概用了12个DSP和若干Block RAM跑在100MHz时钟下处理一帧数据大概需要2.56微秒。加上前后数据搬运和流水线延迟整个脉冲压缩环节的实时性完全能满足100微秒PRT的要求。这里要注意的是定点位宽的选择我一开始用12位结果脉冲压缩后的峰值旁瓣比只有-25dB后来改成16位就到了-38dB接近理论值。3.4 STM32端的系统控制与通信设计STM32F407在这套系统里扮演大管家的角色。它需要做几件事第一通过SPI配置FPGA的工作参数包括PRT、脉冲宽度、扫频带宽、波束指向角等第二通过GPIO控制ADF4351的寄存器写入设置发射和接收本振频率第三通过USB CDC把FPGA处理后的距离-多普勒数据打包发给上位机第四驱动ILI9341 LCD显示系统状态和简单的距离剖面。USB CDC的配置这里有个经验STM32F407的USB OTG FS做CDC设备时端点缓冲区大小要设成64字节但实际传输时最好每次发512字节的包这样吞吐量能到800KB/s左右。我一开始每次只发64字节结果上位机刷新率只有5帧/秒改成512字节后到了20帧/秒流畅多了。另外USB中断优先级要设得比SPI中断低否则高速数据传输时会丢SPI配置命令。4. 实操过程与核心环节实现4.1 硬件搭建与射频前端调试硬件搭建的顺序很重要我的建议是从电源开始逐级往后调。先确认FPGA和STM32的供电正常再调DAC输出然后调ADF4351的锁相环最后接射频前端和天线。ADF4351的调试是个细致活。我用的是STM32的SPI接口配置寄存器参考频率是25MHz晶振鉴相频率设的10MHz。寄存器配置顺序是R5、R4、R3、R2、R1最后写R0触发更新。这里有个坑ADF4351的寄存器写入需要严格的时序LE信号在最后一个时钟下降沿之后要保持至少20ns的高电平。我一开始用软件延时结果偶尔锁不定后来改成硬件SPI加精确的GPIO控制就稳了。发射链路的调试用频谱仪看最直观。DAC输出60MHz中频经过ADF4351上变频到2.4GHz我用的是二次变频方案先上变频到1.2GHz再上变频到2.4GHz。实测输出功率在-10dBm左右经过PA放大到20dBm。接收链路反过来2.4GHz下变频到1.2GHz再下变频到60MHz中频增益大概40dB噪声系数控制在6dB以内。4.2 FPGA工程的模块划分与综合实现FPGA工程我分了五个模块ADC接口模块、DDC模块、脉冲压缩模块、波束形成模块、以及和STM32的通信接口模块。ADC接口用LVDS接收IDDR原语做双沿采样数据速率65MSPS×12位。DDC模块包含NCO、混频器、CIC抽取和FIR补偿。脉冲压缩模块包含FFT、复数乘法和IFFT。波束形成模块做相位加权和求和。通信接口用SPI Slave模式STM32做Master。综合的时候要注意时序约束。ADC接口的输入延迟约束要设对我用的set_input_delay是2ns对应PCB走线长度约30厘米。DDC模块的时钟域跨越要加异步FIFO我用的深度是512宽度36位。整个工程跑在100MHz主时钟下时序余量大概0.5ns还算健康。资源占用方面LUT用了约60%FF用了45%DSP用了70%Block RAM用了55%还有扩展空间。4.3 上位机数据可视化与联调上位机我用的是Python加PyQt5通过pyserial读USB CDC数据然后做实时显示。显示内容包括距离-多普勒二维图用matplotlib的imshow、距离剖面曲线、以及目标检测结果。数据格式是每帧包含256个距离单元×64个多普勒通道的复数数据每个复数用两个16位整数表示一帧就是256×64×464KB。按20帧/秒算数据率是1.28MB/sUSB CDC完全扛得住。联调的时候遇到一个诡异问题上位机显示的图像总是有周期性条纹。排查了很久最后发现是FPGA里FFT的旋转因子ROM初始化有问题某些地址的数据错了。重新生成ROM初始化文件后问题解决。这个坑告诉我FPGA里的查找表一定要用脚本自动生成手动填数迟早出事。5. 常见问题与排查技巧实录5.1 雷达系统调试中的典型故障速查现象可能原因排查方法解决方案脉冲压缩后无峰值匹配滤波器系数错误用MATLAB对比FPGA输出重新生成系数并量化距离剖面有固定杂波发射泄漏或本振泄漏断开天线看是否仍有增加收发隔离或对消多普勒维出现镜像I/Q不平衡注入单频信号看星座图校准幅度和相位USB传输丢包端点缓冲区溢出用逻辑分析仪抓USB增大缓冲区或降帧率ADF4351失锁环路滤波器参数不对测VTUNE电压重新计算环路带宽FPGA时序违例跨时钟域未约束看时序报告加异步FIFO或打拍ADC数据错位LVDS对间偏斜用测试图案验证调整IDELAY值STM32死机中断优先级冲突看HardFault寄存器重新分配优先级5.2 几个让我熬夜的坑与解决思路第一个坑是ADC的LVDS接收。AD9226输出的是DDR LVDS数据和时钟一起传。我一开始没做源同步直接用系统时钟采样结果数据误码率很高。后来用了IDELAYCTRL和IDELAYE2原语对每个数据对做独立的延迟校准才把误码率降到可接受范围。校准的方法是在FPGA里发一个已知的测试图案然后扫描IDELAY值找到误码率最低的那个点。第二个坑是STM32的USB CDC枚举失败。现象是插上USB后电脑识别不到设备。排查发现是DP上拉电阻的时序问题STM32F407的USB OTG FS需要软件控制DP上拉我一开始忘了在初始化代码里置位导致主机检测不到设备。加上USB_OTG_FS-GCCFG | USB_OTG_GCCFG_PWRDWN和USB_OTG_FS-DCTL ~USB_OTG_DCTL_SDIS之后正常。第三个坑是脉冲压缩的旁瓣问题。理论旁瓣-13dB加汉明窗后应该到-40dB但我实测只有-28dB。查了很久发现是DAC的量化噪声和ADC的采样时钟抖动导致的。DAC是14位理论SNR约86dB但实际板上电源噪声大有效位数只有11位左右。后来在DAC输出加了LC滤波器电源加了LDO旁瓣改善到-35dB基本够用了。5.3 提升系统性能的几个实操技巧第一个技巧是相参积累。单脉冲的信噪比有限通过多个脉冲的相参积累可以把信噪比提升√N倍。我用了64个脉冲做相参积累理论上信噪比提升18dB。实现上就是在FPGA里对每个距离单元的多普勒维做64点FFT这样同时完成了相参积累和多普勒测速。第二个技巧是CFAR检测。恒虚警率检测是雷达目标检测的标准做法。我在STM32里实现了CA-CFAR单元平均CFAR参考单元数选16保护单元数选4虚警率设的1e-6。实测在信噪比12dB以上时检测概率能到90%以上。第三个技巧是波束扫描的相位校准。数字波束形成对通道间相位一致性要求很高。我在每个接收通道注入相同的测试信号然后测量通道间的相位差在FPGA里做补偿。校准后波束指向误差从5度降到1度以内。6. 项目扩展方向与个人经验这套PLFM_RADAR平台跑通之后能扩展的方向其实很多。最直接的是增加阵元数量从4阵元扩展到8阵元或16阵元波束会更窄、增益更高但FPGA的资源和ADC通道数要跟上。另一个方向是换用更高速的ADC比如AD9238双通道、40MSPS或AD964314位、250MSPS这样瞬时带宽可以做到100MHz以上距离分辨率到1.5米。信号处理算法上可以尝试加窗优化、超分辨算法如MUSIC、ESPRIT、或者动目标显示MTI和动目标检测MTD。MTI就是简单的对消器把相邻脉冲相减静态杂波就没了。MTD就是在多普勒维做FFT我现在的相参积累其实已经包含了MTD的功能。最后分享一个我在调试中总结的小经验雷达系统的调试一定要分环节隔离验证。发射链路单独用频谱仪看接收链路单独用信号源灌数字部分单独用仿真数据跑最后再联调。我一开始想一步到位结果出了问题根本不知道是哪一级的锅白白浪费了一周时间。分环节调试虽然看起来慢但总体效率高得多。另外FPGA和STM32之间的数据接口一定要加CRC校验。我遇到过SPI传输时偶尔一位翻转的情况导致STM32解析出错误的目标距离。加了CRC16之后错误数据直接被丢弃系统稳定性提升明显。这个成本很低但收益很大强烈建议加上。
返回列表