今年运气好,拿了省一,评测还是第一,综合第二,有幸被组委会邀请去打了 TI 杯模拟系统专题/邀请赛(以下简称模邀)。但是非常遗憾,棋差一招,最后还是没有拿奖……感觉也没有什么办法,前期准备其实也没有很充分,菜就多练,只能说是……

比赛情况

先来说一下比赛情况叭,比赛时长约 40 h,从第一天早上 7:00 在检录处开始检录,一直到第二天晚上的 23:00。断网,通信设备也会被收走(不允许与外界交流,手机、平板一律上缴,会封在一个袋子里)。能带进去的东西只有你电脑中的资料、纸质材料和组委会官方认定的模块,其他的东西一律不能带进去,像串口屏之类的也不能带(组委会有说明)。但是,组委会不强制要求你一直待在实验室里,吃饭、上厕所什么的都不限制(当然,不同队伍之间交流肯定是不可能的),其中最关键的一点是,不限制你晚上休息的场地,你只要登记一下,就可以出实验室回酒店休息(当然,被封禁的通信设备是不可能拿回来的,但是如果……只能说限制得没有那么死,所以可以查阅方案并进行理论层面的验证。用大白话来讲就是,你要作弊,是拦不住的。不过我们基本上就是到点就睡了,头脑风暴真的太累了)

赛题选择

赛题的话一共是一道电源(A 题)、两道信号仪器(B 题和 C 题),以及一道测控题(D 题),主控必须选择用 TI 的开发板,相关型号也已提前通知。这个信息是组委会的老师在没有发赛题之前就告诉你的,所以可以在这个时间(公布赛题大致方向到正式拿到赛题之间),先想好自己重点看哪些题。作为一向只做信号和仪器仪表的题目的人,我们也是重点看了 B、C 两道题,但是在我冲出去的时候,已经没有能选 C 题的机会了(抢题真难绷),所以只能被调剂到 B 题了,要不然晚一点 B 题也没有了。

简单说一下题目详情,因为 B、C 两题看得比较多,所以会重点说明,其他题目略说:

  • A 题: 一道 UPS(不间断电源)。
  • D 题: 一道带角度补偿的电子秤。
  • C 题: 制作一个矢量电压表,输入两路信号(同频同相),要求装置能在 500 多 kHz 到 1.6 MHz 的频率范围内进行 90° 相移(1.6 MHz 约为 500 kHz 的三倍),可测其峰峰值、频率和相位(即高级锁相放大与矢量电压测量)。
  • B 题: 基于可见光通信的网络特性测试仪。待测网络为未知 RLC 线性网络,其上下限截止频率在 200 Hz 到 2 kHz 之间,具体要求如下:
    1. 信号源发端要求: 发端装置需产生正弦波测试信号,峰峰值 VppV_{\text{pp}}1 V3 V1\ \mathrm{V} \sim 3\ \mathrm{V} 范围内可调,步进 0.1 V\le 0.1\ \mathrm{V};频率在 10 Hz20 kHz10\ \mathrm{Hz} \sim 20\ \mathrm{kHz} 范围内可调,步进 10 Hz\le 10\ \mathrm{Hz}
    2. 可见光通信与信号复原: 信号发生装置与信号接收装置之间不得有任何电气物理连接,仅允许使用可见光进行无线信号与数据通信(要求适应环境光干扰)。在发端产生 19 kHz20 kHz19\ \mathrm{kHz} \sim 20\ \mathrm{kHz} 的正弦信号时,接收端能够稳定复原并显示该正弦波信号,要求波形稳定无失真、无抖动、无漂移,并准确显示对应频率和峰峰值。
    3. 网络幅频与相频特性测试: 测试信号接入未知 RLC 网络后,接收端需能够定性/定量显示该网络的幅频特性曲线相频特性曲线,并能自动标出/显示其上下限截止频率(3 dB-3\ \mathrm{dB} 频点)坐标值。
    4. 冲激响应与极值统计: 发端向待测 RLC 网络施加冲激/阶跃激励信号,接收端要能实时测量并显示网络的冲激响应曲线,并自动统计并显示其非零极值点的个数
    5. 其他约束: 接收端要求无复杂按键(一键启动/全自动测量);赛题严格限制设计报告篇幅不超过两页(需极简排版并包含测试数据、原理与曲线图)。

