ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:1.50MB ,
资源ID:8017317      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8017317.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(简易频率特性测试仪的设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

简易频率特性测试仪的设计.docx

1、简易频率特性测试仪的设计简易频率特性测试仪的设计加在前面: 术业有专攻。一般写一些东西我也不会在空间瞎发,弄的别人以为自己瞎显摆。不过我觉得我们电子设计的过程确实值得其他小组学习一下,比如说老葛焊板子那种芯片的布局,还有我们用4个按键解决所有数字的设置的思想。我希望大家看到文章的时候不是觉得怎么吊炸天,其实我们这种水平比我们吊炸天的多了去。我们之所以有敢厚着脸皮把这么次的设计思想分享出来,主要希望能把其中的某一些发光点分享给大家,同时希望他人给我们的更宝贵的意见和建议。 -end- 电子设计三中,仪器仪表组的第一个题目,是简易频率特性测试仪的设计。这个题目取自2013年的E题:简易频率特性测试

2、仪(E 题)。为了纪念近一个月的工作,特撰以此文纪念我们第七小组历经了的艰辛岁月。在此,感谢组长葛家瑾大神、还有范一华同学的辛勤付出,还有李煜及其他一些学长的帮助。特发上图,以作纪念。在本次完成题目的过程中,葛大神早早完成了公式推导、电路理论和原理的分析,并组织我们在工作上分工(虽然他好像对“被我和范一华排挤去焊电路板”很不满意私下抱怨并耿耿于怀,哈哈)。下面我简单的回顾一下我们的这次设计:其中,有关硬件电路的部分是葛大神负责的,我只是略懂了原理,故仅仅略述。我主要承担的是AD采样部分的程序,还有就是通过操作液晶屏和按键实现的程序的总体逻辑控制程序。范一华同学主要完成的是AD9854部分的程序

3、,正弦波输出及其幅度补偿,还有扫频部分的程序。下面,我从入手这道题目的开始状态,来一步步回顾一下。下面,先把题目贴出来:/*=开始贴题目=*/【本科组】一、任务根据零中频正交解调原理,设计并制作一个双端口网络频率特性测试仪,包括幅频特性和相频特性,其示意图如图 1 所示。二、要求1基本要求制作一个正交扫频信号源。(1)频率范围为 1MHz40MHz,频率稳定度10-4;频率可设置,最小设置单位 100kHz。(2)正交信号相位差误差的绝对值5,幅度平衡误差的绝对值5%。(3)信号电压的峰峰值1V,幅度平坦度5%。(4)可扫频输出,扫频范围及频率步进值可设置,最小步进 100kHz;要求连续扫频

4、输出,一次扫频时间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. 扫频测量制作的被测网络,显

5、示其中心频率和-3dB 带宽,频率数据显示的分辨率为 100kHz;c. 扫频测量并显示幅频特性曲线和相频特性曲线,要求具有电压增益、相移和频率坐标刻度。(3)其他。/*=贴题目结束=*/AD9854实验板的程序,我们直接有学长找来的代码,我们需要做的工作只是移植。然而,源程序对应的IO口用到的均为位操作,而我们使用的F020单片机不能直接对P6、P7口直接进行位操作,所以需要将位操作均用“|=bitx”或者“&=!bitx”的方式来置位或者复位。这一段程序由范一华同学完成移植,在此不贴出了。硬件部分最值得一说的是AD835解调板,该板子由葛大神焊成。他共焊接了两次,第一次半途而废,因为确实太

6、渣渣了。第二次,板子正面元器件布局很好,但是最终测试的时候,发现还是效果不行,原因可能是高频信号的其板子背面走线,尤其是AD9854的双正弦波输入附近位置的不佳处,受到的影响较大(具体我不清楚为什么)。你们会发现,途中下面的两块转接板上你看不到芯片,这并不是没有焊芯片,而是焊接时候就把板子反面了一下。这样的话,芯片引脚的布局就和电路的原理图上一样啦,在走线的时候将方便许多,这个小技巧大家可以学习一下。老哥说了下次还是他要来焊了啦,要给他一个挽回的机会哈哈。现在贴出AD835解调板原理图:解调板左边的四个接口,分别对应如下:Q-AD9854cos路,I-AD9854sin路,IN-RLC被测网络

7、输入端,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,幸好最

8、大电压只能是2.5V,我们在这种情况下可以视为2.5V来算。但是我们设想,如果将电压放大的倍数略设置小一些,如8倍,将解决该问题。最后,就是在程序中,根据公式算出实际的被测网络的K(幅度衰减)和Fi(相位)值啦。经过滤波器之后,两路直流分量为:, 由此推出:,由此再推出K,再代回某个式子推出Fi,这里就略了。这里建议用sin函数推导(代回Q路公式),我们可以发现asin函数的值域-90度,+90度对应的值正好为-1,+1,这样我们方便在程序中计算。Atan函数毕竟精确度没有asin好,这个自己画函数图像便知。硬件电路就说这么多了,下面我来show一下我们的代码。这里补充一些大家在画幅频、相频曲

9、线的时候可能会遇到的问题:如果你们图像画的不标准,可能有这些原因:1、公式形式问题。最开始我们公式中用的是mV做电压的单位,发现计算出来的数值打在屏上是错的。后来发现是因为mV本来就是103,再需要平方等等,可能已经造成了数据类型的溢出。后来我们改在计算之前转换成V作为电压的单位,结果就对了。其实我们不难想到,当我们做小数乘法的时候,就算数据类型有溢出,也是向后溢出的,缺失的是我们不太关心的极小的部分。 2、可能是你们的硬件电路有问题。我们的硬件电路跑在我们自己的软件上,画出来的相频曲线明显不对,根本都看不出来是什么。但是换成吴天涯组他焊的板子,结果图像就特别好,是一个从90度逐渐减小的趋势。

10、相频我们的还行。但是由此还是可见,就算程序写的没有问题,如果AD835解调板焊接不行,还是会影响你的软件显示,造成怀疑自己程序错误的假象。3、可能是你们的公式推导问题: 我们最早把峰峰值和电压幅度值弄混淆的写在一起计算,这样你会发现得出的结果比理论上差个2倍或者多个2倍。这个问题细心看一下就解决了。-关于ADC采样值转化为实际电压值的一些问题: ADC0H+ADC0L中如果数据为4095,表示的电压:超过了2.48或者引脚悬空的时候都是4095。问:如果adc采样后,寄存器里面的值为temp,那么电压就是vin=temp/4095*2.48,对吗? 答:如果你这样处理,是不好的。我们知道,AD

11、采样在低于180mV电压和高于2.4V电压的时候是不够准确的,2.48只是一个手册里面给的参考电压。我们组的做法是,用电源输入一个1v的电压,记录现在的ADC采样数值。再输入一个2V电压,记录现在采样数值。然后,就可以画出一条线性的曲线,以后任意采样到的ADC值,都可以转化成实际的电压。=Main.c函数#include lcdsys.h #include key.h #include lcd.h #include Device.hint main() Device_Init(); KeyPort_Init(); newLCDInit(); /Welcome Pics. Clear(); Dr

12、awcharS(Our AD9854 sys,1,0); DrawcharS(- to Be No.1,2,4); while(0=KeyScan(); /Go into Our System. initlcdsys(); while(1) sysfuntion(KeyScan(); 上面是我们的main函数,我们主要就是进来初始化所有需要用到的外围电路,然后就进了一个sysfuntion(KeyScan();函数,这就是我们的LCDsys。当然了,我们的LCDsys.c有600+行,所以接下来关于这段程序的解读,我会直接在代码里面写。我个人认为我一个比较好的编程习惯就是注释写得非常详细,当然

13、,和别的大牛比起来就很渣渣啦,不过通过注释让隔了一段时间后自己还看得懂自己的程序是非常必要的。然后,我写此文时对程序的解读,我就用【】扩起来表示。Lcdsys.c函数#include lcdsys.h#include DataType.h#include math.h#include string.h#include lcd.h #include key.h #include ADDA.h#include AD9854.h #include c8051F020.h /c8051f020单片机头文件 【上方都是头文件就没什么说的啦,当然,如果你经常在把别人的程序挪给自己用的时候出错,那么你就需要

14、专门XX一下.c程序的头文件.h需要怎么写了。】 #define Vppadjust 0.819#define VppFangDaBeiShu 10.0#define VppPianZhiValue 1250.0#define GNDBuChang 13.0 【如果你有把不需要改变的值定义成变量的坏习惯,建议你定义他们为常量。这样你不会在程序中不小心的改变他们,更不会让Keil不智能的编译器不知为什么的就让你的程序跑飞。F020单片机的存储单元在你写了一大串自己都不太记得什么用的变量和大量的借鉴了别人的代码后都不知道别人有什么变量的情况下存储空间的资源将会是十分极其以及相当的紧张的,所以你需要

15、有这个习惯】unsigned int f;/幅度(整型)给AD9854的时候*1000.0unsigned int a;/幅度(整型)给AD9854的时候*Vppadjust(即0.819) unsigned int xdata tmp5;/记录采集出来的ADC0的12位数据bit JiaoZhunBit; float xdata ad0bc5;/补偿值数据 float xdata ad1bc5;/补偿值数据float xdata MaxValue;/最大相位或K取值 int xdata MaxPoint;/最大相位或K的频率点、/float xdata MinValue;/最小相位或K取值

16、/int xdata MinPoint;/最小相位或K的频率点、float xdata Value120; int xdata ThreeDb2; 【给自己定义的变量注释清楚到底是用作什么用的】/*=对应关系= 0- 5000k( 5M) 1-10000k(10M) 2-20000k(20M) 3-30000k(30M) 4-40000k(40M)=对应关系=*/unsigned int adtmp,adtmp0,adtmp1;/记录采集出来的ADC0的12位数据 long double ad0,ad1,sinFi,Du,K;/将12位数据转化为实际电压值,保存为浮点数据/cosFi已经不用了

17、unsigned char wei,count,incount;/LCDsys用的:数据标志位、全局计数位、内嵌套计数位unsigned char cmd;/画图时候:1-频率特性绘图,2-幅度特性曲线,3-校准,4-退出/扫频时候:1-步进,2-起始频率,3-截止频率bit AorF;/用于标志:设置频率或者幅度、的标志位。unsigned int mo=1;/扫频使用 scan using.unsigned long Freq1=1000000.0;/扫频使用 scan using.unsigned int scanstep=1;/扫频使用 scan using. 扫频步进void ini

18、tlcdsys()/LCDsys初始化函数ADCcount=0;f=100;/ kHza=2000;/ mVwei=0;AorF=0;Clear();fun_ok();JiaoZhunBit=0;MaxValue=0; MaxPoint=0; /MinValue=0; /MinPoint=0; for(count=0;count1;start-) for(i=1;iai+1)a0=ai;ai=ai+1;ai+1=a0; return a3;【下面是一个将一位的整型转化成字符串的函数】/将 1 位的 int 型数据转换,返回字符的子函数char int2char(int input) retur

19、n 0x30+input;【在液晶屏上画无符号整型的函数】void drawint(unsigned int num,unsigned char row,unsigned char col) Drawchar(int2char(num/1)%10),row,col+4); Drawchar(int2char(num/10)%10),row,col+3); Drawchar(int2char(num/100)%10),row,col+2); Drawchar(int2char(num/1000)%10),row,col+1); Drawchar(int2char(num/10000)%10),r

