2023年电赛国赛结束后的那个晚上,我们没有去聚餐庆祝,而是坐在基地里把四天三夜的工作记录从头翻了一遍。屏幕上还有没来得及保存的波形截图,焊台旁边留着一段剪断的电源线。那一刻我忽然意识到,真正让一支队伍拉开差距的,不是谁的方案更高级,而是那些在赛前被反复忽视的小决策:选哪道题、电源怎么布局、数据用什么统一口径、现场操作卡写到什么程度。这篇复盘就是把这段经历完整拆开,讲一讲一支三人队伍从省赛一路走到国赛,在选题、硬件、软件、现场测评和赛后复盘里踩过哪些坑,也希望能给准备参赛的同学和带队老师一点能用得上的经验。
1. 从省赛到国赛:我们是怎么把备赛状态调整到"能打硬仗"的
1.1 三个人,三种角色,但必须共用一套语言
电赛队伍通常就是三个人,最常见的组合方式是一个主攻硬件、一个主攻软件、一个做系统整合。我们当时也基本按这个逻辑分工,但中间经历了不少磨合,所以我先把这套配置的逻辑讲清楚。
A同学对电源和模拟电路最熟,负责DC-DC电源模块、运放调理、保护电路这些"低压稳不稳、信号纯不纯"的事情。我主要写单片机程序,负责显示、按键、数据采集、通讯和后面的校准算法。另外一位同学偏系统整合,从整体方案到操作界面,再到最后的设计报告和测试记录都归他管。
这个分工看着简单,真正难的是三个人必须共用一套术语和文档规范。刚开始我们经常出现类似"硬件说改了引脚,软件还在用旧定义"的情况,为了排查一个小问题浪费半个小时。后来定了一条规矩:任何硬件改动,不管多小,修改完后必须在二十分钟内同步到共享表格里,写上改动内容、影响范围和是否重新测试。这条规矩让我们在正式比赛那四天里少吃了很多亏,因为电赛的改动是高频发生的,今天上午飞一根线,下午程序就要跟着适配,没有同步机制基本等于在泥潭里转。
如果是第一次组队,我建议在省赛前就把这种分工和同步方式固定下来,而不是等到国赛才临时磨合。共同语言还包括"这个引脚现在是什么电平"、"这个信号是模拟地还是数字地"、"这个量是显示值还是测量值",听起来都是小事,但在凌晨两点的时候,这些术语的混乱会造成大问题。
1.2 赛前四周:题可以不刷多,但模块库必须落地
备赛期很容易陷入一个误区:疯狂刷往届真题,觉得题目做得越多越稳。我们组在准备2023年国赛时,前两周也刷了一些往年题目,但后两周基本不做完整新题,转而做一件更实用的事:把手上所有要用的模块整理成可以直接拼装的"积木库"。
这个积木库不是简单地把模块买回来插一下,而是给每个模块建立一张参数卡。比如电源模块,我们会标注实测最大输出电流、纹波大小、静态功耗、是否容易受到负载突变影响;DDS波形模块,我们会标出频率范围、幅度稳定度、以及不同频率下是否需要软件补偿;OLED屏和按键部分则整理成统一驱动函数,确保任何一道题拿来都能直接调用显示框架。
这样做的好处,到了比赛时体现得很充分。题目一出,我们不需要再花时间去验证某个模块能不能用,而是在基于赛前测好的参数去判断"这个模块放到这个系统里够不够用"。备赛阶段另一个容易被忽略的事情是建立测试记录表。我们之前参赛时吃过亏:比赛结束后写报告,结果想找某个频率点的输出电压数据,翻遍手机相册和草稿纸都没有完整记录。这次我们准备了一个共享Excel,内容很简单:日期、测试对象、输入条件、输出数据、仪器型号、记录人。这个表后来直接变成了设计报告里数据部分的素材,也让现场测评时面对评委提问能够从容回答。
1.3 设计报告不是最后一天的事
很多队伍把设计报告当成最后一天晚上的任务,这其实是最危险的想法之一。电赛的评分里,设计报告占的比例不低,而且报告内容和现场实测数据高度挂钩。如果最后一天才写,很容易出现"数据总结不一致"、"测试条件写不完整"、"方案框图与实际结构对不上"这种情况。
我们在赛前四周定了一个原则:报告素材跟着比赛进度走。训练期间每完成一个关键模块的测试,就写一小段方案说明和测试记录,放到共享文档的对应章节里。这样到了比赛第四天要交报告时,我们只需要整理和润色,而不是从零开始回忆四天里做了些什么。特别是测试数据这一块,尽量做到"每个指标都对应一个明确的测试条件",比如输入信号频率是多少、负载是空载还是带载、用的测量仪器是哪一台。这些细节在现场测评时经常被评委问到,能答得清楚就很加分。
2. 拿到赛题后的第一个小时:一次关键的选题决策
2.1 读题阶段我们在纸上写了什么
比赛题目发布后的第一个小时,我们不写代码、不画原理图,而是干三件事:拆解评分点、盘点手里模块、评估队伍短板。
具体操作是拿一张A4纸,把每一道题的要求抄下来,然后分成两列——"必须达到的指标"和"加分/拓展指标"。必须达到的指标里再进一步细分,看看哪些是依靠成熟方案就能稳拿的,哪些是需要现场临场开发的。这个步骤非常有必要,因为题目里的指标往往写得很密集,第一次读很容易忽视某些隐藏条件,比如"输入电压变化范围"、"负载调整率要求"、"信号最大频率范围"等。
接下来对照我们赛前整理的模块库,估算每一道题需要重新开发的部分有多大。比如有一道题看着功能不多,但要求一个很干净的模拟电源,而我们手上没有太合适的模块,如果硬选,前期的电源调试就会吃掉大量时间。另一道题涉及结构装配,我们队伍没有人擅长做机械,工具也缺,直接放弃。通过这种方式,我们很快就把选择范围缩小到一道以信号发生与测量为主的题目上。选择它不是因为题简单,而是因为我们在这条链路上有真实的技术积累,能比较确定地做出保底分。
2.2 为什么不选看起来最容易的题
这里想多说一句选题哲学。我发现很多队伍倾向于选功能清单最短的题,理由通常是"看起来简单、好做完"。但从我自己的观察来看,这类题目往往把分数压在极少数的核心指标上,一旦指标不够好,评分区间很窄,很难拉开优势。
我们当时没有选那道看起来门槛最低的题,因为仔细拆下来,它的核心指标对温度漂移和长期稳定性要求很高,这类问题恰恰是短期作品最难做好的。而我们选的信号类题目虽然功能多一点,但每一项的评分权重都比较分散,系统里就算有一两个指标没做到顶尖,只要大部分指标都达到基本线,总分也不会差。
实际结果也证明这个选择是对的。现场测评时,评委操作了多个测试项,虽然每一项都不是满分,但累计起来分数很稳。这给我的体会是:竞赛评的是"你做到多少",不是"你题目选得多难",更不是"你的方案看起来多高级"。拿有限的时间换确定性的分数,才是最重要的。
2.3 当天下午就定下来的整体方案
选题确定之后,当天下午我们就画定了系统框图,整个过程没有什么反复。主控选了一颗熟悉的ARM Cortex-M4处理器,自带浮点运算单元,做校准计算和快速傅里叶变换比较方便。信号生成部分用了DDS方案,主控通过SPI接口配置频率和相位,后级再接程控增益放大器做幅度调节。
测量部分,我们用比较器加定时器输入捕获来测频率,用外置ADC模块来测幅值,同时把一些按键、编码器、OLED显示这些交互层提前跑通。电源板单独做一块,提供多路输出给模拟和数字部分使用。这套方案不是赛场上最花哨的,但我们很清楚每个模块的脾气:它们在我们备赛时都被单独测过,组合起来以后,最大的风险其实集中在系统级的干扰和校准,而不是某个芯片能不能工作。
当天下午我们就把这个框图发给了指导老师确认,老师说了一句话我到现在还记得:"你们这套方案,赢不了最快的,但能保证不崩。"后来想想,这话还真说到了点子上。
3. 硬件底座的搭建与纠偏:电源、主控、信号链路的实战选择
3.1 电源系统:多数翻车事故的第一现场
电源是整个作品里最容易在整机测试时出问题的部分,没有之一。我们最初的设计是三路输出:正负5V给运放和模拟链路,3.3V给数字逻辑和DDS模块。选型时图省事,负压一路用了一个小型电荷泵加后级LDO,单独测这块板子时纹波还能控制在可接受范围,结果一接到DDS和运放,纹波直接到了80mV左右。
80mV的纹波对数字电路可能没什么影响,但对模拟信号输出来说就是灾难。示波器上看到的波形边缘全是毛刺,幅度稳定性也不行。赛前训练时我们其实就遇到过类似问题,所以这次没有犹豫,直接把电源架构改了:正压部分换成一棵成熟的降压开关电源做前级,再用低噪声LDO做后级稳压;负压部分换成隔离型电源模块,不再用电荷泵那种压纹波很吃运气的方案。同时把3.3V的数字电源与模拟电源用磁珠做了单点汇接,避免数字开关噪声通过电源平面串进模拟链路。
这里可以给一个很实用的选型建议:不要在比赛第一天做电源创新。尽量选择自己摸透的拓扑,并且给电源预留后级滤波焊盘的位置,这样现场即使发现纹波超标,也能快速补一个LC滤波或者加大电容验证。电源板最好单独做,和主控板、模拟板之间用插针或者杜邦线连接,方便飞线调整。如果一开始把电源深埋在整机内部,后期想换器件就麻烦了。
下表是我们这次电源系统的粗略分配,供参考:
| 电源轨 | 主要负载 | 典型电流 | 选型策略 |
|---|---|---|---|
| 正5V | 运放、DDS模拟部分 | 约250mA | 开关电源预稳压,LDO后级输出 |
| 负5V | 运放负电源 | 约120mA | 隔离电源模块,避免电荷泵纹波 |
| 3.3V数字 | 主控、显示屏、通讯模块 | 约300mA | 独立LDO,数字模拟地单点连接 |
| 3.3V模拟 | 高精度参考源 | 约20mA | 从主电源经磁珠后再接第二级LDO |
3.2 主控与波形生成芯片:性能冗余不是越多越好
主控的选择上,我们当时对比过几颗芯片,最后选定了内置浮点单元的ARM Cortex-M4。原因是系统里有两个计算量不低的任务:一是频率测量后的数据处理和校准表插值计算,二是显示界面和实时控制回路的刷新。浮点单元能让这些计算直接在主控上跑,不需要为了实现算法额外加一块DSP。
波形生成部分,我们最初也犹豫过要不要上更高精度的DAC。后来把一个关键点想明白了:系统输出的最终精度瓶颈往往不在DDS芯片的分辨率位数,而在后级放大器的噪声、电源的质量,以及参考电压是否稳定。如果前级DDS精度再高,后级电源纹波很大,输出的波形一样失真。所以我们把精力主要放在参考电压的稳定和运放选型上,而不是单纯追求DAC位数。
参考电压这一细节值得展开讲。DDS芯片的输出幅度通常和参考电压成正比,参考电压一旦漂移,输出幅度就跟着飘。我们给模拟部分单独安排了一颗高精度基准源芯片,并且用独立的一路LDO给它供电,不和主控数字部分共用电源。这个改动让输出幅度在半小时内的漂移明显变小,也大大降低了软件校准的复杂度,因为校准表不用反复重做。
3.3 PCB与接线:地回路比"走线好看"重要得多
由于比赛时间有限,我们没有等完整的PCB打样,而是用洞洞板和飞线搭建了第一版原型,一边调一边改。这种做法很适合电赛前三天,因为改线速度快,踩错了能马上拆了重来。但它对地线设计提出了更高的要求,稍不留神就会引入地环路。
我们踩过最典型的一个坑:模拟地和数字地一开始直接连成一片,结果DDS输出波形里出现了一个约8MHz的杂散分量。频率不高不低,正好落在我们需要测量的频段附近,导致频率计偶尔被干扰跳变。用示波器逐段探查后发现,问题不在DDS芯片本身,而是数字部分的地电流返回路径穿过了模拟低噪区,形成了地环路电压。
处理办法是手动割一条地线,把模拟地和数字地分开,只在电源入口处单点汇接。改完之后,那个杂散分量彻底消失。这类问题在电路仿真软件里很难发现,因为仿真模型不会模拟出整机布线和地阻抗的分布,只有整机联调才能暴露。所以我建议参赛队伍从第一天搭建硬件开始,就有意识地养成"模拟数字分区,地线单点汇接"的习惯,别等出了问题再返工。
4. 四天三夜里的软件与联调:三个最典型的故障定位过程
4.1 输出波形总比设定低一截:从参考电压到软件校准
我们遇到的第一个软件相关现象,是设定输出幅度1.000V时,示波器测出来只有约0.8V左右。一开始怀疑程序里写幅度参数时单位搞错了,检查半天发现设置没问题,DDS控制字也对。后来把DDS芯片的参考电压引脚用了示波器探了一探,发现参考电压只有标称值的八成,问题出在硬件参考电平上。
更换参考电路后,幅度偏差缩小了,但仍然存在一个随频率变化的误差。原因是后级运放的增益会随频率上升而略有下降,这是运放带宽特性的自然结果,不是软件能靠"一个固定系数"解决掉的。我们当时的做法是写一段频率-幅度校准程序:在几个典型频率点先测出实际输出值,建立一张补偿表,然后其他频率用线性插值算出修正系数。这样处理后,输出幅度在整个工作频段内的误差能控制在0.5%以内。
这里可以给一段简单的伪代码示例,展示校准表怎么用:
// 频率-幅度校准系数表,freq单位为kHz // 测试条件:负载1MΩ,目标幅度1.000V const float freqTable[] = {1.0f, 10.0f, 50.0f, 100.0f, 500.0f}; const float gainCompTable[] = {1.000f, 0.997f, 0.985f, 0.962f, 0.913f}; float getCompensatedAmplitude(float targetAmp, float freq) { // 先找到freq在表中的上下界,做线性插值 float comp = linearInterp(freqTable, gainCompTable, sizeof(freqTable) / sizeof(float), freq); // 最终设置给DDS的幅度需要除以补偿系数 return targetAmp / comp; }这个思路本身不复杂,但要注意补偿表必须在整机状态下测量,而不是单独测一个模块时记录。因为整机状态下后级负载、线缆损耗和电源纹波都会影响实际输出,单独模块测出来的数据搬到整机上往往会有偏差。
4.2 频率测量偶尔跳变:先看边沿,再改程序
频率测量稳定后,我们又发现一个问题:输入一个干净的10kHz方波,显示值偶尔会跳到9.6k或10.4k,虽然次数不多,但现场测评时如果恰好被评委看到,印象分就丢了。一开始我们怀疑定时器捕获配置不对,或者中断优先级有问题,于是反复调代码,但问题依旧。
后来用示波器直接看比较器输出波形,才发现边沿处存在抖动:信号在阈值附近反复穿越,导致一次真实边沿被触发成了两次。解决办法分硬件和软件两条腿走。硬件上,给比较器增加正反馈回路,设置一个合适的回差窗口,滤掉阈值附近的抖动;软件上,对连续的频率测量值做一个滑动中值滤波,把偶发的跳变再次消除。
这个问题的启发是:当程序逻辑怎么看都正确时,一定要回头查硬件信号质量。很多队伍习惯先怀疑算法,狂改一气,最后发现是信号完整性问题导致的。联调时桌上随时放一台示波器,看真实波形,而不是只盯着屏幕上的测量结果。
4.3 无线模块整机联调时掉线:一个被误判为程序的伪故障
我们的作品里有一个用于与远端控制端通讯的2.4G无线模块。单独测试时一切正常,放到整机里联调时却频繁丢包,而且丢包没有规律。测了好几轮方向都指向软件协议,甚至怀疑是SPI读取冲突。最后在用频谱仪观察模块天线附近的频谱时,发现电源线上有一个明显的开关噪声峰,而天线正好贴着这根电源线的走线。
问题根源是天线近场耦合到了电源线上的开关噪声,干扰了无线模块的接收灵敏度。解决办法很朴素:把天线移动到PCB板边缘,远离电源走线,同时给电源线串了一个磁珠并加大电容滤波。改完之后,丢包率立刻下降了一个数量级。
这里也提醒一句:无线模块在比赛现场最好预先配置好固定通信频段和重传机制,别指望现场配对。我们额外准备了一块已经配置好的主控板作为备用,如果无线模块现场出故障,能最快时间替换。这种"备用方案"在电赛现场永远不嫌多。
5. 现场测评全记录:评委动手时我们提前做的那几手准备
5.1 演示脚本:不能只准备一条通往成功的路径
很多队伍在实验室里把功能调通之后,就以为现场测评只要照着演示一遍就行。实际上现场测评的评委不会完全按你的脚本走,他们更习惯自己操作,提出各种"额外条件"来验证作品的稳定性和真实边界。比如"把输出频率设为15.0kHz,幅度改为0.5V,测一下误差",或者"现在把输入信号换成一个更小幅度,看看显示是否还能跟上"。
我们当时准备了一份操作卡,上面写清每一类操作的按键路径和界面显示含义:从待机状态进入测量模式需要几步,切换波形类型是哪几个键,幅度和频率分别怎么调节。这些信息不需要多华丽,但要求队里的三个人都能看懂,哪怕正在操作的人紧张到说不出话,另一个人也能从旁边帮上忙。
这份操作卡在测评前还帮了我们一个忙:让我们提前发现,界面里有一个显示单位的切换方式太隐蔽,现场临时操作容易误触,于是赶在测评前改成了更直接的方式。作品做得好是一方面,但"别人能快速看懂并操作"同样重要,甚至可以说,这部分直接影响评分过程中的交互效率和印象。
5.2 现场烦人的电源噪声,以及我们提前留的接地端子
现场评测环境的电源质量,通常比实验室差很多。一个工位上可能同时插着示波器、频谱仪、电脑、我们自己作品的电源,各种设备的地电位不完全一致,会形成地环路和共模噪声。我们在实验室调得很好的作品,拿到现场测试时数据有明显偏差,用万用表量了一下,发现输入电源的纹波比实验室大了好几倍。
好在我们提前做了两手准备。第一,作品电源输入端设计了一个可换的接口板,如果现场发现供电质量差,可以快速在外部加一个直流稳压器再进设备。第二,我们在外壳上预留了一个接地端子,现场发现测量值偏大时,直接把接地端子接到评测工位的电源地端子上,共模干扰就被泄放掉了。这个问题如果事先没考虑,现场临时飞线会非常狼狈。
另外一个建议是:在关键测试点预留测试插针。比如电源轨电压、DDS输出、比较器输出,都可以通过分线插针引出。现场自检时用示波器探头往上一搭就能快速判断哪一级出了问题,而不是把整个外壳拆开。作为一个强调现场可控性的细节,这几次插针省下来的时间,至少有一次让我们避免了拆机返工。
5.3 问答环节和数据核验:报告上的每个数字都别"虚"
电赛现场测评通常会有提问环节,评委对设计报告中出现的指标数据会抽查。我们这个作品有一项指标写的是"频率测量误差小于0.1%",评委看完后直接问了一句"这个误差是在什么输入条件下测的?"幸好我们提前统一了测试条件,报告里写了"输入幅度1Vpp,频率范围100Hz到500kHz,室温环境下",评委又让我们现场重测了三个频率点,数据和报告都在容差范围内。
这让我意识到一个容易被忽略的事情:报告里的数据一定得能复现。如果只是在中途某一次测试中偶然测得一个漂亮数据写上去,现场重测时条件稍有变化就对不上,评委对整篇报告的信任度都会下降。我们后来定了一条死规矩:报告上的每个数据,必须来自正式的测试记录表,同时记录当时的仪器型号和测试条件。宁可数据普通一点,也不能写一个自己都没把握的数据。
还有一个细节:现场评委可能会操作你的作品去重现某个功能,如果操作过程中界面反应太慢,或者需要等好几秒才刷新,他们会很不耐烦。我们专门把显示刷新的延迟优化到几百毫秒以内,就是为了现场操作时跟手。这个观感上的优化,对最终的评分有一定正面作用。
6. 复盘:能走到国赛,靠的不只是努力,而是这几个习惯
6.1 整机测试越早开始,比赛结束前你能改的东西就越多
这是整个经历里让我最有感触的一点。很多队伍的习惯是第一天做硬件,第二天写软件,第三天联调,第四天收尾。这个流程听起来合理,但问题是第三天联调一旦发现整机级问题,留给你修改的时间基本没有了。
我们这次有意把整机联调的时间点往前挪:第二天晚上就进行了第一次完整整机测试,把电源、主控、波形输出、测量模块全部接在一起,跑一个最简单的闭环流程。从那天开始,每天晚上睡觉前都要做一次整机运行测试,每次至少跑半小时。正是因为提前暴露了地环路、无线干扰、校准表不完善这些问题,才能在正式测评前把它们逐一解决。
整机测试要注意"版本管理"。我们最初几次联调时没有记录当前硬件状态和软件版本的对应关系,测试中发现问题后,改了一处硬件,结果第二天做复测时忘了测试结果对应的是哪一版硬件,不得不花了很长时间重新验证。后来每次联调前,先在记录表里写清"硬件版本V1.2,软件版本V0.9",这个动作看起来机械,实际效果立竿见影。
6.2 测试数据统一口径,报告和现场才不会打架
测试数据这件事,我要单独立一条来强调。做电赛作品时,队伍里可能有手持万用表、台式万用表、示波器,甚至还有人习惯用简易电压表模块上面的读数。如果三个人各记各的,到了写报告和现场测评时,数据口径不统一,问题很严重。
我们这次统一了一个规则:所有正式测试数据,一律用台式万用表或示波器测量,手持表只用来做快速排查和粗测。报告上每一组数据,都来自正式的测试记录表,并标注测试仪器型号和测试条件。这样不仅写报告省事,现场被评委抽测时也能保证一致性。我还建议在比赛结束后保留所有原始波形截图和数据文件,按日期和测试点命名放入共享文件夹。即使比赛结束了,复盘时想追溯某个问题,也能快速找到当时的证据。
6.3 体力分配与心理预期:四天三夜不是靠熬夜赢的
关于四天三夜,我见过太多队伍前三天疯狂熬夜,最后一天测评时人已经处于半恍惚状态,操作失误和接线错误频发。我们队这次的节奏比较克制:第一天睡约五个小时,第二天睡约四个小时,第三天反而保持五个小时以上,第四天测评前的晚上更要稳定休息。
这不是说电赛不辛苦,而是说要让精力用在最需要判断力的时候。凌晨四点半最容易犯迷糊,我们队那次最严重的接线错误就发生在那个时间:把一条本应接到3.3V的线接到了5V,虽然器件没有烧坏,但排查花了快一个小时。后来我们达成一致,凌晨阶段只做重复性验证,不进行冒险改动。
心理上也要有预期管理。比赛题目永远做不完,但分数是相对指标,不是绝对指标。如果一直盯着"我们这个功能还没完善",容易陷入焦虑。我们当时的策略是"保底优先,拓展随缘":先把所有基础指标测稳定,确保现场能顺利复现,再考虑加分项。这个策略在测评现场让我们心态很稳,即使评委临时加测,我们也有底气去应对。
最后想分享一个小习惯,也是这次经历里我们最受益的:每天晚上收工前,在项目文件夹里写一个"明天要做什么"的清单,包括待解决问题的优先级、负责人和预计完成时间。第一次写的时候觉得浪费时间,后来发现第二天早上看到这份清单,整个人能快速进入状态,不会因为"无从下手"而浪费早上的宝贵时间。这个习惯不止适用于电赛,也适用于任何短期高强度的开发任务。参赛的同学们,比赛不是靠一个灵光乍现就能赢的,把每个环节的确定性攒起来,你离国赛拿奖自然就近了。