2024年电赛C题公布之后,我所在的备赛群里第一反应不是兴奋,而是懵。“无线传输信号模拟系统”,听起来像是通信专业研究生才折腾的东西。等把赛题仔细拆开才发现,它要解决的其实就是三件事:用DDS把指定频率的载波稳稳造出来,把载波按AM或者CW的方式调制好,再给信号叠加一个能量化设置的多径效应。说白了,最后要交的是一台带信道模拟功能的可编程信号发生器。
这篇文章把我从方案选型到调试验收的完整过程梳理出来,重点放在DDS频率控制字计算、AM调制指数标定、CW键控电路设计,以及最容易翻车的多径叠加链路。内容按“原理 → 实现 → 实测”的顺序走,适合正在备赛的同学,也适合以后要做信号源、信道模拟器或者射频测试系统的同行参考。
1. 先别急着画板:把C题拆成四个功能块
1.1 题目到底在考什么功夫
很多人一拿到题目就想着找现成的DDS模块、现成的AM解调芯片,这个思路没错,但容易忽略赛题的隐藏要求。C题表面上是“模拟无线传输信号”,实际上考核点可以拆成四项:第一,载波频率能不能做到连续可调、调得准;第二,AM信号的调制深度能不能精确控制;第三,CW信号键控时要干净,不能拖泥带水;第四,多径叠加后,幅度和时延能不能按设定值复现。
这四项里,前两项属于信号源基本功,第三项考的是开关整形能力,第四项才是这个题真正拉开差距的地方。我们队伍一开始就把大部分精力放在DDS和AM上,结果两三天就把电路跑通了,最后却花了一周去解决多径链路的标定问题。所以建议后来的队伍,拿到题目先画功能框图,把每一项的验证方法列出来,再开始动手。
1.2 方案选型:DDS芯片还是FPGA内部DDS
DDS的实现路线,估计每个参赛队伍都会纠结一下。一条路是外挂专用DDS芯片,比如AD9834、AD9854、AD9910;另一条路是在FPGA内部用Verilog搭一个DDS核,再接外部高速DAC。两条路我都试过,结论是:如果题目对输出频率的要求在几十MHz以下,强烈建议用专用DDS芯片,省事、可靠、调试时间短。
用FPGA做DDS的好处是灵活,想加什么调制功能都能在数字域里拼,坏处是高速DAC的布局布线、时钟同步、杂散抑制,每一项都是坑,尤其是比赛这种时间紧张的环境下,画板差一点就很容易出问题。专用DDS芯片把相位累加器、波形查找表、DAC全部集成好了,我们只需要通过SPI/并口配置寄存器,剩下的交给芯片。AD9834的主频做到75MHz,频率分辨率28位,足够覆盖比赛题目的常规频段;AD9854更猛,内部双通道、48位频率字,适合后面做多径的延迟叠加。
1.3 我最终确定的硬件框架
最终我采用的框架是“STM32H750主控 + AD9834载波源 + AD835模拟乘法器做AM + 高速模拟开关做CW键控 + 功分器/衰减器/合路器搭多径链路”。这么选的原因很简单:STM32H7系列主频高,SPI速度能跑到几十MHz,配合DMA和DMAMUX,可以高速刷新DDS寄存器,为后面做频率跳变和幅度调制留足余地;AD9834输出正弦波的质量不错,功耗低,DIP封装的模块也容易在洞洞板或自制PCB上飞线调试;AD835是宽带四象限模拟乘法器,带宽远高于题目要求的最高频率,做AM调制可以避免用DDS内部寄存器刷新方式带来的更新速率瓶颈。
选择模拟乘法器而不是直接用DDS的幅度控制寄存器做AM,是我这次最坚持的一个决定。AD9834确实带10位的“peak amplitude”寄存器,可以通过单片机快速刷新实现调幅,但实际测试下来,寄存器更新的建立时间加上SPI传输时间,能稳稳跑到的调制信号速率并不高,而且幅度更新的毛刺会在包络上留下周期性抖动。外接模拟乘法器之后,调制信号走模拟通路,天然连续,带宽高,包络也平滑得多。
2. DDS信号生成:频率控制字、相位累加器与波形表
2.1 先分清两个DDS
搜资料的时候一定会发现,网上关于DDS的讨论有一大半是ROS2、工业通信里的“Data Distribution Service”,也就是数据分发服务协议,跟咱们做信号源的“Direct Digital Synthesis”直接数字频率合成完全是两码事。C题里的DDS特指后者,是一种用数字方法产生模拟波形的技术。如果看论文,优先找关键词“直接数字频率合成”“DDS信号源”“相位累加器”,不然很容易被带偏。
2.2 DDS的原理与核心计算
DDS的工作过程可以这样理解:一个相位累加器每个时钟周期累加一次频率控制字,累加器的高位当作地址去查一张正弦波形表,查出来的幅度值送给DAC变成模拟电压。关键在于,改变频率控制字,相位累加器增长的速度就不同,于是扫过正弦表的速度也就不同,输出频率跟着变。
频率控制字的计算公式是:
FTW = f_out × 2^N / f_MCLK
其中N是相位累加器位数,AD9834取28,f_MCLK是系统时钟。如果f_MCLK取75MHz,想要输出1MHz正弦波,那么FTW = 1e6 × 2^28 / 75e6 ≈ 3,579,139,换算成十六进制就是0x3698B3。这里有两个地方容易错,一个是忘记把结果取整后再写寄存器,取整误差会带来频率偏差;另一个是2^28这个数不能约掉,很多同学在这步化简出错过。
2.3 滤波与幅度控制:把台阶波变平滑
DAC直接输出的信号本质上是阶梯波,除了目标频率外,还会在f_MCLK ± f_out以及更高次谐波处产生镜像频率。这些镜像如果不滤掉,后面的AM调制和多径叠加都会把杂散一起带进去,频谱上全是毛刺。我在AD9834输出端放了一级简单的7阶椭圆低通滤波器,截止频率按最高输出频率的1.5倍设计,比如最高输出20MHz就做到30MHz截止。椭圆滤波器过渡带窄,能有效压制镜像频谱,缺点是通带内有轻微纹波,对比赛演示来说完全可接受。
幅度控制方面,AD9834可以通过外部电阻设置DAC满量程电流,一般默认3.5mA左右。如果后面接的乘法器或放大器需要更大的驱动能力,最好加一级宽带运放做缓冲,比如OPA690或者AD8065。这里提醒一句,不要在DDS输出端直接并联电容调幅度,那会改变滤波器阻抗特性,导致高频段幅度陡降。
2.4 实时频率切换与STM32H7双缓冲
比赛过程中如果要求模拟“跳频”一类的动态场景,DDS频率的更新速度就很重要了。STM32H750的SPI可以跑到40MHz以上,写一次AD9834寄存器只需要几十个时钟周期,所以理论上能做到微秒量级的频率切换。但问题在于,如果主程序里用普通延时函数去控制SPI片选,实时性很难保证。我的做法是用定时器触发DMA搬运频率控制字,把SPI片选引脚也纳入DMA序列控制,这样每次更新频率的时序都完全一致。
STM32H7的DMAMUX在这里特别有用,它能把定时器事件直接映射成DMA请求,不用CPU干预。配合双缓冲区,可以在DMA搬运前一组数据的同时,让CPU把下一组FTW计算好填入备用缓冲。这套机制表面上看是给DDS写数据,实际上是把“信号生成参数更新”这件事变成了流水线作业,跳频时波形相位完全连续,没有任何停顿感。如果只用普通SPI阻塞发送,频率高一点就会出现波形撕裂,这在示波器上非常明显。
3. AM调制:从原理到调制指数的标定
3.1 AM信号的两条实现路线
AM调制的数学表达是:
u(t) = [U_c + m·U_c·cos(Ωt)]·cos(ω_c t)
其中U_c是载波幅度,m是调制指数,Ω是调制信号角频率,ω_c是载波角频率。这个公式本质上就是把调制信号加上直流偏置后,乘到载波上。实现方式有两条路,一是用DDS内部的幅度控制寄存器按调制信号速率刷新,二是用外部模拟乘法器。
前面已经说过,我最终选了AD835做外部乘法。AD835的输出关系是W = (X1 - X2)×(Y1 - Y2)/1V + Z。做AM时,X端接DDS载波,Y端接“直流偏置 + 调制信号”的复合信号,Z端接地。需要注意的是,AD835的输入幅度不能超过其线性范围,载波幅度一般控制在1Vpp以内,调制信号叠加直流后也要保证始终大于0,否则包络会负向削波,产生过调幅失真。
3.2 调制指数的计算与实测
调制指数m的定义是调幅波包络变化幅度与载波幅度之比。示波器上测量时,读取包络最大值U_max和最小值U_min,按下式计算:
m = (U_max - U_min) / (U_max + U_min)
比如载波本身幅度是2Vpp,叠加调制信号后包络最大值变成3Vpp,最小值变成1Vpp,那么调制指数就是(3-1)/(3+1) = 0.5,也就是50%。比赛评测时,评委很可能设定一个调制深度要求,比如“输出AM信号,调制指数可调,30%到80%可设”,这时候就要在固件里做一次反向计算:已知期望的m和载波幅度U_c,需要的调制信号幅度就是U_Ω = m × U_c。然后根据乘法器的增益换算出Y端需要的实际电压摆幅。
我在实测里发现,AD835的输出存在温度漂移,刚开始调好的m=0.5放半小时会变成0.52左右。虽然变化不大,但为了保险,固件里可以加一个自动校准流程:用ADC采样输出包络(加一个简单的包络检波二极管电路),算出实际m值,然后闭环修正调制信号增益。这个闭环校准是本赛题AM部分拿高分的关键。
3.3 调AM时常踩的几个坑
第一个坑是调制信号叠加直流后幅度过大,导致乘法器输出饱和。AD835的输出最高也就±2V多,一旦饱和,包络顶端被削平,示波器一眼就看出来,但很多同学不知道是乘法器饱和,还以为是载波幅度太大。解决方法是把载波和调制信号幅度都控制在AD835推荐的线性范围内,宁可小一点,后面再加一级放大。
第二个坑是包络检波二极管电路的时间常数没选好。如果用1N60和0.1μF电容做检波,在载波频率比较低的时候(比如100kHz),检波输出会跟着载波本身跌落,测出来的包络是三角波。解决办法是RC时间常数选在调制周期的1/10和载波周期的10倍之间,也就是 1/(10×f_c) ≤ RC ≤ 1/(50×f_Ω) 这个区间,这个窗口是存在的,但要仔细算。
第三个坑更有迷惑性,AM输出波形在示波器上看包络正常,但接上频谱仪发现载波旁边只有一边有边带。这通常不是AM做错了,而是DDS和乘法器之间的信号地存在环路,导致相位关系不对,一般出现在飞线过长的情况下。把地线缩短、在所有模块共地点用粗铜线连接后,问题基本消失。
4. CW信号生成:别把键控做成噪声源
4.1 什么是CW信号、为什么它不是“简单开关”
CW在通信里指等幅报,也就是Continuous Wave。它的本质是载波的通断键控:按键期间输出等幅载波,松开期间不输出。严格来说,CW是OOK调制的一种特例,信息编码在载波包络的有无中,常见于莫尔斯电报。
很多队伍觉得CW不就是在DDS后面加个开关嘛,单片机IO拉高拉低就行。实际一测,包络上升沿和下降沿如果太陡,频谱上会产生很宽的键控边带,听起来就是“咔哒”一声,接收端也会产生明显的频带扩展。题目要的是“信号模拟系统”,模拟的对象应当接近真实电台的CW信号,真实电台的键控波形是经过滤波整形的,上升沿和下降沿都有几十毫秒的过渡时间。
4.2 键控电路怎么设计最稳
我的做法是让DDS常开输出载波,在DDS后级用高速模拟开关做通断控制,模拟开关的EN引脚由单片机IO控制。选模拟开关时要注意导通电阻和切换速度,导通电阻太大会和滤波器阻抗分压,导致开通瞬间幅度跳变;切换速度太慢则包络沿过缓。我用的是一款低压SPDT模拟开关,导通电阻不到1Ω,开关时间在20ns以内,完全够用。
为了把包络修整得更自然,我在开关控制端加了一级RC积分电路,把单片机输出的方波控制信号变成带斜坡的包络控制信号,上升时间大概1毫秒。这样键控出来的CW信号频谱非常干净,相邻谱线间隔就是键控速率,不会有额外杂散。如果直接让单片机IO去开关模拟开关,虽然示波器也能看到方波包络,但频谱上就会出现键控click噪声。这是CW部分最值得做的一处打磨。
4.3 如何量化验证CW质量
验证CW信号好不好,不能只靠耳朵听,需要两个基本测试。第一是示波器看包络:记录一个“点”信号,测量上升时间、下降时间、平顶平坦度,我测下来上升时间约0.8ms、下降时间约1.1ms,平顶幅度波动小于1%。第二是频谱仪看键控边带:在CW键控速率10WPM情况下,频谱偏移载频1kHz处的功率应比载波低至少40dB,这样才说明没有明显的键控杂散。
关于CW的速率,我写了一个简单的配置函数,通过串口或按键轮盘设置每分钟词汇数(WPM),固件里按WPM计算点时长、划时长和字符间隔。点时长公式是1.2 / WPM秒,比如20WPM时一个点为60ms,一个划为180ms,字符间隔为180ms。这个公式来自国际莫尔斯码标准,直接用就行。
5. 多径调制:这台模拟器最值钱的部分
5.1 多径效应在信道里到底干了什么
无线电信号从发射机到接收机,往往不止走一条路。直射波是一路,地面反射、建筑物反射、大气层反射都会形成延迟到达的附加路径。接收端拿到的信号是多路信号的向量和,这就叫多径效应。最简单的双径模型可以写成:
y(t) = x(t) + a·x(t - τ)
也就是主径信号加上一条延迟τ、幅度为a的反射径信号。这个模型在频域对应:
H(f) = 1 + a·e^(-j2πfτ)
从这个公式能看出,多径对频率是“选择性”的。当2πfτ等于2kπ时,两条路径同相叠加,幅度最大;当2πfτ等于(2k+1)π时,两条路径反相抵消,幅度出现凹陷。比如τ设为100ns,第一次凹陷就在5MHz,第二次在15MHz,呈现一种“梳状滤波”效果。题目让做多径调制模拟,核心就是把这个频域梳状响应和相应的时域延迟真实还原出来。
5.2 用抽头延迟线搭一个多径模拟器
多径模拟的硬件实现,最经典、最稳定的方法是抽头延迟线结构。信号经过功分器分成两路,一路为主径,直接通向合路器;另一路为延迟径,先经过一段同轴电缆延迟线,再经过可调衰减器,也通向合路器,最后合路输出。
功分器和合路器我用的是微带结构的二等分功分器,频率范围从10MHz到500MHz,两路隔离度20dB以上。同轴电缆延迟线的时延按电缆长度算,RG58同轴电缆的标称速度因子约0.66,电磁波在电缆中的速度是3×10^8×0.66,也就是约2×10^8 m/s,延迟约5ns/m。如果要模拟200ns延迟,就需要40米电缆,这在比赛现场非常占地方。我的做法是准备一组长度分别为0.5米、1米、2米、5米、10米的电缆,通过拨码开关或继电器切换接入回路,组合出10ns到100ns量级的延迟。
衰减器用的是PE4302数字步进衰减器,通过SPI配置,衰减范围0到31.5dB,步进0.5dB。用数字衰减的优点是可以程序校准,固件里建一张表,把设定的衰减值和实测衰减值对应起来,最终做到设定误差小于0.3dB。
5.3 多径参数的测量与标定
多径链路装好之后,第一步不是接评委的仪器,而是自己先把参数标定出来。我用双通道示波器同时测功分器输入和合路器输出,用示波器的延迟时间光标测量主径和延迟径之间的时间差。实测5米RG58电缆产生约25ns延迟,10米约50ns,和理论计算基本一致。要注意的是,电缆两端的SMA接头会额外增加几厘米等效长度,精确标定时要把这部分也算进去。
幅度标定则用连续波单频信号进行:固定频率1MHz,先把延迟径衰减器设为31.5dB(几乎关断),记下输出幅度U0;再把衰减器调到0dB,记下输出幅度U1。根据双径叠加公式,U1 = U0×(1+a),就可以反推延迟径相对于主径的比例a。我标定出来0dB时a约0.95,然后按0.5dB步进建立a值查找表,固件里设定“反射径相对电平-6dB”时,直接去查找表找对应的衰减器设置值。这一步如果不提前做,到现场临时调,时间根本不够用。
6. 系统联调与问题排查:实录与速查表
6.1 建议的调试顺序
整个系统联调时,我的顺序是“DDS单频 → AM调制 → CW键控 → 多径叠加 → 整机联动”。每一步都用一台示波器和一台频谱仪做对照,确认前一个模块输出正常再往后接。DDS单频测试时,重点看频率是否与设定一致,频谱上有没有多余的镜像;AM调制测试时,看包络对称性和调制指数是否线性;CW键控测试时,看包络沿和频谱边带;多径叠加测试时,看频域梳状凹陷位置是否和理论一致。
联调过程中不要嫌麻烦,每接一个模块就重新测一次频谱基线,因为你不知道上一个模块的正常输出在接入下一级后会因为阻抗失配变成什么样子。我就是因为在DDS后直接接了AD835而没重新测频谱,结果AM输出一直有奇怪的寄生振荡,排查了半天发现是DDS滤波器输出阻抗和AD835输入端没匹配好,加了一级缓冲器后就干净了。
6.2 高频问题速查表
下面这几个问题是我调测中和交流群里其他队伍遇到的典型故障,整理成表方便大家直接对照。
| 症状 | 可能原因 | 解决方法 |
|---|---|---|
| DDS输出频率≠设定值 | 频率控制字取整误差、晶振频率偏差 | 用频率计校准主时钟,按实际f_MCLK反向计算FTW |
| 输出幅度随频率升高明显下降 | 滤波器截止频率过低或运放增益带宽积不够 | 检查滤波器设计,换高带宽运放 |
| AM包络上下不对称 | 调制信号直流偏置没加对,或有负向削波 | 加大直流偏置,调低调制信号幅度 |
| AM包络有周期抖动 | 用了DDS内部幅度寄存器做调制,刷新速率不足 | 改用外部模拟乘法器 |
| CW键控伴随“咔哒”声 | 包络沿过陡,键控边带过宽 | 在开关控制端加RC斜坡整形 |
| 多径叠加后高频衰减严重 | 延迟电缆或功分器在目标频率插损过大 | 换用更高带宽的电缆和功分器 |
| 多径时延和理论值差很多 | 电缆速度因子不是0.66、SMA接头附加延迟 | 用示波器实测标定,不要只看理论值 |
| 合路输出有驻波起伏 | 合路器端口没端接好,反射过大 | 检查所有端口的50Ω匹配和连接扭矩 |
6.3 比赛现场的两个保命建议
带过比赛的人都知道,现场演示和实验室调试完全是两码事。第一个建议是做一套“参数预设矩阵”:把题目可能要求的频率、调制深度、多径时延、多径衰减组合成编号,比如场景1是1MHz载波加30%AM无多径,场景2是5MHz载波加CW键控加200ns多径-6dB衰减,做进一个表格存到固件里,现场评委念参数,直接按编号切换,比现场拧衰减器、键盘输入快得多,也稳得多。
第二个建议是准备一个“快速验证信号链”的测试脚本:开机以后按一个键,系统自动依次输出1MHz/5MHz/10MHz三个单频并把频率误差打印到屏幕上,然后输出调制指数50%的AM信号1秒钟,再输出20WPM的CW测试音1秒钟,最后切到预设的多径场景。评委看到这一套下来,就知道你的系统是完整自洽的,印象分能拉高不少。
从方案定型到最终提交,我们真正花在硬件上的时间其实只有两周多,剩下大量时间都耗在标定和排障上。DDS、AM、CW这些模块单独拿出来都不难,难的是把它们的指标放到同一套系统里还能互相不干扰。多径部分尤其要提前标定,因为它是整个题目里最依赖实测数据、最不能靠“感觉调”的模块。如果你正在备赛,建议重点花时间把多径链路的时延-衰减查找表做得细一点,这个表做扎实了,现场无论评委怎么变着花样出题,你都能稳得住。