20、ow,col+0);【在液晶屏上画有符号整型的函数】void drawsignedint(int input,unsigned char row,unsigned char col) int num; if(input0)Drawchar(-,row,col+0);num=-input;elseDrawchar(+,row,col+0);num=input; Drawchar(int2char(num/1)%10),row,col+4); Drawchar(int2char(num/10)%10),row,col+3); Drawchar(int2char(num/100)%10),row,c

21、ol+2); Drawchar(int2char(num/1000)%10),row,col+1);【在液晶屏上画有符号浮点数的函数】void drawsignedfloat2_2(float input,unsigned char row,unsigned char col) float num; if(input,cmd+1,0); DrawcharS(scanStep=,1,1);drawint(100*scanstep,1,10);DrawcharS(k,1,15); DrawcharS(Start=,2,1);drawint(adtmp0*100,2,7);DrawcharS(kHz

22、,2,12); DrawcharS(Stop=,3,1);drawint(adtmp1*100,3,6);DrawcharS(kHz,3,11);【下面是两路ADC的补偿函数,根据不同的频率,将电压分别在接直通网络自动校准的时候,分别校准位1250mV和2500mV】 /*=对应关系= 0- 5000k( 5M) 1-10000k(10M) 2-20000k(20M) 3-30000k(30M) 4-40000k(40M)=对应关系=*/long double ad0BuChang(long double inputVpp,unsigned int inputf)/(相/频)度数补偿函数 lo

