【2023电赛】国赛H题信号分离装置:基于FPGA+STM32H743的混合信号处理方案详解

📅 发布时间:2026/7/8 1:42:31 👁️ 浏览次数:
【2023电赛】国赛H题信号分离装置:基于FPGA+STM32H743的混合信号处理方案详解
【2023电赛】国赛H题信号分离装置基于FPGASTM32H743的混合信号处理方案详解最近有不少同学在问去年电赛通信类H题“信号分离装置”的获奖方案是怎么做的特别是看到题目要求从5kHz到400kHz这么宽的频率范围还要能分离正弦波和三角波感觉无从下手。我们团队当时做这个题目拿了个国一用的核心思路是“FPGA做高速信号处理 STM32做主控决策”。今天我就把这个方案的实现细节掰开揉碎了讲给大家从方案选型、硬件设计到软件调试手把手带你走一遍我们当时的思路和踩过的坑。这篇教程适合正在准备电赛、或者对高速数字信号处理感兴趣的嵌入式开发者。看完后你不仅能理解这个获奖方案的全貌还能掌握FPGA与MCU协同处理高速信号的实战方法。1. 题目到底要我们干什么先别急着看电路图咱们得把题目要求吃透。H题的核心任务就两个信号合成给你两路独立的信号A和B可能是正弦波或三角波你需要先用硬件电路把它们加起来得到一个混合信号CC A B。信号分离这是难点你需要从混合信号C里把原始的A和B信号完美地分离并还原出来分别输出为A‘和B’。而且A’和B‘不仅要波形、幅度对还得能跟随输入信号A和B的相位变化甚至能通过串口屏手动调节输出信号的初始相位。更具体的要求是输入信号频率是5kHz的整数倍范围在20kHz到100kHz之间基础部分。但要想拿高分你的装置频率范围越宽越好我们做到了5kHz-400kHz。输出信号的峰峰值不能小于1V。所以整个系统的核心矛盾就在于如何从一个“混在一起”的信号里准确、实时地分辨并提取出两个不同波形的分量传统模拟滤波器的路子在这里走不通原因后面会细说。2. 方案选型为什么是FPGASTM32做电赛方案选型直接决定成败。当时我们团队为每个关键环节都设计了多个方案并进行了PK。下面我把我们当时的思考过程分享给你。2.1 加法器方案让A和B“干净”地混合首先得把A和B加起来。听起来简单但有个坑如果直接用单个运放做加法信号A和B的负载会相互影响导致加到运放输入端的信号本身就已经失真了后面分离得再准也是白搭。我们对比了两个方案方案一单运放加法器。电路简单但A、B信号会相互干扰波形失真。方案二三运放加法器。先用两个运放做电压跟随器隔离A和B再用第三个运放做求和。电路稍复杂但能保证A和B互不影响。注意题目基础部分明确要求A和B输出不失真。所以为了保证信号源的质量我们果断选择了方案二用了三片高性能运放OPA189。虽然多用了两个芯片但为后续的精确分离打下了坚实的基础。2.2 信号分离方案数字方案的降维打击这是最核心的抉择。怎么从CAB里把A和B捞出来方案一模拟滤波器。设计两组滤波器一组滤出正弦波一组滤出三角波。听起来很直接但实际非常困难。因为正弦波和三角波的频谱特性有重叠三角波含有丰富的奇次谐波。当正弦波频率恰好落在三角波某两个谐波之间时模拟滤波器几乎无法完美分离而且要做到在5kHz整数倍频点上都有很好的滤波特性电路设计和调试将是噩梦。方案二数字信号处理。用高速ADC把模拟信号C数字化然后用数字算法比如FFT分析这个数字序列识别出其中包含的两个频率分量A和B的频率以及它们的波形特征正弦 or 三角最后再用DAC还原出来。我们选择了方案二。理由很充分数字方案灵活、精确、可编程。只要ADC够快算法够强就能处理很宽的频率范围。而实现高速采样和实时FFT计算正是FPGA的强项。STM32我们用的是高性能的H743系列则负责运行更复杂的控制逻辑、人机交互串口屏以及向FPGA发送控制指令。这个FPGAMCU的架构构成了我们系统的数字大脑。2.3 信号输出与相位调节方案分离出频率和波形后怎么产生跟随的A‘和B’输出方案我们放弃了独立的DDS模块因为其频率可能有微小误差长期运行会产生相位漂移。我们选择用FPGA内部直接数字频率合成DDSIP核来产生波形通过高速DACAD9744输出。这样频率和相位的控制权完全掌握在我们自己手里精度极高。相位调节方案如何实现相位跟随和手动调相模拟全通滤波器相移随频率变化大会导致三角波这种非正弦波严重失真。FPGA数字延时线消耗大量逻辑资源且调节不灵活。调整DDS初始相位这是最优雅的方案。在FPGA中DDS核的相位累加器可以设置一个初始偏移量直接修改这个偏移量就能实现精确、任意大小的相移几乎不增加额外资源消耗。我们用的就是这个方法。2.4 系统供电方案题目要求加法器部分用移动电源单电源而我们的运放、ADC、DAC都需要正负电源供电。所以需要“单电源转双电源”。方案一先用低压差稳压器TPS7A4071给移动电源的5V稳压、滤除纹波再用电荷泵芯片LM27762产生正负电源最后负电源再用线性稳压器LM7905稳一下。纹波小性能好。方案二直接用LM27762转电路简单但纹波大。对于信号处理系统干净的电源是保证ADC采样精度和DAC输出质量的关键。我们选择了纹波更小的方案一虽然多用了几个芯片但值得。3. 系统架构与硬件设计经过上面的方案PK我们的系统框图就清晰了信号A ------- | 三运放 | ------- 混合信号C ---- | 高速ADC | ---- | | | 加法器 | (AD9269) | FPGA | -- SPI通信 -- | STM32H743 | 信号B ------- | (OPA189)| |(XC7A70T)| | (主控) | | | -- 控制/参数 -- | DDS核 | | 串口屏 | | | ---- | 高速DAC | ---- 信号A‘ | | (AD9744) (跟随A) | | ---- | 高速DAC | ---- 信号B‘ | | (AD9744) (跟随B)硬件核心选型FPGAXilinx Artix-7系列的XC7A70T。这款芯片逻辑资源足够有足够的DSP Slice来做高速运算性价比高。主控MCUST的STM32H743VIH6。高性能Cortex-M7内核主频高有丰富的通信接口SPI、串口等能快速处理FPGA送来的数据并做出决策。高速ADCAD9269。这是一款16位、125 MSPS的高速ADC我们实际用到40.96 MSPS的采样率远高于题目要求的最高信号频率400kHz满足奈奎斯特采样定理为后续处理提供了充足的数字样本。高速DACAD9744。14位、210 MSPS的DAC用来将FPGA生成的数字波形高质量地还原成模拟信号A‘和B’。模拟加法器三片OPA189。这是一款高精度、低噪声的运算放大器性能优异。4. FPGA内部逻辑设计详解FPGA是整个系统的高速数据处理中心。它的内部逻辑可以分成几个关键模块4.1 ADC数据采集与缓存AD9269以40.96 MHz的速度持续采样混合信号C产生源源不断的16位数据流。这个速度对于STM32的SPI来说太快了直接传会丢数据。所以我们在FPGA里设计了一个“缓冲区”比如一个FIFO或双口RAM。工作流程是这样的ADC数据持续写入缓冲区。STM32通过SPI接口以自己能接受的速度比如10 MHz从缓冲区里读取数据块。这个缓冲区就像一个水库ADC是快速流入的水STM32是慢慢舀水的人水库保证了水不会溢出数据不丢失。4.2 相位同步与触发机制这是实现“相位跟随”的精髓。如果FPGA里的DDS核只是简单地以识别出的频率运行由于时钟微小的误差输出信号A‘和输入信号A之间会产生缓慢的相位漂移时间一长就不同步了。我们的解决办法是过零触发复位。FPGA在ADC数据流中实时检测输入信号A或B的过零点从正到负或从负到正的跳变点。同时FPGA内部有一个计数器当计数达到一个预设的“重置周期”时会产生一个触发使能信号。当下一个过零点到来并且触发使能使能时FPGA会立即复位对应通道DDS核的相位累加器。这样输出信号A‘的相位就会被强制“拉回”到与输入信号A同步的状态消除了长期积累的误差。这个“重置周期”寄存器比如0x00地址是STM32可以通过SPI配置的我们可以根据信号频率动态调整实现最优的跟随效果。4.3 寄存器组与SPI通信FPGA内部开辟了一块“控制区”就是一组寄存器。STM32通过SPI总线读写这些寄存器来遥控FPGA。我们的设计里大概有13个寄存器寄存器地址功能说明0x00DDS相位重置周期用于相位跟随0x01通道1A‘输出波形选择0正弦1三角0x02通道1输出频率值32位数据0x03通道1初始相位值用于手动调相0x04通道2B‘输出波形选择0x05通道2输出频率值0x06通道2初始相位值...... (其他控制状态寄存器)例如STM32分析出信号A是10kHz的正弦波它就会通过SPI向FPGA的0x01地址写入0正弦波向0x02地址写入10,000频率值。FPGA侧的SPI从机逻辑接收到这些数据后会更新对应的DDS核参数输出波形立刻就变了。4.4 DDS波形产生与输出我们使用了Xilinx IP核或者自己编写的DDS逻辑。每个输出通道A‘和B’都有一个独立的DDS核。DDS核根据频率控制字、相位控制字和波形查找表正弦表/三角波表实时产生高精度的数字波形样本。这些样本直接送给外部的AD9744 DAC转换成模拟信号输出。手动调相功能就是通过STM32修改上面表格中0x03或0x06寄存器的“初始相位值”来实现的。改这个值DDS核输出的起点就变了相位也就变了。5. STM32主控软件流程STM32是总指挥它的工作流程是一个典型的“采集-分析-控制”循环数据获取通过SPI从FPGA的缓冲区读取一大段ADC采样数据对应混合信号C。数字信号处理对这段数据进行FFT快速傅里叶变换得到信号的频谱图。在频谱图上我们可以清晰地看到两个主要的频率峰它们就对应了信号A和B的频率。波形识别光知道频率还不够还得知道是正弦波还是三角波。这里我们用了一个技巧分析谐波分量。对采样数据做FFT后如果是纯正弦波频谱上只在基频f0处有一个很高的峰谐波2f0, 3f0...分量非常小。如果是三角波频谱上会在基频f0和奇次谐波3f0, 5f0...处出现明显的峰且幅度按照1/n²的规律衰减。 通过判断谐波的能量STM32就能区分出哪个频率对应正弦波哪个对应三角波。参数计算与下发将识别出的两个频率值分别换算成FPGA DDS核所需的频率控制字。将识别出的波形类型正弦/三角转换成寄存器值0或1。通过SPI将频率、波形类型、以及当前的相位重置周期等参数写入FPGA对应的寄存器。人机交互STM32同时负责驱动串口屏。当用户在屏幕上点击“调整A‘相位”时STM32会接收到指令然后计算出新的相位值通过SPI写入FPGA的相位寄存器0x03实现实时调相。6. 调试心得与常见问题电源噪声是万恶之源最开始调试时分离出的波形总有毛刺。查了半天最后发现是给ADC和DAC供电的-5V电源纹波太大。换用更干净的线性稳压方案方案一后问题立刻解决。教训高速模拟电路电源质量至关重要钱要花在电源上。ADC采样时钟要干净给AD9269的40.96MHz采样时钟必须来自低抖动的时钟源比如FPGA的高性能时钟管理模块输出的时钟否则会影响采样精度和后续FFT分析的效果。FFT数据窗的选择STM32做FFT时如果直接对截取的一段数据做FFT会因为频谱泄露导致频率识别不准。需要加窗函数如汉宁窗来改善。这个在软件调试时需要反复对比效果。相位跟随的稳定性触发重置周期不能设得太短否则会频繁打断DDS输出导致波形失真也不能设得太长否则跟随性能变差。这个参数需要根据信号频率动态调整我们是在STM32里做了一个简单的自适应算法。FPGA与STM32的SPI通信协议一定要定义好坚固的通信协议。包括寄存器地址、数据长度、读写标志等。最好加上CRC校验防止传输错误导致FPGA配置错乱。调试时可以先让STM32读取FPGA的版本号或状态寄存器确保通信链路正常再往下进行。这个方案听起来复杂但模块化设计后调试起来是有章可循的。先确保加法器输出C的波形干净再调通FPGA的ADC采集和DAC输出让FPGA能自发一个已知信号并采回来。然后调试STM32的FFT算法确保它能从单频信号中正确识别频率。最后再把所有模块联调实现闭环的分离与跟随。希望这篇详细的拆解能帮你打开数字信号处理应用的大门。电赛的魅力就在于把书本上的理论变成手里实实在在能工作的装置这个过程虽然痛苦但调通那一刻的成就感是无与伦比的。