已经有半年多没有更新过博客了啊,这段时间一直是忙的不可开交,总觉得浪费点时间来写博客是一件特别奢侈的事情。不过好在是最后熬过了这段时间,稍微能够放松一下了。
要说起来这段时间主要去做什么了,其实和我这篇博文要讲的是同一件事情。这段时间一直在准备比赛。全国大学生电子设计大赛,也就是所谓的“瑞萨杯”。
而其实自从比赛结束后我一直计划着写这样一篇博文,就是讲一讲我和我的队友到底做了一个什么样的东西去参加这个比赛,做一个简单的题解。
这次电赛当中我们选择的是H题,远程幅频特性测试装置。比赛原题文档如下:
首先关注它的基本要求:
1)1MHz-40MHz步进为1MHz且幅值可调的信号源。
2)0-40dB连续可调带宽1MHz-40MHz的放大器,并且输入输出阻抗为600Ω,最大输出1V峰峰值。
3)使用示波器显示幅频特性的装置。
这三个要求其实难度相对来说是比较低的,作为一个基本的仪器仪表题目来说,相较于往年,其难度要低的很多,在我印象中往年有一道矢量网络分析仪的题目,那道题目要求自行制作DDS,不能使用成品,而这道题则宽松许多。
首先说说信号源部分,这个部分我们最快能想到的办法就是使用DDS来作为信号源,而在信号源的选型中,最好这个信号源支持幅度调节。最开始的时候我们选用的是AD9959,这是一个四通道DDS,500MSPS采样率。但是不足的地方就是它的输出幅度不能调节。(至少我翻看了好几遍手册没有找到幅度调节字),然后我们就考虑AD9854,但是转念一想那么大的发热量万一到了测试的时候,芯片不稳定了,可就不好了。所以最后我们选择了AD9910这款功耗较小的1GSPS的DDS。剩下的就是参考手册上面的寄存器map,然后编程序驱动它就好了。这里我的队友使用了一个OLED显示屏和矩阵键盘,人机交互更加轻松了,可以自由的设置点频扫频频率和幅度。我们选用的单片机型号是STM32F103ZET6.
其次就是这个放大器的设计,最开始的时候我们考虑使用TPS5430搭建DC-DC把单5V电源转换成±5V电源,这样便可以使用我们的老朋友VCA821作为放大器部分的解决方案(我觉得这样会比较优美)。电源方面我们可以先将电压升高到±9V,然后使用7805和7905对它进行稳压,然后在接上大的固态电容滤掉开关噪声,实际测试这种方法可以做到电源纹波小于3mV,当然这种方法也把DC-DC的效率抛的远远的,根本没有效率可言。然而不幸的是,比赛到第二天的时候我们收到通知,这道题禁止使用DC-DC,于是我们只好考虑单电源运放方案(无疑击碎了我们所有的幻想)。于是我们想到一款ADI的单电源程控放大器,AD8367是一个带宽500MHz的程控放大器,其理论最大放大倍数可以达到45dB,但是遗憾的是,它的最大放大倍数45dB仅仅只是对于200MHz左右的信号来说的,根据测试,它在1M-40M的时候最大只能到35dB,于是我们只能选择将两级放大器级联以达到要求的放大倍数,这也是我们最终采用的方案。
最后就是幅频特性测试及显示装置,这里首先要采集幅频数据,所以我们先对放大器输出的信号进行检波,我们采用了AD8362作为检波芯片,但是在使用这个芯片的时候有一个小小的问题,就是我们前级一直是600Ω阻抗匹配,但是如果用600Ω作为这个芯片的输入阻抗匹配的话,就会在幅频特性上显示出略微的不平坦,于是我们使用9018做了一个射级跟随器,做了阻抗转换,解决了这个问题。在这一级我们直接使用单片机的ADC对AD8362的输出进行采集,然后结合DDS通过串口发来的频率信息,采集待测器件的幅频特性。然后通过DA的两个通道分别输出三角波和采集回来的数据波形,利用示波器的XY显示模式进行扫描显示。这里我们选用的单片机型号是STM32F767ZIT6,不过不是因为这个单片机有多么强悍含有FPU和DSP这些原因,仅仅只是因为手头只剩这个单片机的板子了,所以只好用它,个人觉得F103也依然能够胜任。
接下来说说本题的提高部分,这个提高部分说难也不难,但是说简单也绝对不简单,如果之前写过关于socket方面程序,那么这里就会显得非常游刃有余,但是如果之前没有接触过的话,就会浑身难受。而我碰巧之前有段时间接触过这方面的代码,可以说是非常的幸运了。
1)放大器单5V供电输出有效值1V,无明显失真。
2)通过一条1.5m的双绞线在另一台示波器上显示幅频特性。
3)通过WiFi连接路由器,通过局域网在笔记本电脑上显示幅频特性。
4)其他。
简单的来说由于我们一开始考虑放大器方案的时候,我们就着眼于扩展部分,希望一步到位,所以如果采用了基础部分所述的方案,那么这个指标也已经达到了,AD8367的输出有效值可以达到1.3V左右,完全符合题目要求,只要注意隔直和加偏执的问题,避免削峰和削底就好。还有为了保证放大倍数,放大器级联中间就不必要考虑阻抗匹配的问题了,直接输出接输入就好,避免不必要的放大倍数损失(而且主要我个人觉得40M的信号匹配不匹配区别不大)。
接下来就是双绞线传输的问题,这里首先要冷静思考,1.5M的双绞线,并且要求其中一根线为地线,也就是说只能在其中一根线上面传输信号,而且考虑到距离的长度,这里我们只能选择穿数字信号,将模拟信号传输过去是不太能行得通的方案,于是我们这根双绞线可以用于数字通信。至于通信协议,当然是越方便越好,我们选择了TTL电平的串口协议,这样一来两边便建立了一个单工通信(虽然完全可以做半双工,但是我觉得单工就够用了)。这个时候就面临了一个很严重的问题,那就是数据的组帧校验协议。如果不组帧的话,数据误码暂且不提,数据出现丢失,错位等问题会使通信极不可靠。这个时候我想起了之前做过的一个通信协议,这个协议我也不知道叫什么名字,它是恩智浦公司的一款NFC芯片PN532和单片机通信的协议,虽然协议比较简单,但是我所需要解决的问题它都很完美的解决了,正所谓麻雀虽小五脏俱全。其协议内容如下:
利用这个协议,在本地端按照协议封好帧,然后在远程端使用状态机进行接收校验,便可以还原出幅频特性图。如果在校验过程中发现数据有误,则整帧丢弃。
最后就是WiFi传输的问题了,这里我选用了一款国产的WiFi芯片ESP8266,这款芯片虽然便宜,但是绝对性能强劲,值这个价钱。我们利用它与路由器连接,并与上位机建立TCP连接,把幅频特性曲线的数据发到上位机。不过这里我也没有使用它默认提供的AT指令,而是下载了官网提供的IDE,修改了它上面的固件,自己增加了一个”AT+TRANS”的指令,一旦执行这个指令,它便开始尝试连接服务器,当服务器连接上之后,它会向服务器发送自己的标识,然后向单片机回复OK后便进入透明传输模式,即向串口发送的一切数据都会原模原样的发送到上位机服务器。
在上位机端,我写了两个小程序,一个就是使用TCP的Select模式,实现单线程多用户接入的小型服务端程序,这个程序主要负责识别客户端的标识,然后将单片机发回的数据存入缓冲区,然后再将数据发送给图形显示客户端。而另一个程序就是图形显示客户端,这个客户端我使用了OpenGL进行绘图,并且用了很简单的connect和recv方式连接服务器端,先发送自己的标识,然后开始不停接收数据,并将其绘制到屏幕上。后来我为了让它显得美观,我还向里边加入了一个链表作为队列,缓冲从服务器端接来的数据,然后逐次变暗,模拟余辉的效果。实际效果是这样的(不过这个是我第一版的程序啦,后来把坐标都校准成整数了,小数看的人难受,但是找不到新版的照片了,凑合下):
到此为止,这就是我们对于这道题的所有方案,从方案制定到最后实现花了十几个小时,剩下的时间都在不停地调试,小修小补,找bug。不过就我个人来说,我对这套方案还是很满意的。
最后呢小小的骄傲一下,凭借这个方案,我最终拿到了H题全国第一的成绩,不过最后在瑞萨杯评比中失利,还是有点小小的遗憾的。不过能和各个题目的全国第一过招,还是很过瘾的。
PS:文中所有提到的芯片型号可以通过点击链接转到相应的介绍,都是官网介绍。
实物图:
(完)