简易频率特性测试仪的设计加在前面:术业有专攻。
一般写一些东西我也不会在空间瞎发,弄的别人以为自己瞎显摆。
不过我觉得我们电子设计的过程确实值得其他小组学习一下,比如说老焊板子那种芯片的布局,还有我们用4个按键解决所有数字的设置的思想。
我希望大家看到文章的时候不是觉得怎么吊炸天,其实我们这种水平比我们吊炸天的多了去。
我们之所以有敢厚着脸皮把这么次的设计思想分享出来,主要希望能把其中的某一些发光点分享给大家,同时希望他人给我们的更宝贵的意见和建议。
----end----电子设计三中,仪器仪表组的第一个题目,是简易频率特性测试仪的设计。
这个题目取自2013年的E题:简易频率特性测试仪(E 题)。
为了纪念近一个月的工作,特撰以此文纪念我们第七小组历经了的艰辛岁月。
在此,感组长家瑾大神、还有一华同学的辛勤付出,还有煜及其他一些学长的帮助。
特发上图,以作纪念。
在本次完成题目的过程中,大神早早完成了公式推导、电路理论和原理的分析,并组织我们在工作上分工(虽然他好像对“被我和一华排挤去焊电路板”很不满意私下抱怨并耿耿于怀,哈哈)。
下面我简单的回顾一下我们的这次设计:其中,有关硬件电路的部分是大神负责的,我只是略懂了原理,故仅仅略述。
我主要承担的是AD采样部分的程序,还有就是通过操作液晶屏和按键实现的程序的总体逻辑控制程序。
一华同学主要完成的是AD9854部分的程序,正弦波输出及其幅度补偿,还有扫频部分的程序。
下面,我从入手这道题目的开始状态,来一步步回顾一下。
下面,先把题目贴出来:/*=======================开始贴题目=======================*/【本科组】一、任务根据零中频正交解调原理,设计并制作一个双端口网络频率特性测试仪,包括幅频特性和相频特性,其示意图如图 1 所示。
二、要求1.基本要求制作一个正交扫频信号源。
(1)频率围为 1MHz~40MHz,频率稳定度≤10^-4;频率可设置,最小设置单位 100kHz。
(2)正交信号相位差误差的绝对值≤5º,幅度平衡误差的绝对值≤5%。
(3)信号电压的峰峰值≥1V,幅度平坦度≤5%。
(4)可扫频输出,扫频围及频率步进值可设置,最小步进 100kHz;要求连续扫频输出,一次扫频时间≤2s。
2.发挥部分(1)使用基本要求中完成的正交扫频信号源,制作频率特性测试仪。
a. 输入阻抗为 50Ω,输出阻抗为 50Ω;b. 可进行点频测量;幅频测量误差的绝对值≤0.5dB,相频测量误差的绝对值≤5º;数据显示的分辨率:电压增益 0.1dB,相移 0.1º。
(2)制作一个 RLC 串联谐振电路作为被测网络,如图 2 所示,其中 Ri和Ro分别为频率特性测试仪的输入阻抗和输出阻抗;制作的频率特性测试仪可对其进行线性扫频测量。
a. 要求被测网络通带中心频率为 20MHz,误差的绝对值≤5%;有载品质因数为 4,误差的绝对值≤5%;有载最大电压增益≥ -1dB;b. 扫频测量制作的被测网络,显示其中心频率和-3dB 带宽,频率数据显示的分辨率为 100kHz;c. 扫频测量并显示幅频特性曲线和相频特性曲线,要求具有电压增益、相移和频率坐标刻度。
(3)其他。
/*=======================贴题目结束=======================*/AD9854实验板的程序,我们直接有学长找来的代码,我们需要做的工作只是移植。
然而,源程序对应的IO口用到的均为位操作,而我们使用的F020单片机不能直接对P6、P7口直接进行位操作,所以需要将位操作均用“|=bitx”或者“&=!bitx”的方式来置位或者复位。
这一段程序由一华同学完成移植,在此不贴出了。
硬件部分最值得一说的是AD835解调板,该板子由大神焊成。
他共焊接了两次,第一次半途而废,因为确实太渣渣了。
第二次,板子正面元器件布局很好,但是最终测试的时候,发现还是效果不行,原因可能是高频信号的其板子背面走线,尤其是AD9854的双正弦波输入附近位置的不佳处,受到的影响较大(具体我不清楚为什么)。
你们会发现,途中下面的两块转接板上你看不到芯片,这并不是没有焊芯片,而是焊接时候就把板子反面了一下。
这样的话,芯片引脚的布局就和电路的原理图上一样啦,在走线的时候将方便许多,这个小技巧大家可以学习一下。
老哥说了下次还是他要来焊了啦,要给他一个挽回的机会哈哈。
现在贴出AD835解调板原理图:解调板左边的四个接口,分别对应如下:Q-AD9854cos路,I-AD9854sin路,IN-RLC被测网络输入端,OUT-LC被测网络输出端。
右侧分别为Ain0和Ain1路的采样,输给F020单片机的ADC0.输入解调板的两路正交的sin信号I和Q,期中I路经过RLC网络后分别与I路和Q路相乘。
通过AD835完成乘法,其输出:分别给偏置电压0.125mV和0.25mV。
通过TL431给出稳定的偏置。
分别通过低通滤波器,得到直流分量。
这里低通的指标是按照截止频率100KHz做得,其实具体是多少,只要足够小就行。
为了让F020能够采样到合适围的电压值,通过低通滤波器后,再将信号放大10倍。
实际上,我们会发现,因为F020板子上参考电压已经与部相连,我们无法改变,最大电压只能采样到2.48V,幸好最大电压只能是2.5V,我们在这种情况下可以视为2.5V来算。
但是我们设想,如果将电压放大的倍数略设置小一些,如8倍,将解决该问题。
最后,就是在程序中,根据公式算出实际的被测网络的K(幅度衰减)和Fi(相位)值啦。
经过滤波器之后,两路直流分量为:)cos(21Fi KA I =,)sin(21Fi KA Q -=由此推出:222241A K Q I =+,由此再推出K ,再代回某个式子推出Fi ,这里就略了。
这里建议用sin 函数推导(代回Q 路公式),我们可以发现asin 函数的值域[-90度,+90度]对应的值正好为[-1,+1],这样我们方便在程序中计算。
Atan 函数毕竟精确度没有asin 好,这个自己画函数图像便知。
硬件电路就说这么多了,下面我来show 一下我们的代码。
这里补充一些大家在画幅频、相频曲线的时候可能会遇到的问题: 如果你们图像画的不标准,可能有这些原因:1、公式形式问题。
最开始我们公式中用的是mV 做电压的单位,发现计算出来的数值打在屏上是错的。
后来发现是因为mV 本来就是10^3,再需要平方等等,可能已经造成了数据类型的溢出。
后来我们改在计算之前转换成V作为电压的单位,结果就对了。
其实我们不难想到,当我们做小数乘法的时候,就算数据类型有溢出,也是向后溢出的,缺失的是我们不太关心的极小的部分。
2、可能是你们的硬件电路有问题。
我们的硬件电路跑在我们自己的软件上,画出来的相频曲线明显不对,根本都看不出来是什么。
但是换成吴天涯组他焊的板子,结果图像就特别好,是一个从90度逐渐减小的趋势。
相频我们的还行。
但是由此还是可见,就算程序写的没有问题,如果AD835解调板焊接不行,还是会影响你的软件显示,造成怀疑自己程序错误的假象。
3、可能是你们的公式推导问题:我们最早把峰峰值和电压幅度值弄混淆的写在一起计算,这样你会发现得出的结果比理论上差个2倍或者多个2倍。
这个问题细心看一下就解决了。
--------关于ADC采样值转化为实际电压值的一些问题:ADC0H+ADC0L中如果数据为4095,表示的电压:超过了2.48或者引脚悬空的时候都是4095。
问:如果adc采样后,寄存器里面的值为temp,那么电压就是vin=temp/4095*2.48,对吗?答:如果你这样处理,是不好的。
我们知道,AD采样在低于180mV电压和高于2.4V电压的时候是不够准确的,2.48只是一个手册里面给的参考电压。
我们组的做法是,用电源输入一个1v的电压,记录现在的ADC采样数值。
再输入一个2V电压,记录现在采样数值。
然后,就可以画出一条线性的曲线,以后任意采样到的ADC值,都可以转化成实际的电压。
====================================================while(0==KeyScan()){};////Go into Our System.initlcdsys();while(1){sysfuntion(KeyScan());}}上面是我们的main函数,我们主要就是进来初始化所有需要用到的外围电路,然后就进了一个sysfuntion(KeyScan());函数,这就是我们的LCDsys。
当然了,我们的LCDsys.c有600+行,所以接下来关于这段程序的解读,我会直接在代码里面写。
我个人认为我一个比较好的编程习惯就是注释写得非常详细,当然,和别的大牛比起来就很渣渣啦,不过通过注释让隔了一段时间后自己还看得懂自己的程序是非常必要的。
然后,我写此文时对程序的解读,我就用【】扩起来表示。
Lcdsys.c函数#include "lcdsys.h"#include "DataType.h"Drawchar('+',row,col+0);num=input;}Drawchar(int2char((int)(num/10.0)%10),row,col+1);Drawchar(int2char((int)(num/1.0)%10),row,col+2);Drawchar('.',row,col+3);Drawchar(int2char((int)(num*10.0)%10),row,col+4);Drawchar(int2char((int)(num*100.0)%10),row,col+5);}【这个函数是我们打主屏(F和A设置时候的函数),贴出图片来看看】void fun_ok(){if(AorF){DrawcharS("Change A...",0,0);drawint(a,1,0);DrawcharS("mV",1,5);DrawcharS("when F=",3,0);drawint(f,3,7);DrawcharS("kHz",3,12);}else{DrawcharS("Change F...",0,0);drawint(f,1,0);DrawcharS("kHz",1,5);DrawcharS("when A=",3,0);drawint(a,3,7);DrawcharS("mV",3,12);}】DrawcharS("Sin:",0,0);DrawcharS("Vpp=",1,2);drawint(a,1,6);DrawcharS("mV",1,11);DrawcharS("Fre=",2,2);drawint(f,2,6);DrawcharS("kHz",2,11);//测试正弦波,采用120MHZ SYSCLK时,出来10MHZ波形,波形很好,测试成功//当采用300MHZ SYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右AD9854_Init();//输出的幅度 a mV = (x/4095)*5000mV 那么设置的参数 x 应当为a*(4095/5000)AD9854_SetSine((unsigned long)(f*1000.0),(int)(a*Vppadjust));while(1){if(6==KeyScan()||5==KeyScan()){Clear();fun_ok();break;};};break;case 7: Clear();//该按钮完成【点频输出,通过系统后,输入AD后计算“相位”和“参数k”】功能if(0==JiaoZhunBit){DrawcharS("No ReSeted!!!",1,1);while(1){if(0!=KeyScan()){Clear();fun_ok();break;};};break;}DrawcharS("Waiting...",1,1);DrawcharS("Wave Outputing",2,2);AD9854_Init();AD9854_SetSine((unsignedlong)(f*1000.0),(int)(a*Vppadjust));delaywateAD9854(5000,5);/*====延时====*/Clear();drawint(a,0,0);DrawcharS("mV/",0,5);drawint(f,0,8);DrawcharS("kHz",0,13);//输出额定幅度和频率的正弦波【case7完成的是点频功能接的是直通网络时候,任意频率都是接近0度。