方案构筑与理论支撑

核心架构与通信链路

在方案上,我们以 TIMSPM0G3507 作为核心板,通过板载 DAC 生成测试与扫频信号,冲激信号则由板载的任意 I/O 生成阶跃信号。通信方式则是通过串口进行光信号通信,即利用串口产生的方波脉冲信号,驱动白色 LED 进行信号传输(这个方案的逻辑是,串口仅有一个写端 TX 和一个读端 RXTX 生成方波信号,我们传输的也是这个方波信号,只要保证方波信号没有什么特别大的问题就可以了);在收端则是通过光敏三极管与电源,直接将串口信号还原,然后送入单片机中进行处理。

在电路上,除了上述提到的内容外,还构筑了一个有 6 个按键的键盘,以及一个通过一路 I/O 控制信号导通的电路(用于决定光路传输的是正弦波处理后的方波,还是信号生成的相关信息)。

特定频率信号还原

要求 2 所涉及的信号仅需要在特定频率范围内还原,且只提出了频率方面的要求,所以在电路上,选择将生成的信号先通过比较电路整理成方波,再通过 LED 进行光通信;在收端进行过零比较、滞回比较和低通滤波,必要时进行放大,即可还原出一个同频锁相的信号(理论上来说,假设装置稳定,是不需要对信号进行锁相处理的,因为传输的光信号只有延迟;如果采用滤波的方式,只要保证所有模块电路都不会产生相位抖动即可)。

幅频特性测量与网络截止频率

幅频特性测量方案是通过扫频,同时通过光路建立串口通信,将生成的频率和幅度信息实时传输到另一块板子上,在收端复用光通信方波的整形电路,从而建立光通信;从未知网络中出来的信号,则要通过调理电路对信号进行抬升、衰减处理,然后用 MSPM0G3507ADC 读取信号,必要时使用 FFT 做相关运算。

理论公式: 对于未知二阶 RLC 滤波网络,其传递函数为 H(s)=Y(s)X(s)H(s) = \frac{Y(s)}{X(s)},频响函数为:

H(jω)=H(jω)ejφ(ω)=A(ω)ejφ(ω)H(j\omega) = |H(j\omega)| e^{j\varphi(\omega)} = A(\omega) e^{j\varphi(\omega)}

幅频特性(对数形式):

A(ω)=20lg(Vout(ω)Vin(ω))(dB)A(\omega) = 20 \lg \left( \frac{V_{\text{out}}(\omega)}{V_{\text{in}}(\omega)} \right) \quad (\mathrm{dB})

上下限截止频率(3 dB-3\ \mathrm{dB} 频点 fL,fHf_L, f_H)判据:

A(fL)=A(fH)=Amax3.01 dBA(f_L) = A(f_H) = A_{\max} - 3.01\ \mathrm{dB}

相频特性测量

相频特性测量方案在通信部分与幅频特性测量方案差不多,而在处理部分,按原先计划,是将从未知网络中出来的信号做一次过零比较之后再进行相乘,然后经过一个低通滤波器,即可将相位信息转换为与相位差呈线性关系的直流量,最后再用第二路的 ADC 采集并进行相关运算。

理论公式: 设输入基准与未知网络输出的两路整形方波基波角频率均为 ω\omega、幅度为 ±Vm\pm V_m。经傅里叶展开后,方波相乘会包含各奇次谐波之间的乘积项:

