TI杯模拟邀请赛回顾
8月23日到27日在武汉大学参加了TI杯模拟专题邀请赛,在此做一个简单的回顾。
赛前准备
说来惭愧,今年邀请赛前我其实准备得不是很多。虽然提前一两个月就买了TI的M0G3507单片机,但是只是装了环境然后简单跑了一两个例程,确定ADC和DAC能用,后来就被信息安全竞赛的准备占用了时间,直到18号左右才有空开始跟两个队友一起训练。主要跑通了OLED与LCD显示屏,ADC采集(直流轮询/高速DMA),DAC输出(直流/高速DMA),定时器,以及FFT。
23日下午乘动车到达武汉站,先打车到赛事组委会指定的学校旁边的酒店入住把行李放下,然后进入武大报道。武汉大学的校园是开放的,刷身份证就可以直接进入,不需要额外预约。在报到处领取了统一的红色T恤衫(真挺丑的),然后在校园里稍微逛了逛。晚上参加了统一的赛前培训。首先是TI来的工程师讲了一下单片机相关的注意事项(我总感觉这位说话有一种台湾口音,而且很幽默风趣,对他印象很好),然后是提供仪器的几个厂商(普源,固纬,FNIRST)讲解了一下仪器(这个环节没什么意思,这几个工程师也不像第一个TI的工程师那么有趣),然后大家就回酒店休息了。
Day1
24日是比赛的第一天。一大早六点半我们就从酒店乘大巴前往武大比赛场地。把手机收到文件袋里封好之后,发放了比赛题目。老师提前说了A题是电源,B与C是仪器仪表,D是测控相关,所以我们直接就看B和C题。先看到B题有一个什么可见光通信,感觉完全没有接触过,再看C题是移相然后矢量测量,我的第一反应就是我最熟悉的用DDS移相的方案,正好这时候很多人都跑出去选题了,于是我也赶紧抓起选题单往外跑。中庭里分了四个队伍分别是四个题目,呈十字形排向四个方向。我赶紧找到C题的队伍排了进去,C题一共有42个容量,我排到了37位,后面还有许多人,几个老师过来数了数人头,然后让他们去改选别的题目(其实这会已经只有D题可选了)。
后来颁奖的时候,组委会的领导也说了大家没好好看题目就去抢题,其实不是很合理。不过如果不抢这样的话,倒也没必要好好看题目再选了—因为根本没的选择,只能选大家选剩下的最后一个。
- A题是一个“不间断直流电源”,由于我完全没接触过电源相关的知识所以就没关注具体是什么。
- B题是关于网络特性测量的,要求待测网络的输入端与输出端连接到两个电路上完全独立的部分,两部分只能使用可见光通信,在此条件下测量待测网络的幅频相频特性与冲激响应。
- C题是矢量电压表,题目给出同频正弦波A和B,要求对峰峰值固定为1V的信号B移相90°得到峰峰值1V的信号D,并且使用B和D两路信号分别于A进行混频与低通滤波,用ADC采集两路直流分量以测量信号A的幅度与相位。
- D题是一个电子秤,要求带去皮功能,以及30度以内的角度补偿功能(使用6050的模块测量角度)。
确定了选题之后,把东西搬到做题的教室,门口会有志愿者检查一遍能不能带。选题的时候同时会发一个资料U盘,里面有本次比赛可以申领的东西以及相应的技术手册。
安顿下来之后,我们就开始讨论方案,主要的难点就在于移相90度,因为题目要求了“只能使用分立元器件与芯片搭建电路完成”,所以我一开始想的DDS方案是不可以使用的(后来老师又特意进来强调了一下,DDS模块是给B题用的,如果在C题使用会大幅扣分)。题目提示的几种方法是:锁相环电路、微分积分电路以及全通网络电路。锁相环的方案被我首先排除了,因为要在一个很宽的频带范围内同步要求VCO的输入有很大的变化范围,但是要移相固定的90°又要求PD的输出基本固定不变,所以这个方案就被我排除掉了。
我在Multisim中分别仿真了积分电路和全通网络。积分电路可以在宽频带上输出固定的90度相移信号,但是输出信号的幅度很小只有几十毫伏;全通网络输出的增益固定为1,但是在宽频带上的相移是60°不到到120°以上。当时考虑到幅度后续还可以用放大器再调整,但是相移比较难以再调整,所以就选择了积分电路的方案。
第一天主要是两个队友在焊接和测试硬件电路,我一边帮忙焊接和测试并且评估效果,一边开始初步写程序:OLED显示屏,两路ADC直采。这部分倒是写起来很快很轻松。另外就是由于反推的时候需要使用arctan函数,但是导入的arm_math.h库编译的时候又有点问题,所以我自己又快速写了个python程序,把0-90度的角以0.1度步进生成正切值写成了一个自定义的tan_res.h,然后通过在数组中遍历的方式实现了一个arctan函数。
软件的开发没遇到什么大问题,但是硬件电路的效果并不好,尝试给移相后的信号再放大时,发现由于放大器的速度不是很够(最高的带宽增益积只有20M),所以在1M左右频率的时候,放大就会同时带来额外的相移了。这个问题一直困扰我们到了比赛结束。
其实当天队友还提出了另一个方案:先把正弦波过比较器整成方波,然后用积分或微分电路整成三角波,最后用模电书上给出的一个三角波-正弦波变换电路变成方波。这个变换电路的原理是在不同的输入电压下利用二极管压降激活不同的放大器反馈路径,达到在不同输入电压下放大倍数不同的效果,以此进行波形的变形。但是由于电路比较复杂,书上也没给出具体的取值参考,我在Multisim上没有成功仿真出这个电路,最后不了了之。
由于移相后的信号幅度不一且幅度都很小,所以我第一时间想到的方案就是用TLV3501高速比较器把波形整成方波,然后不管是滤波滤成正弦还是就此不管直接输入到混频器中应该都能做,而且3501的ns级响应速度足够快,基本不会带来额外的相位,还能把幅度统一整成电源轨,这样只要做一个固定的衰减就可以得到1V了。但是尝试了这个方案之后,不知为何不仅把3501烧坏了,还导致我们原来做好的积分电路也用不了了,输出信号的相移变成了180°。这时已经是第一天的尾声了。回到酒店时,不仅没解决幅度的问题,已有的移相电路还出现了问题,大家都很懊恼。但是这也没办法,我们只能寄希望于第二天早上来再看一下电路会不会恢复。
Day2
第二天过来,积分电路果不其然还是坏的。于是只好重新焊接了一个积分电路,大概在下午一两点左右完成了测试,这次确实是好的。至于比较器整形的方案则在进一步简单尝试后被放弃了,一方面是因为我们用组委会发放的3501焊接出来的电路性能并不想我想的那样好(不知道是哪个环节出现了问题),另一方面也是因为这会的时间已经有点赶了。我们决定放弃幅度的分数,就使用这个幅度微弱的移相信号去混频。至于不同频率上幅度不一致的问题,采用使用M0MCU的ADC采集前端输入信号来判断频率的方式,切换不同反推参数进行拟合。于是下午在程序上补上了ADC采集、DMA传输,FFT计算频率。
晚饭后,终于开始了最后的参数拟合环节。我还是采用我最喜欢的老办法:调整不同的输入条件,把ADC采集到的原始值(0-4095)记录到excel表格中,然后画折线图并结合理论推导观察规律。根据理论,两个通道采集到的直流值应该有
$$ A_1 = A_0\cos(\theta) \\ A_2 = A_0\sin(\theta) $$
但是由于混频出来的直流值会有负电压,所以我们又加了两个带增益的加法器做电压的映射。最后的规律应该是
$$ A_1 = A_{dc1} + G_1A_0 \cos(\theta) \\ A_2 = A_{dc2} + G_2A_0 \sin(\theta) $$
实际观察到的数据结果也是如此,采集到的两路ADC数据与输入信号的相位呈现三角函数的关系,因此我们需要标定的参数只有:
- 加法器带来的直流中心 Adc
- 两路加法器分别的增益 G1与G2。又由于我们的移相电路在不同频率上有不同幅度,因此G2会与f有关。
因此可以采用这样的标定策略:
- 将第1路ADC采集的数值实时显示在屏幕上,调整信号源输出相位,手动找到ADC采集到的最小值与最大值,直接就可以得到Adc1与G1了。
- 将第2路ADC做同样的操作采集Adc2与G2,但是这两个数值是频率敏感的,所以在500k到1600k的范围内多采一些点,然后用线性规律大致去拟合一下这两个数值。
开发程序的期间,队友又优化了一下加法器的直流中心与增益(显然的是,增益越高,测量的分辨率越高)。大概在晚上八点多钟,我们固定了硬件部分,开始了最后的软件调教。对于G2会随频率变化的问题,我用四段直线做了一个简单的拟合。九点多钟的时候,我们就固定了最后的作品,并决定不再做修改了。最终测试的结果是:在有一些点上异常精准,相位只差一两度,幅度只差十几二十毫伏;而在有一些不那么理想的点上,相位可能会差十几二十度,幅度可能会差两三百毫伏。分析其原因,一方面是因为我们的移相信号相位有点不准而且幅度太小导致测量效果不太理想,另一方面则是因为在频率上的分段拟合做的还是不够好。
具体的作品代码与技术描述可以见GitHub仓库。
赛后环节
25号是测试日,我们是中午去进行的测试。很遗憾的是,在测试的几个点上,我们都刚好表现出了较差的性能。25号下午参观了武大校史馆,在武大校园里逛了逛。武大的校园真的好大,逛得腿都快断了……26号中午在珞珈山庄吃了一顿自助午宴,然后去参加了颁奖典礼,最后只遗憾拿到三等奖。
总结此次的失利,虽然过程中有队友高烧、测试背运等“借口”,但是我想最大最根本的原因,还是在于我准备得不够充分,基础的电路知识掌握得不够牢固。从这次往后,我大概也不会再有机会参加这种形式的电赛了。两次参赛而都以失利告终,固然是很深的遗憾,但是在我心中,电赛留下的深刻记忆,反倒是比那些奖项来得更加重要。
P.S. 虽然这样说真的很像没拿到奖之后在嘴硬,但是我真是这么想的……