23、ng double BuChangVpp,k; BuChangVpp=inputVpp;if(1)/修改判断的值,以决定是否进行校正。 if( 1inputf&inputf=10000)k=(ad0bc1-ad0bc0)/(10000.0- 5000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc0-5000.0*k);else if(10000inputf&inputf=20000)k=(ad0bc2-ad0bc1)/(20000.0-10000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc1-10000.0*k);else

24、if(20000inputf&inputf=30000)k=(ad0bc3-ad0bc2)/(30000.0-20000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc2-20000.0*k);else if(30000inputf&inputf=50000)k=(ad0bc4-ad0bc3)/(40000.0-30000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc3-30000.0*k); return BuChangVpp;long double ad1BuChang(long double inputVpp,unsign

25、ed int inputf)/(相/频)度数补偿函数 long double BuChangVpp,k; BuChangVpp=inputVpp;if(1)/修改判断的值,以决定是否进行校正。 if( 1inputf&inputf=10000)k=(ad1bc1-ad1bc0)/(10000.0- 5000.0);BuChangVpp=inputVpp+(k*inputf+(ad1bc0-5000.0*k);else if(10000inputf&inputf=20000)k=(ad1bc2-ad1bc1)/(20000.0-10000.0);BuChangVpp=inputVpp+(k*inputf+(ad1bc1-10000.0*k);else if(20000inputf&inputf=30000)k=(ad1bc3-ad1bc2)/(30000.0-20000.0);BuChangVpp=inputVpp+(k*inputf+(ad1bc2-20000.0*k);else if(30000inputf&inputf=50000)k=(ad1bc4-ad1bc3)/(40000.0-30000.0);BuChangVpp=input

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1