ARTICLE DETAIL

资讯详情

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

电赛C题无线传输信号模拟系统:基于DDS与STM32的完整设计与实现

电赛C题无线传输信号模拟系统:基于DDS与STM32的完整设计与实现 简介本资源是2024年全国大学生电子设计竞赛C题‘无线传输信号模拟系统’的高分参赛项目完整实现面向计算机、电子信息类专业学生及竞赛备赛者解决无线信号生成、调制解调、实时传输与可视化监测等核心工程问题适用于电赛冲刺训练、课程设计、毕业设计及嵌入式项目实战。压缩包含284个文件总计45.03MB涵盖64个.o与.d编译中间文件、62个.crf调试信息、24个.c/.h源码文件含main.c、tim.c、gpio.c及AD9910、MAX262等关键外设驱动、2个Keil工程文件uvprojx/uvoptx及PDF文档、JPG原理图、MD说明等结构完整、层次清晰支持开箱即编译运行。已有1152人学习下载项目经导师指导并获评审99分提供可复现的软硬件协同方案、模块化代码注释、典型故障排查提示及完整开发环境配置说明小白亦能快速上手调试与二次开发。 电赛C题这种信号模拟类题目几乎每年都是报名人数最多、卷得最狠的方向之一。2024年这道“无线传输信号模拟系统”表面看是做个信号源加接收机实际上考察的是从DDS频率合成、调制解调、射频链路预算到软件状态机设计的完整闭环能力。我们组当时从选题到交作品一共压了四天三夜最后拿到省级一等奖这里把整套源码设计思路、硬件参数计算和调试踩坑记录一次性拆开讲清楚。这篇内容适合正在备赛电赛的本科生、想做无线信号发生器项目的开发者以及想了解信号模拟系统内部原理的爱好者。我会从一个实际参赛队伍的角度把方案怎么定的、电路怎么算的、代码怎么写的、现场怎么调的完整复现出来。1. 先理解题目本质无线传输信号模拟系统到底在做什么很多队伍拿到题第一时间就去翻芯片手册、找开发板结果做了一半发现方向错了。这道题的关键词不是“无线”而是“信号模拟”。它要求你造出一个能够发送特定调制格式、特定载波频率、特定功率等级的无线信号并且在接收端能够还原出基带信息。说白了就是给被测设备提供一个标准的、已知参数的“假信号环境”用来测试通信链路或者接收机性能。另一个容易忽略的点是“模拟系统”这四个字。它不是让你做出一个完整的通信系统而是强调信号的制式、参数可配置、状态可观测。所以发射端要有频率可调、调制方式可切换、输出功率可控这些能力接收端要有解调、参数测量、结果显示这些功能。提分的关键就在于你的系统功能是否覆盖足够全、切换是否够快、界面是否直观。实际比赛时评委评分的重点通常放在这几个维度是否支持多种调制方式AM、FM、ASK、FSK、PSK至少占三四个载波频率范围是否够宽、频率步进是否精细输出信号质量波形失真度、相位噪声、杂散接收端能否正确解调并显示频率、调制指数、信噪比等参数人机交互是否方便能否在几秒内完成参数切换我们组最后做出来的系统覆盖了AM、FM、ASK、FSK、BPSK五种调制载波频率10kHz到30MHz连续可调频率步进最低1Hz输出功率-30dBm到10dBm软件可调接收端能实时显示频率、调制类型和信号强度。这个配置在答辩环节拿到了不少印象分。2. 系统总体设计从需求拆解到方案选型2.1 需求拆解把评分点翻译成技术指标拿到题目后我们没用太多时间争论直接把功能需求拆成了三大块信号生成、信号调理与发射、信号接收与解调。每一块再往下细化技术指标。信号生成部分要求能输出不同调制格式的信号。载波频率我从10kHz做到了30MHz因为再往上就涉及到射频PCB布线、SMA匹配、屏蔽设计等复杂问题四天时间根本来不及验证。基带信号先支持1kHz到10kHz的正弦波、方波、三角波后面代码里加了一个语音输入接口可以外接手机音频作为模拟信号源这个扩展加分项在答辩时很受评委喜欢。信号调理与发射部分输出幅度要求可调。我们用的是DDS芯片输出加可变增益放大器VGA加末级功放的结构。因为DDS输出满幅只有600mV左右经过VGA和功率放大后最大能推到约2.2Vpp对应50欧负载约10dBm。频率和幅度用继电器加数字电位器组合实现自动切换。接收部分更复杂一点要求能解调多种调制信号。我们最终用的是“超外差正交解调”的架构中频选在10.7MHz通过两路正交本振混频后得到I/Q基带信号再用MCU内部的ADC同步采样解调算法在STM32F407上跑。这个方案的好处是硬件链路通用不管什么调制方式只要基带解调算法不一样就行不需要改硬件。2.2 方案选型为什么选STM32F407加DDS芯片而不是FPGA加高速DAC这里有一个很关键的技术选型问题。一开始我们组有两个方向一个是用FPGA加高速DAC直接生成信号另一个是用MCU加DDS芯片。前者灵活性强可以做到很高的采样率和任意波形但开发难度大、调试周期长后者电路简单、频率分辨率高、代码量少而且市面上的DDS芯片比如AD9833、AD9959都很成熟。我们最终选了STM32F407ZGT6加AD9833的方案。原因有三点。第一AD9833最高主频25MHz频率分辨率可以达到0.1Hz级别完全满足题目的频率步进要求而且SPI接口驱动代码非常成熟半小时就能调通。第二STM32F407自带两个12位DAC、三个12位ADC可以直接做基带信号产生和接收采样不需要外挂ADC芯片省了很多布线功夫。第三我们团队的强项在嵌入式软件FPGA不是没人会但在四天时间里把PLL、DDS核、ROM表、时序约束全部调稳定风险太大。如果你准备时间充足FPGA方案当然也很香特别是在信号带宽、实时频谱分析这些扩展功能上更有优势。但就这道题的得分点来说MCU加DDS已经足够覆盖而且可靠性更高。2.3 系统框图与信号流程信号流程是这样的MCU通过SPI配置AD9833的频率寄存器和相位寄存器DDS输出载波信号经过一个7阶低通椭圆滤波器滤掉镜像频率和时钟杂散然后进入VGA和末级功放最后通过天线发射出去。接收端的天线收到信号后先经过带通滤波器选频再进LNA低噪声放大然后和本振信号混频到10.7MHz中频中频放大、滤波后再和正交本振混频得到I/Q两路基带信号ADC采样后送MCU做解调和参数测量。整机通过一块4.3寸TFT触摸屏完成人机交互所有参数实时显示。整个系统用一块5V/2A的锂电池供电板上用TPS5430降到5V再用AMS1117降到3.3V模拟部分单独用一组LC滤波隔离数字噪声。电源这一块千万别省我们一开始就是因为数字地和模拟地没有处理好导致DDS输出频谱底噪很大后面专门画了四层板做电源分割才解决。3. 硬件电路实现与关键参数计算3.1 DDS信号源电路与频率控制字计算AD9833的电路连接很简单VCC接3.3VMCLK接25MHz有源晶振SPI的SCLK、SDATA、FSYNC分别接STM32的SPI1引脚输出IOUT经过一个200欧电阻到地再接滤波电路。注意AD9833的输出是电流型DAC必须在IOUT和AGND之间接一个电阻把它变成电压信号接200欧时满幅输出大约600mV。频率控制字的计算公式可以直接用数据手册里的fout (FREQREG * fMCLK) / 2^28其中FREQREG是写入频率寄存器的28位值fMCLK是主时钟频率2^28是因为AD9833的相位累加器是28位。反过来如果我们想输出1MHz已知fMCLK25MHzFREQREG 1e6 * 2^28 / 25e6 ≈ 10737418 0xA3D70A这里有一个重要的取整误差问题。因为FREQREG是整数除以2^28后实际频率和设定频率会有一个微小偏差。在30MHz时25MHz时钟对应的频率分辨率是25e6/2^28 ≈ 0.093Hz所以误差可以忽略。但如果你用低主频的芯片或者直接把MCU主频当成DDS时钟误差就会放大需要注意。代码里我建议直接用浮点计算然后转成整数而不是预置一堆查找表uint32_t calc_freq_reg(float freq_hz) { return (uint32_t)(freq_hz * 268435456.0f / 25000000.0f); }这样用户在界面上输入任何频率都能实时算出来不需要预置表。3.2 输出滤波与功率放大级设计DDS输出的信号除了想要的正弦波还有大量采样时钟的镜像频率和高次谐波如果不滤波直接放大你会看到一个全是毛刺的失真波形频谱仪上更是惨不忍睹。我们用了7阶椭圆低通滤波器截止频率放在45MHz带外抑制在70MHz处能达到40dB以上。LC滤波器的设计我直接用ADI的Filter Wizard在线工具生成的输入截止频率、阻抗、阻带衰减要求导出元件值。这里要特别提醒电容电感选值要尽量接近标准封装比如0603贴片电容网上买到的实际容值可能有5%误差所以焊完以后要用网分或者频谱仪实测一下实际频率响应必要时微调最后一个并联电容的值。功率放大级用的是AD8352或者MNA-7A这类宽带放大器增益18dB左右输出1dB压缩点大约12dBm。前级VGA用AD8367增益范围-2.5dB到42.5dB通过一个0到1V的模拟电压控制。MCU的DAC输出经过运算放大器缓冲后送给VGA的增益控制引脚这样就能在软件里精确控制发射功率。3.3 接收端射频链路与中频解调电路接收端我们做了超外差结构。天线进来先是一个30MHz低通滤掉环境里的调频广播和通信基站干扰然后进第一级LNABGA2817或者SPF5189增益24dB噪声系数0.8dB。第一级混频用SA612A有源混频器本振由另一个AD9833产生频率设定为接收频率加上10.7MHz中频。中频部分的重点是一个10.7MHz晶体滤波器或者说陶瓷滤波器带宽大约180kHz用来选频和抑制镜像干扰。然后中频信号进第二级放大器AD603增益由MCU通过DAC控制实现AGC自动增益控制。最后是正交解调用另一个SA612A分别和0度、90度本振混频得到I和Q两路基带信号。这两个基带信号送到STM32F407的ADC1和ADC2同步采样。这里我踩了一个坑直接使用HAL库的HAL_ADC_Start_DMA两路ADC的采样不是严格同步的相位差会随DMA通道不同而变化。后来我改用定时器触发ADC1和ADC2同时采样才解决了I/Q通道的相位一致性。3.4 电源与地平面设计经验电源部分直接用了一颗TPS5430把电池电压降到5V线性稳压AMS1117降到3.3V给数字部分另外用一颗低噪声LDOLP5907单独给DDS和接收前端供电。模拟地和数字地单点连接连接点在电源输入端。四层板走线的顺序是顶层信号、第二层完整地平面、第三层电源分割、底层信号。这块一定要做板之前就规划好否则后期没法补救。我们第一版打了双层板DDS输出频谱在10MHz处有一个-35dBm的杂散信号查了半天发现是数字地回路串扰到了模拟输出。改成四层板加完整地平面后这个杂散降到了-65dBm以下整整改善了30dB。4. 源码设计与核心逻辑实现4.1 主程序状态机架构代码框架我强烈建议用状态机不要用裸奔的while大循环。因为系统要处理触摸屏事件、DDS参数更新、ADC采样、AGC控制、解调算法等多个任务如果全塞在主循环里任何一个模块卡住其他模块全部受影响。我的主程序分了五个状态INIT、CONFIG、SEND、RECV、DISPLAY。开机后进入INIT完成外设初始化和自检自检内容包括DDS是否通信正常、ADC是否上线、PA温度是否正常。CONFIG状态处理用户触摸屏的参数设置比如选择调制方式、输入频率、设置功率。确认后进入SEND状态DDS开始输出信号。RECV状态开启ADC采样解调算法在中断里跑。DISPLAY状态每100ms刷新一次屏幕数据。状态机切换用事件驱动触摸屏的按下事件、定时器超时事件、按键中断都会设置对应的标志位。主循环只在标志位置位时才执行对应的状态处理CPU占用率很低大部分时间都在WFI指令下睡觉这对整机功耗控制也有好处。4.2 调制模式切换的软件实现不同调制模式在代码层面的实现差异巨大我一个个说。AM调幅最直接DDS输出载波然后通过后级模拟乘法器AD835和基带信号相乘。但我们在硬件上偷了个懒没有用独立的模拟乘法器而是通过AD9833的幅度控制功能实现了AM。AD9833有一个28位的幅度寄存器可以实时修改输出幅度只要用定时器中断按基带信号频率周期性更新这个寄存器就能得到AM波形。基带是1kHz正弦时我用一个256点的正弦表每20微秒更新一个点就能得到完整的包络波形。FM调频是用DDS的频率控制字实现在定时器中断里把当前基带信号的幅度值乘以频偏系数叠加到载波频率控制字上写入AD9833的频率寄存器。注意一定要先写高14位再写低14位AD9833的寄存器如果不按顺序写会出错。ASK和FSK就是二元调制靠GPIO控制一个开关信号来选择不同的频率控制字或者直接开断输出。AS5389之类的模拟开关可以做到纳秒级切换但DDS频率字写入要花时间实际最高码率只能做到5kbps左右。如果题目要求更高码率需要用FPGA配合DDS的并行接口才能实现。BPSK的实现有点特殊BPSK需要180度相位跳变AD9833有独立的相位寄存器可以直接把相位从0改成2048对应180度相位切换在硬件层面是瞬时的比改频率控制字快得多。我们实测BPSK在10kbps码率下眼图依然很清晰。4.3 接收端解调算法与参数测量接收端我花了最多时间的就是解调算法。AM解调用最简单的包络检波对ADC采样到的I路信号取绝对值然后通过一个截止频率3kHz的数字低通滤波器就能还原出基带信号。FSK解调用两个并行的Goertzel算法分别计算10kHz和20kHz两个频点的能量哪个能量大就判决为对应的比特。Goertzel算法比FFT的运算量小得多适合在MCU上跑float goertzel(float *samples, int len, float target_freq, float fs) { float k 0.5f (len * target_freq) / fs; float w 2.0f * 3.1415926f * k / len; float coeff 2.0f * cosf(w); float s_prev 0.0f; float s_prev2 0.0f; for (int i 0; i len; i) { float s samples[i] coeff * s_prev - s_prev2; s_prev2 s_prev; s_prev s; } float power s_prev2 * s_prev2 s_prev * s_prev - coeff * s_prev * s_prev2; return power; }BPSK解调更考验功底。正交解调后的I/Q两路信号分别乘上本地恢复的载波然后低通滤波判断I路的正负就能恢复出二进制数据。关键在于载波同步我们用了简单的Costas环路在STM32上跑500Hz的环路带宽足够稳定。码元同步用了Gardner算法只需要两倍的过采样率就能工作。参数测量部分频率用等精度测频法计数器在1秒闸门时间内统计输入信号的上升沿次数分辨率可以到1Hz。调制指数AM用包络峰峰值除以平均幅度计算FM用解调后的瞬时频率偏差除以基带频率计算。这些参数直接通过TFT屏显示出来评委一眼能看出系统测量准确。4.4 人机界面与交互逻辑人机交互我们用的是4.3寸电阻触摸屏淘宝上买的现成模块自带字库SPI接口驱动。页面逻辑分两层主页面显示当前模式、频率、功率、调制指数点击“设置”按钮进入参数设置页面里面用滑条和数字键盘调整频率、功率、基带类型等参数。界面代码我用的是GUI库把按钮、滑条、数字输入框都封装成了控件。每次页面切换时先把整屏清掉再重新绘制这个操作在MCU上大概需要30ms虽然不算快但肉眼基本感觉不到卡顿。如果用的是RGB接口的屏幕会更快但SPI接口的TFT成本低、驱动简单四天比赛时间完全够用。我建议在界面上加一个“信号自检”页面当按下这个按钮时系统会输出一个1kHz单音信号接收端解调后回传频率和幅度如果偏差超过阈值就报错。这个小功能是我们答辩时的亮点评委觉得系统有自诊断能力工程完成度高。5. 调试过程与实测数据5.1 关键节点波形测试记录调试时我们每一级电路都单独验证过不要一上来就整机联调。DDS输出先接示波器看波形确认正弦波无失真后再接滤波器测滤波后的频谱纯度然后一级一级往后加。实测AD9833输出1MHz正弦波时用示波器看波形很干净示波器带宽100MHzFFT模式下基波-0.5dBm二次谐波-42dBm三次谐波-55dBm。经过7阶椭圆滤波器后二次谐波压到-65dBm以下这个水平做无线信号源够用了。整机发射功率测试时用频谱仪接30dB衰减器10MHz载波在最大增益下频谱仪读数约-20dBm换算到功放输出端就是10dBm和设计值一致。5.2 不同调制方式的实测表现AM调制测试载波1MHz基带1kHz正弦调制度80%示波器上看到的包络非常清晰FFT频谱载波两侧各有一个边带间隔正好1kHz幅度比载波低约8dB和理论值吻合。FSK调制测试两个频点分别是10kHz和20kHz频偏10kHz码率1kbps用频谱仪看到两个峰清晰分离没有拖尾。解调端用Goertzel算法恢复出的基带数据和发送端对比误码率在信噪比12dB以上时为零。BPSK测试是最好玩的用示波器上看解调后的I路波形能看到明显的双极性电平翻转眼图张开度大约80%。载波频率10MHz码率10kbps时完全没问题码率再高就会出现相位模糊导致的符号翻转目前只能靠特殊字来消除。5.3 传输距离与接收灵敏度实测在室外空旷场地发射端用一根30厘米的拉杆天线接收端同样用拉杆天线10MHz载波、AM调制、发射功率0dBm时30米距离内接收信号强度从-40dBm衰减到-65dBm解调后音频清晰度没有明显下降。50米时信号强度-72dBm勉强能听到但噪声明显增大。换成FSK调制后50米距离依然可以做到零误码因为数字解调的抗噪能力比模拟AM强。室内环境信号衰减明显增多隔着两堵墙10米距离接收信号强度直接从-55dBm掉到-70dBm。这个数据提醒我们比赛现场如果环境空旷系统表现会很好如果评委要求在50米外接收建议发射功率开到最大并使用定向天线。6. 常见问题与避坑经验速查6.1 频率漂移问题整机长时间运行时发射频率会出现几十赫兹的漂移一开始以为是DDS晶振温漂查了半天发现是AD9833的供电电压在波动。由于DDS内部模拟电路对电源敏感VCC上的纹波会直接调制输出频率。解决方法是给DDS单独加LC滤波和LDO确保纹波小于5mV。另外MCLK晶振尽量选温补晶振TCXO普通无源晶振在长时间运行后温漂确实比较大。6.2 调制波形失真排查AM波形一边的包络明显压缩、另一边却正常这是典型的调制器偏置没调好。如果是用模拟乘法器实现AM需要在静态工作点上加适当的直流偏置如果是用DDS幅度寄存器实现AM它的输出天生是单极性需要用运放做一个电平抬升电路把DDS输出的单极性包络变成双极性信号。FSK信号在频谱仪上出现“模糊”现象频点周围有一圈杂散这是频率控制字切换瞬时相位不连续导致的。解决思路是使用AD9833的FSK模式寄存器它内部会做相位连续切换比直接修改频率寄存器的频谱干净得多。6.3 系统联调顺序建议我们踩过一次大坑第一天晚上直接把发射和接收整机联调结果屏幕上波形乱成一团完全无法判断问题出在哪一环。最后花了整整半天时间把每一级断开单独测试才发现是接收端本振信号串到了中频放大器输入端产生了自激。正确的联调顺序应该是先单独测发射端用频谱仪确认信号干净、功率正常再单独测接收端用信号发生器输入标准信号确认解调正确最后才把发射端和接收端放在同一张桌子上联调。联调时先用低功率、短距离摸清链路再逐步加大距离和功率。6.4 高分文档整理心得源码和文档的整理在电赛评分里占的比重比很多人想象中大。我们的文档分了四份系统设计报告、硬件原理图与PCB文件、源码工程带详细注释、测试报告与数据记录。源码工程里每个文件头部都写清楚了模块功能、输入输出参数、修改时间。关键算法比如Goertzel、Costas环路都单独用一个文件放并配了流程图和参数说明。测试报告里放了几十张示波器截图和频谱仪截图每张图都标注了测试条件、仪器型号、结论。答辩时评委翻到这一页印象分直接拉满。我个人经验是四天里有计划地留出半天专门整理文档不要到最后一天才写那时候你已经累到脑子不清醒了写出来的东西质量很差。文档做到什么程度算好一个不懂你这个项目的人拿到文档加源码两个月后能完整复现出整个系统这个标准就够了。最后再分享一个小技巧现场作品除了功能指标稳定性也很重要。我们提前做了两套完全一样的系统一套用于演示一套备用。提交作品前连续运行了六个小时确认无死机、无频率漂移后才装箱。电赛现场时间紧张设备出问题根本没有第二次机会备份设备是最笨也最有效的保险。本文还有配套的精品资源点击获取
返回列表