基于51单片机与FPGA的便携式幅频特性测试仪设计与实现

发布时间:2026/5/20 5:53:35

基于51单片机与FPGA的便携式幅频特性测试仪设计与实现 1. 项目概述与核心价值最近在整理一些老项目的资料翻到了一个当年和团队一起搞的“便携式幅频特性测试仪”的方案感觉挺有意思的。这个项目的核心目标就是做一个能揣在包里、带到现场去用的“扫频仪”用来快速测量一个电路或者一个系统的频率响应特性也就是我们常说的幅频特性曲线。你可能在实验室里见过那种台式的大块头网络分析仪或者扫频仪精度高、功能全但价格动辄几十万而且搬动起来极其不便。我们这个方案就是想用最经典的51内核单片机加上一块灵活可编程的FPGA再配合一些基础的模拟电路实现一个低成本、便携化、且性能足够应对很多工程现场和教学实验场景的测试工具。它的核心应用场景非常明确首先是电子竞赛和高校的电工电子、通信原理实验教学学生可以用它来直观地观察滤波器、放大器、谐振电路的特性其次是硬件工程师在产品调试阶段快速验证电源的环路稳定性、信号链路的带宽或者排查EMI滤波器的效果再者对于一些现场维护比如检查某个通信通道的频率响应是否异常它也能派上用场。这个方案的精髓不在于追求极致的指标比如-120dB的动态范围或者GHz级的频率而在于用合理的成本实现“从无到有”的测量能力并且把整个系统做小、做稳定。整个设计思路围绕着“便携”、“实时”和“够用”展开下面我就把这个方案从设计思路到关键实现再到踩过的那些坑详细拆解一遍。2. 系统整体架构与设计思路拆解2.1 为什么选择“51内核 FPGA”的组合在做架构选型的时候我们考虑过几种方案。一种是纯MCU方案比如用一颗高性能的ARM Cortex-M系列配合DAC和ADC来产生扫频信号并采集响应。这种方案软件灵活但想要产生高精度、高频率且波形纯净的正弦波对MCU的运算能力和DAC的刷新率要求很高在有限的成本和功耗下很难兼顾。另一种是纯模拟方案用压控振荡器VCO产生扫频信号再用检波电路测量幅度但线性度、频率精度和程控能力是硬伤。最终我们选择了“51内核 MCU FPGA”的混合架构。这里的“51内核”指的是一种兼容8051指令集的增强型单片机例如STC的1T系列或者Silicon Labs的C8051F系列。选择它主要是看中了其极低的功耗、成熟稳定的生态、以及强大的IO控制和通信接口UART, SPI, I2C非常适合作为系统的主控制器负责用户交互按键、液晶显示、数据存储、与上位机通信以及向FPGA发送控制命令。而FPGA现场可编程门阵列则是本方案的核心算力与信号发生引擎。我们选用的是Altera现Intel的Cyclone系列或Xilinx的Spartan系列中低端器件。FPGA在这里承担了几个关键任务第一实现直接数字频率合成DDS核心用于产生高精度、高分辨率、频率可快速切换的正弦波扫频信号第二实现数字正交解调Digital Down Conversion, DDC或数字检波算法对ADC采样回来的信号进行实时处理提取幅度信息第三产生精确的时序控制信号同步整个测量流程。FPGA的并行处理能力和硬件确定性延时是保证测量实时性和精度的关键这是软件顺序执行的MCU无法比拟的。这个组合的优势在于MCU做它擅长的系统管理和流程控制FPGA做它擅长的高速信号处理与生成二者通过并口或高速SPI通信分工明确效能最大化。成本上一片增强型51单片机和一片入门级FPGA的总价远低于一颗高性能的ARM Cortex-M4/M7加高速DAC/ADC的方案且灵活性更高。2.2 系统信号流与核心模块划分整个测试仪的信号流可以概括为“产生 - 施加 - 采集 - 处理 - 显示”的闭环。下图是系统的核心模块框图文字描述主控与用户界面MCU侧51单片机负责读取编码器或按键的频率设置、扫描范围、扫描速度等参数通过液晶屏如12864或TFT显示当前状态、设置菜单以及最终绘制出的幅频特性曲线。它还将扫描参数起始频率、终止频率、步进频率、幅度通过通信接口发送给FPGA。扫频信号发生模块FPGA侧这是FPGA内的核心IP之一。我们采用DDS技术。FPGA内部维护一个相位累加器和一个正弦波查找表ROM。MCU设定一个频率控制字FTWFPGA每个时钟周期将FTW累加到相位寄存器用相位寄存器的高位作为地址去查询正弦波ROM表输出对应的数字正弦波样本。通过改变FTW就能无延迟地改变输出频率。DDS的输出经过一个高速数模转换器DAC变成模拟正弦波。信号调理与输出模块模拟前端DAC输出的正弦波通常含有高频谐波由于采样和量化需要经过一个低通滤波器抗镜像滤波器进行平滑得到一个纯净的模拟正弦波。然后信号经过一个可编程衰减器或放大器如数字电位器或VGA用于调整输出信号的幅度以适应不同被测设备的输入范围。最终信号通过一个输出缓冲放大器运放和隔直电容送到测试端口。响应信号采集模块模拟前端被测设备DUT的输出信号首先经过一个输入缓冲和量程选择电路可能包含可编程增益放大器PGA将信号调整到ADC的最佳输入范围内。然后信号被高速ADC采样转换为数字信号送入FPGA。数字信号处理与幅度提取模块FPGA侧这是另一个核心。采集到的数字信号需要实时计算其幅度。我们采用了数字正交解调法。FPGA内部会生成一个与当前发射频率同频同相的正弦和余弦参考信号利用另一个DDS核心或直接从发射DDS引出。将ADC数据分别与正弦、余弦参考信号相乘得到I同相和Q正交两路信号再经过低通滤波器在FPGA内用FIR或CIC滤波器实现滤除倍频分量最后计算幅度 sqrt(I^2 Q^2)。这种方法能有效抑制噪声精确提取幅度尤其适合窄带测量。对于要求不高的场景也可以用绝对值低通滤波的简化包络检波法。数据交换与绘图MCU与FPGA协作FPGA完成每个频率点的幅度计算后将结果比如一个16位的幅度值通过FIFO或寄存器映射的方式传递给MCU。MCU收到数据后将其与当前频率值对应存储。当一次扫描完成MCU就获得了一系列频率幅度数据对它可以在液晶屏上以点图或连线图的方式绘制出幅频特性曲线也可以通过串口发送到上位机进行更复杂的分析和保存。注意这里的模拟前端滤波器、放大器、ADC/DAC的设计质量直接决定了整个系统的性能底线。FPGA和算法决定了性能的上限和灵活性。3. 核心硬件电路设计与选型要点3.1 关键器件选型与参数考量1. 单片机MCU选型 我们当时选用的是STC12C5A60S2系列。理由如下首先是1T内核速度比传统8051快8-12倍处理界面和通信游刃有余其次它内部集成了大容量RAM1K和Flash60K可以存储大量的扫描数据点再者它拥有丰富的IO口、两个全双工串口、SPI接口和PWM方便连接LCD、编码器、FPGA和上位机。功耗也控制得不错。其他如C8051F系列也是极佳选择自带高精度ADC和DAC但成本稍高。核心是保证有足够的处理能力和通信带宽。2. FPGA选型 选择的是Altera Cyclone II EP2C5T144。这款器件逻辑资源约5K LE对于实现一个DDS核心、一个DDC处理流水线以及一些控制逻辑绰绰有余。它有足够的Block RAM来存储正弦波表一个1024点16位精度的表只占用2Kb BRAM。144引脚封装提供了大量的用户IO便于与MCU、ADC、DAC、SDRAM如果需要缓存数据连接。时钟管理单元可以产生系统所需的各种时钟。选型的关键是评估所需逻辑资源、存储资源、IO数量以及PLL性能入门级器件通常足够。3. 数模转换器DAC选型 这是信号源质量的关键。我们选择了ADI的AD97088位125 MSPS或TI的DAC90414位165 MSPS。位数决定了输出信号的无杂散动态范围SFDR采样率决定了能输出的最高信号频率根据奈奎斯特定理最高频率小于采样率的一半。对于便携式测试仪输出频率通常在几MHz到几十MHz选择一款12-14位、100MSPS以上的DAC是比较平衡的选择。需要关注其建立时间、毛刺能量等动态性能。4. 模数转换器ADC选型 响应信号采集的窗口。选择了ADI的AD924014位10 MSPS或TI的ADS822E12位25 MSPS。ADC的位数决定了幅度测量的分辨率1LSB对应的电压值采样率必须满足奈奎斯特采样定理即高于被测信号最高频率的两倍。实际上由于数字解调的需要我们通常采用过采样采样率最好是信号频率的4倍以上。同时要关注ADC的信噪比SNR和有效位数ENOB。5. 时钟系统设计 整个系统的“心跳”。需要一个高稳定度、低抖动的时钟源。我们使用了一个温补晶振TCXO或普通有源晶振为FPGA提供主时钟如50MHz。FPGA内部的PLL将这个时钟倍频到DAC和ADC所需的工作频率如125MHz并生成相位关系严格同步的其他时钟域。时钟抖动会直接恶化DDS的输出频谱纯度和ADC的采样精度必须重视。3.2 模拟前端电路设计细节输出通道信号调理 DAC输出后必须接一个抗镜像滤波器。假设DAC更新率是125MSPS我们想输出最高20MHz的正弦波。那么镜像频率出现在125 - 20 105MHz以及125 20 145MHz等位置。我们需要一个截止频率在20-30MHz的低通滤波器如巴特沃斯或切比雪夫型将105MHz及以上的镜像分量衰减到足够低如-60dBc。通常采用无源LC滤波器或有源运放滤波器。运放要选择高速、低失真、大带宽的型号如ADI的AD8065、TI的THS3202。输入通道信号调理 被测设备的输出幅度可能从毫伏到伏特级别变化。因此输入前端需要一个可编程增益放大器PGA或量程切换电路。简单的方案可以用模拟开关切换不同反馈电阻的运放电路。更优的方案是使用集成PGA芯片如ADI的AD8250G1, 10, 100, 1000。在PGA之前通常还需要一个缓冲器和一个抗混叠滤波器。抗混叠滤波器的截止频率应略高于我们计划测量的最高频率以滤除高频噪声和可能存在的混叠分量。电源设计 模拟电路运放、ADC、DAC和数字电路FPGA、MCU必须采用独立的电源供电并通过磁珠或0Ω电阻进行单点连接避免数字噪声串扰到敏感的模拟部分。对于高速ADC和DAC需要非常干净的模拟电源推荐使用线性稳压器LDO如TPS7A系列而不是开关稳压器。时钟电路部分的电源也需要单独滤波。地平面分割要合理模拟地和数字地在ADC/DAC芯片下方单点连接。4. FPGA逻辑设计与关键算法实现4.1 DDS信号发生器的FPGA实现DDS的核心是相位累加器和正弦查找表。在Verilog或VHDL中我们可以这样构建一个参数化的DDS模块module dds_core ( input wire clk, // 系统时钟如125MHz input wire rst_n, input wire [31:0] freq_word, // 32位频率控制字来自MCU output reg [13:0] sine_out // 14位正弦波输出送至DAC ); reg [31:0] phase_accumulator; // 32位相位累加器 wire [9:0] rom_address; // 取查找表地址的高10位假设表深1024点 reg [13:0] sine_rom [0:1023]; // 深度1024宽度14位的正弦波ROM // 初始化ROM可以通过$readmemh从文件加载正弦波数据 initial begin $readmemh(sine_table.hex, sine_rom); end // 相位累加 always (posedge clk or negedge rst_n) begin if (!rst_n) phase_accumulator 32d0; else phase_accumulator phase_accumulator freq_word; end // 取相位累加器的高位作为ROM地址 assign rom_address phase_accumulator[31:22]; // 取最高10位 // 查找表输出 always (posedge clk) begin sine_out sine_rom[rom_address]; end endmodule关键参数计算 输出频率f_out (freq_word * f_clk) / 2^N其中N是相位累加器位数这里为32f_clk是系统时钟125MHz。例如要产生1MHz信号freq_word f_out * 2^N / f_clk 1e6 * 2^32 / 125e6 ≈ 34359738十六进制0x20C49BA6。频率分辨率f_resolution f_clk / 2^N 125e6 / 2^32 ≈ 0.0291 Hz非常精细。实操心得正弦波ROM表的数据可以用MATLAB或Python生成存储为.hex或.coe文件供FPGA初始化使用。为了改善频谱纯度可以采用“相位抖动”技术即在累加前给频率控制字加上一个很小的随机数或者使用“幅度压缩”ROM表只存储1/4周期通过相位映射生成全周期。ROM的深度和位数需要权衡深度越大如4096点波形量化误差越小谐波性能越好但消耗更多Block RAM输出位数如14位应与后端DAC的位数匹配。4.2 数字正交解调DDC的FPGA实现数字正交解调是精确提取幅度的关键。在FPGA中我们需要实现一个数字混频器和低通滤波器链。module ddc_core ( input wire clk, input wire rst_n, input wire [13:0] adc_data, // 14位ADC采样数据 input wire [13:0] sin_ref, // 来自参考DDS的同相参考信号 input wire [13:0] cos_ref, // 来自参考DDS的正交参考信号 output wire [15:0] magnitude // 计算出的幅度值 ); reg signed [27:0] i_mult, q_mult; // 乘法结果寄存器14位*14位28位 reg signed [27:0] i_lpf, q_lpf; // 低通滤波后数据 wire signed [27:0] i_filtered, q_filtered; // 数字混频ADC数据分别与正弦和余弦参考信号相乘 always (posedge clk) begin i_mult $signed(adc_data) * $signed(sin_ref); // 注意转换为有符号数运算 q_mult $signed(adc_data) * $signed(cos_ref); end // 实例化两个相同的低通滤波器如FIR滤波器 fir_lpf fir_i ( .clk(clk), .rst_n(rst_n), .data_in(i_mult[27:14]), // 取高14位进行滤波防止溢出 .data_out(i_filtered) ); fir_lpf fir_q ( .clk(clk), .rst_n(rst_n), .data_in(q_mult[27:14]), .data_out(q_filtered) ); // 寄存器滤波输出 always (posedge clk) begin i_lpf i_filtered; q_lpf q_filtered; end // 幅度计算A sqrt(I^2 Q^2)。在FPGA中实现开方运算资源消耗大 // 可采用近似算法如CORDIC算法或者对于相对测量直接用 I^2Q^2 作为幅度指示。 // 这里为了简化假设使用一个预先写好的开方IP核。 sqrt_unit sqrt_inst ( .clk(clk), .radical({i_lpf[27:14]*i_lpf[27:14] q_lpf[27:14]*q_lpf[27:14]}), // 取高14位计算平方和 .q(magnitude) ); endmodule滤波器设计低通滤波器LPF用于滤除混频产生的二倍频分量2*f_signal。滤波器截止频率应略高于预期的幅度变化速率即扫频步进速率但远低于二倍频。通常用一个几十阶的FIR滤波器可以实现很好的抑制效果。FPGA开发工具如Quartus II的FIR Compiler可以方便地生成滤波器IP核只需指定采样率、截止频率和衰减要求。注意事项数字混频和滤波会引入一定的处理延时。在扫频测量中每改变一个频率点需要等待一段时间即“稳定时间”让滤波器输出稳定后再读取幅度值。这个稳定时间取决于滤波器的阶数和截止频率需要在软件流程中加以考虑。一种优化方法是使用滑动Goertzel算法它可以在每个频率点快速计算特定频率的幅度无需复杂的滤波链特别适合步进式扫频。5. 软件流程与系统控制逻辑5.1 单片机主控程序框架51单片机的程序主要围绕状态机展开核心流程如下初始化配置串口与上位机通信、SPI与FPGA配置或通信、IO口按键、编码器、LCD控制、定时器。从EEPROM读取默认的扫描参数如起止频率、步进、输出幅度。菜单与参数设置在一个循环中检测按键或编码器事件更新液晶屏上的菜单界面允许用户修改扫描参数。参数修改后实时通过并行总线或SPI写入FPGA的相应控制寄存器。扫描启动与执行用户按下“开始扫描”键。MCU根据起始频率F_start、终止频率F_stop和步进频率F_step计算总点数 N (F_stop - F_start) / F_step 1。循环 N 次 a. 计算当前频率F_curr F_start i * F_step。 b. 根据DDS公式计算对应的频率控制字FTW (F_curr * 2^32) / F_clk将其发送给FPGA的DDS控制寄存器。 c. 延时等待一段时间如10ms这个时间必须大于FPGA内滤波器的稳定时间加上被测电路的建立时间。 d. 从FPGA的指定寄存器中读取当前频率点的幅度测量值Mag[i]。 e. 可选将(F_curr, Mag[i])临时存储到数组或通过串口发送到上位机。扫描结束。数据绘图与显示扫描完成后MCU在液晶屏上建立坐标系X轴为频率对数或线性刻度Y轴为幅度dB或线性电压值。将存储的(F_curr, Mag[i])数据对转换为屏幕坐标点。使用画点或画线函数将所有点连接起来形成幅频特性曲线。同时可以计算并显示关键参数如-3dB带宽、中心频率、通带纹波等。通信接口提供串口命令允许上位机如PC上的LabVIEW或Python程序远程控制测试仪、获取原始数据进行更复杂的分析和存储。5.2 上位机软件可选增强功能虽然仪器可以独立工作但搭配一个简单的上位机软件能极大提升体验。可以用PythonPyQt5或Tkinter或LabVIEW快速开发一个。参数设置与远程控制通过串口发送命令设置仪器的所有参数并启动扫描。数据接收与实时绘图接收仪器传回的数据流实时绘制幅频曲线比单片机液晶屏显示更精细。高级分析功能实现自动标定归一化、插值平滑、曲线拟合、导出数据CSV格式、比较多次测量结果、生成测试报告等功能。滤波器设计辅助如果被测对象是滤波器可以输入理想滤波器参数如切比雪夫型、阶数、截止频率在上位机绘制理想曲线与实测曲线叠加对比直观评估性能。6. 系统校准、测试与常见问题排查6.1 校准流程让测量值可信任何测量仪器都需要校准。我们这个测试仪需要校准两个主要方面频率精度和幅度精度。频率校准相对简单。用一台高精度的频率计或示波器测量测试仪输出的某个频率信号如10MHz。比较测量值与设定值计算误差。这个误差主要来源于系统主时钟晶振的精度。如果误差超出允许范围如100ppm可以在软件中引入一个校准系数。例如实测输出为10.001MHz设定为10.000MHz则误差为100ppm。后续MCU计算频率控制字时将公式修正为FTW (F_curr * 2^32) / (F_clk * (1 0.0001))。幅度校准这是难点和重点。需要一个已知幅度精度很高的信号源如校准过的函数发生器和一台真有效值电压表或频谱分析仪。输出幅度校准将测试仪的输出直接连接到真有效值电压表。设置测试仪输出一个固定频率如1kHz、不同幅度如0.1Vpp, 0.5Vpp, 1Vpp, 2Vpp的信号。记录测试仪设定的幅度值与电压表实测值。建立一张“设定值-实测值”查找表或者拟合出一个校正公式可能是线性的也可能因输出放大器非线性而需要二次曲线拟合。将此表或公式存入MCU的EEPROM在输出时进行校正。输入幅度校准将已知精度的信号源连接到测试仪的输入端口。信号源输出一系列固定频率、不同幅度的正弦波。记录信号源输出的真实幅度值与测试仪测量得到的幅度值。同样建立“真实值-测量值”查找表或校正公式。这一步校准了输入通道的PGA增益、ADC偏移和增益误差。实操心得幅度校准最好在多个频点进行如100Hz, 1kHz, 10kHz, 100kHz, 1MHz因为模拟前端的频率响应可能不平坦。最终可以生成一个二维校准表频率 vs. 幅度但这需要大量的校准点和存储空间。一个折中方案是在几个关键频点进行全幅度范围校准其他频点假设其频率响应是平滑的进行插值处理。校准后系统的幅度测量精度可以从5%-10%提升到1%-2%的水平。6.2 典型问题排查实录在实际调试中我们遇到了不少问题这里列举几个典型的问题1输出正弦波失真大有明显台阶或毛刺。可能原因ADAC输出后的抗镜像滤波器设计不当或失效。排查用示波器观察DAC输出端滤波器前和滤波器输出端波形。如果滤波器前是阶梯状滤波器后仍是阶梯状说明滤波器截止频率过高未能滤除高频镜像分量。需要重新计算并调整滤波器参数。可能原因BDAC的参考电压或电源噪声大。排查测量DAC的模拟电源和参考电压引脚用示波器交流耦合观察是否有高频噪声。加强电源滤波使用更干净的LDO并在DAC电源引脚就近放置去耦电容如10uF钽电容并联0.1uF陶瓷电容。可能原因C数字信号对模拟部分的干扰。排查检查PCB布局确保DAC的数字电源和模拟电源已分离地平面分割合理。DAC的数字输入信号线来自FPGA最好串接小电阻22-100欧姆以减缓边沿减少高频辐射。问题2测量结果不稳定幅度值跳动大。可能原因A滤波器的稳定时间不够。排查增加MCU在设置新频率后的等待延时。更科学的方法是让FPGA在幅度值稳定后产生一个中断或状态位通知MCU来读取而不是固定延时。可能原因BADC输入信号过载或信噪比太低。排查观察ADC输入端的波形确保其峰值在ADC量程的70%-90%以内既不过载也不至于太小。调整前级PGA的增益。如果信号本身噪声大考虑在抗混叠滤波器前加入适当的屏蔽和滤波。可能原因C时钟抖动过大。排查时钟抖动会影响ADC的采样精度和DDS的频谱纯度。尝试更换质量更好的晶振并确保时钟走线短且远离噪声源。问题3高频段如接近10MHz测量误差急剧增大。可能原因A模拟前端带宽不足。排查输出和输入通道的运放、滤波器、缓冲器都有带宽限制。检查所用运放的增益带宽积GBP是否足够。例如一个增益为1的缓冲器其-3dB带宽应远高于10MHz。可能需要更换为更高带宽的运放。可能原因BPCB布局和寄生参数影响。排查高频下走线电感、对地电容会产生影响。确保高频信号走线尽量短、粗且参考连续的地平面。避免在信号路径上使用过孔。对关键元件如滤波器电感电容的选型要考虑其高频特性如Q值、自谐振频率。问题4与上位机通信时数据偶尔错乱。可能原因A串口波特率误差累积或中断冲突。排查确保MCU使用的晶振频率能使串口波特率误差在可接受范围内通常2%。如果MCU在发送数据时被高优先级中断频繁打断可能导致串口发送缓冲区被覆盖。优化中断服务程序或者采用DMA方式发送数据。可能原因B地线噪声导致逻辑电平误判。排查如果使用RS-232电平确保MAX232等电平转换芯片的电容已正确连接。如果使用USB转串口尝试给USB接口加磁珠滤波或使用带隔离的USB转串口模块。这个基于51内核和FPGA的便携式幅频特性测试仪方案从构思到实现是一个典型的硬件与软件、数字与模拟紧密结合的项目。它不追求极致的性能参数而是在成本、功耗、体积和实用性能之间寻找最佳平衡点。通过这个项目你能深入理解DDS、数字信号处理、混合信号PCB设计、仪器校准等一系列关键工程技能。虽然现在市面上有很多集成度更高的芯片如集成DDS和ADC的专用芯片但通过FPGA和MCU“自底向上”地构建整个系统对于理解测量仪器的本质有着不可替代的价值。最后一个小建议在画PCB时一定要把模拟部分和数字部分彻底分开电源和地平面的处理多花点心思这能为你后期调试省下大量的时间。

相关新闻