简易频率特性测试仪E题文档格式.docx
《简易频率特性测试仪E题文档格式.docx》由会员分享,可在线阅读,更多相关《简易频率特性测试仪E题文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
二.系统总体设计方案及实现框图......................5
3.单元模块设计........................................................................5
3.1正弦信号发生器..........................................................5
3.2待测串联RLC及加法器模块.....................................8
4.理论分析与计算...................................................................11
4.1扫频测试仪理论依据.................................................11
4.2DDS信号源.................................................................11
4.3相位差测量.................................................................12..
五.系统软件设计.......................................................................13
七.总结分析与结论....................................................................21
一、方案论证与选择
1.扫描信号产生方案
1.1数字直接频率合成技术(DDFS)
方案一:
采用数字直接频率合成技术(DDFS)。
以单片机和FPGA为控制核心,利用FPGA中的N位地址存储相应的正弦表值,通过改变频率控制字K,寻址相位累加器的波形存储器的数据,以产生所需频率的正弦信号fout=fin*K/2N。
该方案频率比较稳定,抗干扰能力强,但程序实现会有一定的繁琐性,并且会占用FPGA资源。
1.2程控锁相环频率合成
方案二:
采用程控锁相环频率合成方案。
锁相环频率合成是将高稳定度和高精确度的标准频率经过加减乘除的运算产生同样稳定度和精确度的大量离散频率,在一定程度上解决了既要频率稳定精确、又要频率在较大范围可变的矛盾,能产生方波,通过积分电路就可以得到同频率的三角波,再经过滤波器就可以得到正弦波,但采用了多次积分电路,这种具有惰性特性的电路误差大且不能满足相频曲线和幅频曲线的输出要求,功能扩展能力有限。
1.3数字频率发生器(DDS)AD9851产生
方案三:
采用DDS芯片AD9851。
根据题目要求,结合性价比,我们选用AD9851。
AD9851是AD公司采用先进的DDS技术生产的具有高级集成度的DDS器件,它的最高工作时钟为180MHz,正常输出工作频率范围为0~72MHz,精度可达0.04Hz,它还具有调频和调相功能,通过单片机的适当控制便可产生高带宽的正弦波信号。
该方案产生的信号频率稳定度较好,操作简易,但抗干扰性有一定的的不足。
综上论证比较:
与DDFS及锁相环频率合成相比,采用DDS芯片合成正弦信号的频率建立与切换简单,频率单一,频率覆盖范围广,精度高,可控性强,功能扩展能力大。
故采用方案三。
2.幅频和相频特性测量方案
2.1方案1:
利用公式H(s)=R(s)/E(s),以冲击函数为激励,则输出信号的拉氏变换与系统函数相等。
但是产生性能很好的冲击函数比较困难,需要对采集的数据做FFT变换,需要占用大量的硬件和软件资源,且精度也受到限制。
2.2 方案2:
扫频测试法。
当系统在正弦信号的激励下,稳态时,响应信号与输入激励信号频率相同,其幅值比即为该频率的幅频响应值,而两者的相位差即为相频特性值。
采用频率逐点步进的测试方法。
无需对信号进行时域与频域的变换计算,通过对模拟量的测量与计算完成,且精度较高。
综上所述,选择方案2。
2.系统总体设计方案及实现框图
该系统以单片机为控制系统,用DDFS技术产生频率扫描信号,当系统在正弦信号的激励下,稳态时,响应信号与输入激励信号频率相同,其幅值比即为该频率的幅频响应值,而两者的相位差即为相频特性值。
可得1MHz-40MHz中任意频率的幅频特性和相频特性数据.并且在LCD同步显示相应的功能和数据,人机交互界面友好。
三.单元模块设计
1、AD9851正弦信号发生器
AD9851模块中晶振频率24MHZ,进入AD9851芯片后,在内部6倍频为144MHZ,通过改变输入控制字K(D0-D7)来改变输出正弦波频率fo=k*fclk/2,其中最小分辨率100KHZ,频率在30MHZ以下时波形完美。
并且输出峰峰值1.66V,平均值0.69V。
AD8951正弦信号发生器
芯片介绍:
AD9851
该AD9851是一种高度集成的设备,采用先进的DDS技术,再加上内部高速度、高性能D/A转换器,和比较器,使一个数字可编程频率合成器和时钟发生器功能化。
当参照准确的时钟源,AD9851可以产生一个稳定的频率和相位且可数字化编程的模拟正弦波输出。
此正弦波可直接用作时钟源,在其内部转化为方波成为灵活的时钟发生器。
AD9851采用的最新的高速DDS内核可接受32位的频率控制字,180MHz系统时钟,分辨率为0.04赫兹。
该AD9851包含一个特有的6×
REFCLK倍乘器电路,因此无需高速外部晶振。
6×
REFCLK倍乘器使其有最小的无杂散动态范围SFDR和相位噪声特性。
AD9851提供了5位可编程相位调制,使移相输出的增量为11.25°
。
引脚图
正交扫频信号源
原理图
功能方框图
2.待测串联RLC及加法器模块
RLC串联谐振电路
乘法器电路图
芯片介绍:
MC1496
模拟乘法器是对两个模拟信号(电压或电流)实现相乘功能的有源非线性器件,主要功能是实现两个互不相关信号的相乘,即输出信号与两输入信号相乘积成正比。
它有两个输入端口,即X
和Y
输入端口。
在高频电子线路中,振幅调制、同步检波、混频、倍频、鉴频、鉴相等调制与解调的过程,均可视为两个信号相乘或包含相乘的过程。
采用集成模拟乘法器实现上述功能比采用分离器件如二极管和三极管要简单的多,而且性能优越。
MC1496引脚图
MC1496的内部结构
3.RC滤波电路模块
RC滤波电路
四:
理论分析与计算
4.1扫频测试法理论依据
设频率响应为H(jω)的实系数线性时,不变系统在信号x(n)_Acos(ω0n+f)激励下的稳态输出为y(n)。
利用三角恒等式,可将输入表示为2个复指数函数之和:
因此,输出信号和输入信号是频率相同的正弦波,仅有两点不同:
第一,振幅被|H(ejω)|加权,即网络系统在ω=ω0的幅度函数值;
第二,输出信号相对于输入信号有一个数量为q(ω0)的相位时延,即网络系统在ω=ω0的相位值。
4.2DDS信号源
根据DDFS原理所产生的波形频率为:
式中fclk为基准频率,M为相位增量因子,N为累加器的位数。
M取22,N取24。
为得到100kHz的信号,而且在每个周期希望取到32个以上点,则累加器输出后级D/A转换需要至少3.2MHz的速度,于是选取建立时间为30ns、10位的DAC900,不仅满足了对D/A转换速度的要求,而且具有10位数据线,减少了D/A转换中固有的量化误差。
fclk取40MHz,频率的最小步进:
4.3相位差测量
设INl和IN2为两路具有相位差经整形后得到的方波信号,Gate2为INl和IN2经过异或后得到的脉冲信号,Fo为FPGA内部的标准高频脉冲信号,取40MHz。
将IN2八分频,结合单片机控制,可得到一个动态门控信号Gatel。
动态门控与脉冲信号相“与”,可得到门限内的有限个脉冲信号Gate2。
Gate1中含有IN2的4个周期,Gate2含有8个异或脉冲。
其中分别对clk进行计数,分别得到计数值M和N。
根据公式精确地测得相位差绝对值。
其时序如图2所示。
由于对高频脉冲计数可能存在±
1的误差:
在F=100kHz时,Mmin≈1600,则δmax(△ψ)≈0.9°
FPGA内部生成一个D触发器,以INl为触发器的数据输入,IN2为触发器的时钟输入,若触发器输出端为高电平,则△ψ>
O°
;
若输出端为低电平,则△ψ<
0°
5.系统软件设计
初始化系统:
加电后完成系统硬件和系统变量的初始化。
其中包括了外围元器件8255的状态设定。
等待功能键输入:
由键盘输入各功能选择:
包括点频测量(其中有显示频率、幅度、相位,打印测量结果),扫频测量,设置频率上限、下限及步进频率值。
显示、打印频率特性曲线等功能。
系统软件主要完成以下功能:
频率上、下限及步长的预置:
根据fo=10M(Hz),由fo反算出步长M后,送给波形发生器的相位累加器寄存器,然后锁存。
完成频率步进:
只要在原频率的基础上累加步长M,然后送出即可实现步进。
结果显示、打印:
由CPU把采样数据处理后送LED,在显示频率时,低五位LED显示结果,最高位LED显示标志“F”;
显示幅度时,低三位显示结果,最高位LED显示标志“U”;
显示相位时,当结果为正或零,第三位不显示,当结果负,显示“-”,低三位显示数值,最高位LED显示标志“P”。
需要时把测量结果转换成ASCⅡ码送打印机打印。
为了提高测量精度,软件设计中采用了多种滤波方法,如判断、平均等。
绘制、打印特性曲线:
在扫频模块中采样到的数据经CPU读入并存储在外部RAM,扫频完毕后由CPU读出经D/A变换后加到示波器Y轴上,同时由P1.6口发脉冲经计数器和D/A形成锯齿波扫描电压加到X轴上,每发完一组数据,P1.7口变化一次电平,以达到在示波器上同时显示幅频和相频特性曲线的目的。
打印时把相应的数据值送给打印机即可。
各子程序流程图如下:
扫频测量子程序流程图相位测量子程序流程图
软件程序:
//***************************************************//
//子程序说明//
//函数2:
ad9851_reset_serial()
//复位ad9851,之后为串口写入模式
//函数4:
ad9851_wr_serial(unsignedcharw0,doublefrequence)
//串口写ad9851数据,w0为ad9851中w0的数据,frequence
//为写入的频率
//需定义的位:
//ad9851_w_clk;
//ad9851_fq_up;
//ad9851_rest;
//ad9851_bit_data;
//例:
//sbitad9851_w_clk=P2^2;
//sbitad9851_fq_up=P2^1;
//sbitad9851_rest=P2^0;
//sbitad9851_bit_data=P1^7;
//写数据说明//
//写数据例:
//ad9851_reset()
//wr_lcd02_data(unsignedcharx)
//ad9851_wr_parrel(0x01,1000)
//ad9851_wr_serial(0x01,1000)
//---------------------------------------------------//
//程序//
#include<
reg51.h>
stdio.h>
intrins.h>
sbitad9851_w_clk=P1^1;
//P2.2口接AD9851的w_clk脚/PIN7
sbitad9851_fq_up=P1^0;
//P2.1口接AD9851的fq_up脚/PIN8
sbitad9851_rest=P1^2;
//P2.0口接AD9851的rest脚/PIN12
sbitad9851_bit_data=P2^7;
//P1.7口接AD9851的D7脚/PIN25
sbitk0=P1^4;
sbitk1=P1^5;
sbitk2=P1^6;
sbitk3=P1^7;
intb=0,c0=0,c1=0,d1=10,d2=400;
charl=0,b1=0,b2=0,b3=1,a1=2,a2=0,a3=0;
//l用延时的
/*************************************/
voidDelay(unsignedintt)
{intx,y;
for(x=0;
x<
t;
x++)
for(y=114;
y>
0;
y--);
//while(--t);
}
//ad9851复位(串口模式)//
voidad9851_reset_serial()
{
ad9851_w_clk=0;
ad9851_fq_up=0;
//rest信号
ad9851_rest=0;
l=0;
ad9851_rest=1;
//w_clk信号
ad9851_w_clk=1;
//fq_up信号
ad9851_fq_up=1;
//向ad9851中写命令与数据(串口)//
voidad9851_wr_serial(unsignedcharw0,doublefrequence)
unsignedchari,w;
longinty;
doublex;
//计算频率的HEX值
x=4294967295/144;
//适合180M晶振/180为最终时钟频率(或30M六倍频)
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz!
!
frequence=frequence/10;
//100KHZ
frequence=frequence*x;
y=frequence;
//写w4数据
w=(y>
>
=0);
for(i=0;
i<
8;
i++)
ad9851_bit_data=0;
////
ad9851_bit_data=(w>
i)&
0x01;
l=0;
//写w3数据
8);
//写w2数据
16);
//写w1数据
24);
//写w0数据
w=w0;
//移入始能
//测试程序1000Hz//
main()
//P0=0x00;
//P1=0x00;
//P2=0x00;
//P3=0x00;
//b=1;
ad9851_reset_serial();
k0=1;
//不同的模式,0时扫频,1时任意设置频率。
while
(1)
{
//ad9851_reset_serial();
//复位
if(k0!
=0)//如果add键被按下
Delay(10);
//延时消抖
if(k0!
=0)//如果add键确实被按下
if(k1==0)//如果add键被按下
{
if(k1==0)//如果add键确实被按下
{
while(!
k1);
//等待松手
{
a1=a1+1;
if(a1>
4)a1=0;
}
}
}
if(k2==0)//如果add键被按下
if(k2==0)//如果add键确实被按下
k2);
a2=a2+1;
if(a2>
9)a2=0;
}
if(k3==0)//如果add键被按下
if(k3==0)//如果add键确实被按下
k3);
a3=a3+1;
if(a3>
9)a3=0;
if(a1==4)
a2=a3=0;
if((a1==0)&
&
(a3==0))
a2=1;
c1=a1*100+a2*10