既然@零海星 已经这么快写了,那我也来写点

[2025G国一] Soleil 的 电赛回忆录

职位or分工:数字/软硬件接口

其实这个分工我现在看起来才比较合理,一开始我们三个人两个人软件位,最初定位一个人MCU一个人FPGA还是有点抽象的,但是也没找到什么好的分工方式,以至于在培训阶段相当于我和 @零海星 两个人并行做真题

至于打电赛这回事,其实去年也有在打,但是去年也可能是院赛题目略微抽象一点,总之就是很惨,可以参见 电赛破防24版 去年和@H3lium 以及另外一个队友组的队,当时也是经历了一个月的电赛培训(坐牢),比赛之前甚至还是信心满满,觉得院赛难度不大(年少轻狂bushi),准备起来应该不是问题,但是真等开始院赛之后就焦头烂额了,甚至我们比赛结束之后还和昱昱battle了半天(大二这次培训的时候昱昱还专门提了这事 说他也没办法很可惜

所以呢,经历了一个学期的沉淀,其实我逐渐意识到,电赛这个东西有的时候你看着好像可以做,但是你真到一上手把他它合并成一个系统来说的话是很难的,这也就是工程的一个难点吧。那这次电赛还是拉@H3lium组队,这次队友把@零海星 拉上了,于是三个人的队伍再次组建。再来打电赛,多少还是有着去年院赛没过的执念,其实一开始也没有抱太大的希望,尽力做好就好了。

我掌握的技能栈这一块的话感觉其实很杂,而且实际写代码也未必用很多

  • FDS 数据结构

  • 有限状态机的知识(这个在写代码的时候也很重要)

  • stm32hal库 的丰富调试经验(感觉这个是最最最重要的)

  • 一些常见单片机驱动库的编写与调试

  • linux相关的一些,Raspberry Pi边缘计算的算法等等 (不过在电赛里面其实没啥用,顶多是配环境经验丰富罢了x)

  • git git git 使用git来进行代码的版本控制和多人协作(这个也真的很重要)

stm32的开发这一块其实来说有很多细枝末节,各种寄存器的配置、时种树、DMA等等,这些涉及到硬件底层的配置往往是最难处理的,正确配置参数才会让你的32真的按照你的指令去工作,这一块有时间单出一个文章好了

那接下来流水账式的写写从培训开始到比赛结束都干了些啥。(之前还开了个一路楼来水水,不过其实也没有记录特别多的信息 欢迎来看看 开电赛破防楼最好的时间是一年前,其次是现在

春夏学期

其实这个阶段完全在划水,感觉微电子大二下 + 四门额外工高的课 强度是真的大(还不知天高地厚选了毛概),基本上从期末周前两三周开始,一直到电赛结束(now 大哭),才算说有好好休息的时候。这个阶段感觉是昱昱会按时启动他的安排——各组短期目标长期目标的设定和进度汇报, 我们的文档基本上就是把去年做过的拿上去水一水(bushi)

短学期培训阶段

直到短学期真正开始,才真正有时间来搞搞电赛。@H3lium 先是批量搞了好几个题目的板子,然后去忙他的创赛,然后我和@零海星 这边才逐渐动工(我们组还是偏数字方案组,基本上所有方案都是数字方案)

然后我这边基本上就是在做历年的真题,@零海星 先逐步熟悉开发环境和硬件平台

开发环境

我在做题之前其实也一直在整合开发环境,因为感觉keil + vscode + cubeide还是有点复古和难用,特别是keil的调试功能,很难用,有些断点关掉编译器优化之后还是停不住,遂放弃这个环境来寻找平替。

最后使用的方案是 gcc + cmake + Ozone方案 现在配环境的话st公司自己出了一个stm32cubeclt 这个还蛮好的,把大部分用到的编译器和其他工具都打包好了。 最后的配置是使用VScode集成cmake + ninja 来进行编译,然后通过Ozone进行debug(只支持dap link 和jlink) 或 openocd + cortex-m debug插件(都支持,但debug效果不如ozone),数据分析使用matlab

23H

第一个题是23H题来着,这个题我们去年也做过,但是就是锁相技术不好,我现在看来感觉是计算出来的相位信息不够精准,这个锁相做了快有三四天了,最后还好是做出来了(锁相这个技术也蛮关键的,甚至我们最后国赛也有另外一种方案就是锁相,但是时间来不及试错,就按原方案来了)

下图是最后的结果,很稳定的锁住了

怎么说呢,去年一直没做好的今年做好了,也是消除了去年的执念罢 至少自己是能做好的

lockPhase

19D

这题就是经典仪器仪表题了,思路是简单粗暴的,但是一上板子,那个信号的噪声巨大无比,所以这个题目就磨磨蹭蹭一直拖到最后,简单给老师验收了一下就结了

最后我们还是觉得 其实问题在电路板设计上,@H3lium 觉得可能是继电器线圈电流的影响(这里也是伏笔 导致我们后来使用了一个很垃圾的模拟开关 最后甚至一点没用)

也是这个题,我们搬到玉泉高分子来备赛,就很难绷也体会到了什么是电磁干扰

这个题就是如果信号输入是使用杜邦线的话,噪声就会奇大无比,也导致我们后面所有的信号线都使用信号屏蔽线来链接的了(SMA TO SMA/BNC)

同时这个题也锻炼了一个算法——如何在高噪声的环境下准确计算正弦信号的峰峰值,也对国赛很有用x

院赛阶段

做完昱昱让选的题目,其实也就差不多到了院赛的阶段,为了避免重蹈复辙,我自己又看了看zjb学长的院赛和综测资料,试图使用低通无源滤波器替代有源滤波,后面甚至真的在用了

第一天拿到题目,发现其实这个比以往院赛好了很多,没有限制LM324这种军工芯片,甚至给op07和op27 但是昱昱嘴上说限制运放数量,但是很多人用超了也不会扣分😠。

院赛部分其实本来没打算熬夜,我软件这边基本上一个上午加一个下午就写完了,相位计算也是23H写过了的,只需要好好写一个串口屏就行了,主要是这边串口屏绘制李萨如图有点麻烦,他的原生接口api不支持二维画图,后来翻了半天文档发现可以直接调用最底层的画点画线指令最后才搞出来。

院赛还是主硬件多一些,@零海星 去帮忙搞硬件,硬件锁相环参数调整还是很困难的,最后没办法被迫也是熬了夜最后才勉强搞定。

最后院赛验收的时候,也没有完成全频带的完全稳定锁相。 但是在绝大部分频段满足了题目要求,于是最后, 小组以第四名出线

院赛之后就是进行了一定程度的休整,后面来准备国赛

哦对,还有就是当时觉得19D噪声太大了,一旦链接杜邦线就会有很大噪声,为了避免这个噪声的干扰,如果从根源杜绝噪声的话,那就干脆全用sma来链接,于是我给老师发的f407zgt6画了一块扩展版,大部分用到的adc dac都用了sma接口转接出来,但是到货有点慢

省赛阶段

省赛题目的话我们选择的是25G题,这个题就是典型的信号题,要求模拟去搭一个滤波器去拟合一个给定的传递函数,然后制作出来的系统可以根据传递函数实现一些基本要求,发挥部分则是去实现任意给定一个未知模型,通过扫频学习然后进行输出

day1

第一天拿到题,一开始还有一个网线题,但是那个实在是不熟悉的领域,最后还是决定选G题这个传统信号题了。

商定题目之后另外两位队友就想出来一个“邪修”——用数字滤波器来搭建给定的传递函数,作为“已知模型电路”,但是我当时觉得太抽象了,然后正好那个时候组委会提问的ddl还没过,问过之后被ban了,在预期之内。

正式确定题目之后我们首先开始分析了下这个题目,要求可以稳定调幅和调频,通过数字设定,那这个就得使用高级点的dds模块了,后面我们商定觉得还是该用好点的dds ,就去选用AD9910了(不知道是不是我们带的,还是因为9910有任意波形发生功能,很多组都去用9910模块了,导致昱昱那9910模块也比较紧张)

初步分工就是模拟去搭电路,我来写9910驱动(因为从来没用过),然后另一位数字去做发挥部分的算法处理

到day1晚上,初步判断我们的方案是可行的,于是就三个人开始讨论软硬件联调的方案(这一步也是非常非常建议有的,感觉我们后面的work至少清晰了点,三个人的工作能并行起来),讨论的时间也比较久,三个人battle了半天,最后好像花了一两个小时来确定总体的流程图,下面就是最后讨论出来的结果

这部分是在git上扒出来第一天做的部分

9910的资料还是比较少的,最后也是改了好久才实现9910的全部功能

day2

第二天的话,我这边主要9910没问题,模拟那边打板结束,调参结束后进行联调,这个时候就出现了贯穿这几天最头疼的问题——精度误差与矫正,联调之后发现精度还行,但是需要进一步提高,就需要进行参数矫正

但由于另一位数字那边还没有完成后面的逻辑,我这边尝试提高精度,但是效果一般

不过这天也有收获,我后来把@零海星 那部分的fft峰峰值代码整合了进来,精度确实还可以

第二天的进度一般,主要还是等待模拟画完板子进行基础部分的上板调试阶段

day3

距离ddl越来越近也是有点紧张了,这一天我和模拟开始讨论总体的参数矫正方案,于此同时我在之前画的F407ZGT6的扩展版也到了,把扩展版做好之后就整体联调开始,中间发现模拟使用的运放NE5532增益带宽积GBW不够大,导致采样板会有较大的衰减,后来找老师平替了一块芯片才好

对于参数矫正而言,其实从单片机到最后输出端口,有:

  • dds ad9910 输出精度误差

  • 输出增益控制版不可避免的频率响应(主要误差1)

  • 已知模型电路本身误差(主要误差2)

  • 矫正adc读取误差

这几个误差叠加起来其实非常麻烦,我们day3开始搞,一开始有点效果,但是提升不大1.09V 和1 V之间的误差9% 已经很接近最低要求10%了,那万一环境一变,误差就上来了。

第三天是完全的被参数矫正这块乌云笼罩,我在凌晨1点左右(好像),再次试了一下参数矫正,用的是单片机的ADC来自动做反馈参数矫正,感觉效果还行,赶紧把参数保存起来。但是这只是做了一次参数矫正,还有其他环节的矫正

感觉正常作息做完无望,于是和另外一位数字开始了通宵

day4

最后在day4的上午完成了参数矫正部分,但是其实效果也一般(倒也算可以),参数矫正已经耽误了绝大多数时间,这个时候也已经中午了,另一位数字上午撑不住了先回去睡了一觉

从day3中午 直至day4中午结束,应该只睡了半个多小时

下午另一位数字来了之后,开始合并代码。

由于day3开始精神状态就已经欠佳了,而且基本要求的代码逻辑我其实蛮担心gemini写不好,只好我自己上手写,确实通宵的时候比较绝望,代码写的越来越史x

最后决定:由队友将他的代码迁移到我的代码上去 于是我们临时在github上建档,笨拙地进行多人协作

而这个时候最后一块板子的控制逻辑还没有写!!! 于是我们肉眼可见的慌了,想着先把系统整体搭出来,于是数字这边在写控制逻辑以及修补大大小小的bug,模拟去拿木板来固定制作的电路板和各种模块,这个时候爆了一个雷——

模拟那边使用模拟开关来选定信号通路的时候发现这个模拟开关比较垃圾,100kHz以上的信号输出就会失真,最后决定弃用模拟开关然后进行调整

距离封箱还有不到一个小时,我们急了,此时20分的报告还只有一个草稿底子,于是决定模拟和另外一位数字开始联调,我这边来写报告

写到一半,老师们就准备开始封箱的流程了——此时距离封箱还有30min,但是有的组已经封箱了,这无疑给了我们巨大的压力,这个时候又爆雷—— 但单片机一接入ADC就会进入Hardfault_Handler();函数,尝试多次未果,在严格约束上电以及测量流程后,才得以勉强规避

这个时候我的报告刚刚潦草写完,也刚好到了封箱的时候。

封箱之后感觉几乎毫无希望,心情沉到谷底,最后开玩笑的再拜了三拜,试图想像院赛那样祈祷有个好成绩

省赛测评

去测评的时候,虽然知道很没有希望,但是还是想着“万一呢”,决定尽力就好,测评的时候我把我们应该用到的资料又都理了一下,push 模拟把对应部分又看了一下,在省赛测评场地前前后后“刺探”消息,最后等到正式测评,单片机奇迹般的正常工作了,而且在测量发挥部分的时候,测评老师看我们效果比较好,甚至还叫来了一个专家来看我们的输出波形,也被专家小小的夸了一下

那个时候出来,根据测评表格,那我们的分数其实还蛮高的,这个时候的感觉很梦幻,很不真实,怎么单片机就好了,这至今是个谜

最后省赛结果出来的时候,还是昱昱私信给我说“你们组是G题第一名”,当时我在酒店(父母来探望我)看到消息,直接从床上跳起来脱口而出一个“我艹”,是真的很惊讶我们居然是G题的第一名

后来昱昱和别的队伍交流,提起我们组,后来和我们说我们和第二名的差距就在报告上,我们报告比他们多了两分

这个时候之后就开始准备综合测评了

综合测评

综测过程

综测主要就是纯模拟部分了,今年主要是要自己做一个vco 压控频率振荡器,我们的模拟是主c,我们两个数字负责打杂;前三四个小时 我们搞数字的来设计一些基本电路,接下来焊接;此时模拟正在设计VCO部分,后面模拟来接管战场,把参数调调好,最后提前10min左右有惊无险全部做出来

综测后感受

这里我直接把昱昱让写的综测心得贴了过来

这部分在16L 不知道怎么引用16L诶

国赛测评

这部分的话就是我们三个人做了12h的高铁护送作品到大连进行复测,其实还挺担心单片机会不会再次“抽风”,不过所幸结果是好的

以及国赛在大连理工的工程训练中心举办,那里也有很多大型设备(我估计高分子也是这个问题),电磁干扰比较严重,这时候不得不说我们组一直在用的sma to sma 线派上大用了,最后也是轻松复现结果

在上返程飞机之前收到喜讯,信电三组国一两组国二!

感觉在整个过程中真的是数不胜数的各种困难,也不能说全部都把困难cover掉了吧,但是至少还是马马虎虎都解决了,一路走过来,现在回看,其实当初也是有比较多的运气成分的,还好我们没有放弃,兢兢业业最后走到了最后,真的真的很不容易!!!

呜呜呜我的假期 历时两个月的电赛终于完结!

纪念最好的大二五组。 我们是冠军!