v1(t)=4Vmπn=1,3,1nsin(nωt)v_1(t) = \frac{4 V_m}{\pi} \sum_{n=1,3,\dots}^{\infty} \frac{1}{n} \sin(n\omega t)

v2(t)=4Vmπn=1,3,1nsin(nωt+nΔφ)v_2(t) = \frac{4 V_m}{\pi} \sum_{n=1,3,\dots}^{\infty} \frac{1}{n} \sin(n\omega t + n\Delta\varphi)

经乘法器与低通滤波器(LPF)滤除交流项后,输出直流平均电压满足三角波式的线性鉴相关系:

VDC=Vm2(12πΔφ)(Δφ[π,π])V_{\text{DC}} = V_m^2 \left( 1 - \frac{2}{\pi}|\Delta\varphi| \right) \quad (\Delta\varphi \in [-\pi, \pi])

同时,光信道及调理电路的群时延 τdelay\tau_{\text{delay}} 引入附加相移 Δφdelay=2πfτdelay\Delta\varphi_{\text{delay}} = 2\pi f \cdot \tau_{\text{delay}}

冲激响应与非零极值点提取

冲激响应部分计划做一个推挽电路,从而使阶跃信号的上升时间足够短(也就是压摆率足够大),然后再按照幅频特性测量的方式处理。非零极值点的计算没有什么技术含量,ADC 采进来就是一个数组,比较前后三个数据即可。

理论公式: 通过单位阶跃响应 s(t)s(t) 的微分求取冲激响应 h(t)h(t)

h(t)=ds(t)dt=L1{H(s)}h(t) = \frac{\mathrm{d}s(t)}{\mathrm{d}t} = \mathcal{L}^{-1}\{H(s)\}

对于二阶欠阻尼 RLC 振荡网络,其冲激响应为:

h(t)=Keαtsin(ωdt+ϕ)h(t) = K e^{-\alpha t} \sin(\omega_d t + \phi)

非零极值点由导数零点及门限判定:

dh(t)dt=0h(t)>Vth\frac{\mathrm{d}h(t)}{\mathrm{d}t} = 0 \quad \text{且} \quad |h(t)| > V_{\text{th}}

在离散采样序列 y[n]y[n] 中满足:

(y[n]y[n1])(y[n+1]y[n])<0y[n]>ε(y[n] - y[n-1]) \cdot (y[n+1] - y[n]) < 0 \quad \text{且} \quad |y[n]| > \varepsilon

方案构筑问题复盘

乍一看,无论从电路还是单片机实现来看,这个方案本质上都没有什么特别大的难点。但是,从方案构思的角度来看,它应该存在比较严重的问题,最严重的问题应该在相频部分:

  1. 无法区分超前与滞后(符号死穴): 方波相乘低通滤波后得到的直流输出是绝对值 Δφ|\Delta\varphi| 的偶函数(即 VDC(Δφ)=VDC(Δφ)V_{\text{DC}}(\Delta\varphi) = V_{\text{DC}}(-\Delta\varphi))。对于 RLC 网络,容性超前(Δφ>0\Delta\varphi > 0)与感性滞后(Δφ<0\Delta\varphi < 0)输出的直流电平完全一样,单路乘法方案在数学上天然缺失了相位正负的判别能力,相频曲线在正负区间会直接折叠。
  2. 光信道时延带来的动态相移混淆: 可见光链路和模拟调理电路存在固定的时间延时 τdelay\tau_{\text{delay}},在扫频时会产生随频率线性递增的相移 Δφdelay=2πfτdelay\Delta\varphi_{\text{delay}} = 2\pi f \cdot \tau_{\text{delay}}。当总相移跨越鉴相线性区边界(00^\circ±180\pm 180^\circ)时,直流电平会产生三角波折叠;由于第 1 点中绝对值符号丢失,在软件算法上根本无法进行逆向的延时减法补偿。
  3. 微弱信号过零抖动: 未知网络在截止频率外的阻带衰减较大,输出信号微弱且过零斜率极小。比较器在过零点极易受噪声扰动产生多次翻转的高频振荡,导致方波占空比失真,经过乘法低通滤波后的直流电平严重漂移。
  4. 低频场景下的策略失误: 本题最高频率仅 20 kHz20\ \mathrm{kHz},本可以直接将两路整形方波送入单片机定时器,利用输入捕获测量上升沿时差 Δt\Delta t;或者使用双通道 ADC 同步采样,再在软件中计算。输入捕获天然能通过边沿到达的先后次序直接判断超前/滞后,且延时补偿是纯线性时差运算;采用“方波乘法器 + 模拟 LPF”属于用高频硬件鉴相思维做低频题,平白增加了硬件故障率并带来了无法解算相位的死穴。

也许是更优的选择?

在最后的优秀作品展出环节,我也看到了其他小组的方案,在这里按方案归纳并整理出一些值得参考与优化的部分:

参考方案一:电子科技大学

  • 光触发硬同步与双核定时器对齐: 发射端在扫频切换时,利用特定频率/特征光脉冲触发接收端;两端 MCU 借助片上高精度高频定时器进行时基对齐。
  • 全同步采样与插值 FFT 提取幅相: 依靠硬同步时基,接收端启动 ADC 同步双通道采样,采用插值 FFT 算法同时提取出未知网络的幅度与绝对相位差,彻底摆脱了硬件乘法鉴相的象限歧义与时延漂移。
  • 硬件 PWM 阶跃激励 + 软件差分求冲激: 冲激响应部分利用 MCU 产生极短上升沿的 PWM 阶跃信号注入 RLC 网络,在接收端对采集到的阶跃响应序列进行离散差分运算(h[n]=s[n]s[n1]h[n] = s[n] - s[n-1]),避免了窄脉冲硬件大电流冲击与压摆率饱和失真。

参考方案二:浙江大学

  • 全数字化特征提取与 Goertzel 算法加速相频: 放弃易出错的硬件鉴相器,双路信号调理后直接经片上双路同步 ADC 采集。针对扫频过程中每个已知的单频点,利用单点 DFT / Goertzel 算法替代全序列 FFT,运算开销骤降一个数量级,保证了极高的扫频刷新率与相位符号的绝对确定性,并结合过零点时差测量消除超前/滞后混淆。
  • 幅频/相频联合 IFFT 逆变换重构冲激响应: 在扫频过程中测出网络的完整频响函数 H(jω)=A(ω)ejφ(ω)H(j\omega) = A(\omega)e^{j\varphi(\omega)} 后,直接在软件算法中进行逆傅里叶变换(IFFT),数学重构出系统的单位冲激响应 h(t)h(t)。完全规避了硬件额外设计大电流、高压摆率脉冲发生电路带来的寄生参数和过冲振铃缺陷。

复盘分析

  • 个人准备不充分: 这是最关键的问题,前期没有针对矩阵键盘和代码编写进行训练,也没有对模拟电路及常用元器件的电路图做相应准备。特别是单片机部分,准备阶段我个人只用 AI 写了用户库,却完全没有考虑这些用户库该怎么调用;队友之间沟通也没有很到位,只是机械地写代码、测试、写代码、测试。另外,我用 AI 写的 APP API 库太踏马完善了,最后堆成了一座相当逆天的屎山,在赛场上其实大部分时间都在找屎山中的问题……
  • 策略与节奏失误: 赛题拿到之前其实压根没想过一定要做仪器题,所以拿到题后,A、D 两题其实也做了相应的分析,结果抢题的节奏就没把握好;整个 Day 1 的上午都在分析赛题,根本没有考虑要先进行测试,应该先做相应的测试,再一步一步想方案。Day 1 的进度太慢,导致 Day 2 根本没有对应的时间进行联调;而且我当时过于理想化,因为想着能大概率全做完,所以 Day 1 浪费了很多时间。我当时主要负责硬件,却没有考虑去看芯片的应用电路和内部结构图(之前都会老老实实看完的,可能也是受赛场影响太紧张的缘故),导致 Day 1 调试一个非常简单的过零比较电路都折腾了半天,最后才发现需要加一个上拉电阻。发现之后还在沾沾自喜,现在回想起来甚是羞愧……代码方面则浪费了半天时间在那个莫名其妙的 DDS 模块上面,最后发现还是用板载的 DAC 会更好一些(毕竟准备阶段对应的库函数都写好了)。
  • 执行速度不够: 大概是手脚不够快,也可能是没有特别紧张,导致完成的模块不多,也不够到位。

其实从结果的角度去看,完成第 1、2、4 问以及第 3 问的幅频部分并不难,相频可以放最后去做,没调通也无所谓,至少不会像现在这么狼狈,最后就只剩下一个成功参赛证明……

两届国赛都没有拿出很好的成绩,大概,这就是人生吧,也是充满了遗憾……大学毕业以后,应该也没有这种机会了,也不能再体会到这样公费旅游般的兴奋感了……

一些传承

从复盘分析当中可以看出来,我个人觉得我们这次失败的主要原因是因为前期准备不充分导致的。如果之后的学弟学妹们有参加这个比赛的机会的话,在准备阶段可以参考一下 下面的内容:

  • 代码方面: 因为是封闭式的比赛,所以在代码方面,首先要解决的事情是,你要有一个好用的、本地部署的AI模型,并且可以让他嵌入到Agent当中进行使用,这样的话,你们的代码压力会小很多,因为一只电赛队伍一般是三个人,按照一个硬件手一个软件手一个全能手的配置来看,至少要有两个人部署过AI;除此以外,就是前期的 MSPM0 的用户库,一定要自己进行手搓,重点跑的是:ADCDACSPI串口I2C按键GPIO输入捕获还有一个能够正常进行使用的不带存储介质的液晶显示屏(我个人在准备阶段的话,我们主要调的就是一个硬件I2C的OLED和一个SPI通信的3.5寸液晶屏,都要准备),特别是ADC和DAC。

  • 硬件方面: 从硬件的角度来看的话,拿到元件清单第一步先看,有没有电源相关的内容,不要指望一个直流稳压电源能够给所有的东西进行供电。像我们学校常用的 G3507 单片机,是用3.3V进行供电的,而一般情况下,我们都会选择使用 5V 或者 ±10V 进行供电使用(模邀赛题大多数情况下不限制电源的使用,但是只提供 2对 ,也就是 4根线 进行连接)。所以拿到赛题第一步,在硬件方面先做一个稳压电路用于解决单片机的供电需求。准备阶段的话重点要解决两件事:在自己电脑上安装几个离线的滤波器设计软件,如 Filter Solution、TI 的 Filter Pro(通常情况下这个用不到);锻炼自己的焊接能力(比赛期间基本上就是蹲在桌子前面猛猛吸烟了),至少自己要会掌握在洞洞板上进行贴片元件的常规焊接操作。如果说还有什么的话,就是基础运放电路整理以及数电模电书多翻翻(特别是一些比较少见的数电常用芯片,基本上大家都不是很care这个东西,所以可以多看看,特别是cd4046这款锁相环芯片,最好基础电路去搭几个玩一下)。

  • 资源方面: 别听xiexie的,焊锡丝就直接带两卷新的过去,他给你们剪的那点到场肯定是不够用的;然后就是,一定一定一定要准备一个矩阵键盘,不要把时间浪费在这种控制界面上;往期赛题可以查看德州仪器校园计划的公众号,解法可以找找 复旦陈光梦老师 相关帖子,以及一些来自成电、南大的大佬的类似的blog。

写在最后

加油少年们!!未来属于你们!!!