高精度失真度测试仪.docx
《高精度失真度测试仪.docx》由会员分享,可在线阅读,更多相关《高精度失真度测试仪.docx(22页珍藏版)》请在冰点文库上搜索。
![高精度失真度测试仪.docx](https://file1.bingdoc.com/fileroot1/2023-6/29/f9733708-6484-4c5c-935b-1e2678c26161/f9733708-6484-4c5c-935b-1e2678c261611.gif)
高精度失真度测试仪
高精度失真度测试仪
摘要:
设计并制作了一个高精度失真度测试仪,用于测量正弦波、方波以及三角波等等信号波的失真度。
该测试仪硬件系统基于AT89S52单片机,控制包括过零比较整形电路,倍频锁相环,加法器,A/D信号采集和系统显示板五部分组成;软件基于离散型傅立叶变换,应用准同步技术的失真度测量方法。
由于锁相环的作用,使得采样周期与信号周期严格同步,有效地克服了传统的基于DFT的失真度测量方法中非整周期采样引起的频谱泄漏对测量结果的影响,实验结果表明,该方法的采用使失真度测量的准确度提高了一个数量级,测量误差在百分之一以下。
关键字:
倍频锁相环,A/D信号采集,离散型傅立叶变换
1.系统设计
1.1设计要求
1.1.1设计任务
设计并制作了一个高精度失真度测试仪,示意图如图一。
图1总体示意图
1.1.2技术要求
(1)能测量正弦波、方波以及三角波等等信号波的失真度:
(2)失真度测量结果的相对误差在百分之五以内。
1.2总体方案
1.2.1总体设计思路
根据设计要求中的整体示意图,可确定系统构造为:
输入的待测信号f0经过零比较电路整形,变成脉冲信号f1进入倍频锁相环,产生倍频脉冲信号f2;同时,待测信号f0通过加法器,进行零下补偿,得到信号f3,使得其信号幅值大于或等于零,便A/D转换器进行信号采集;脉冲信号f1和脉冲信号f2连入单片机外部中断T0,T1中,通过脉冲信号f1的中断请求开通A/D转换器,通过脉冲信号f2的中请求进行数据采集;采集得到的数据送入单片机进行数据处理,然后通过LCD输出测量结果。
由于测量和数据处理中,数据量和计算量较大,故本系统在单片机外扩展了一片外部RAM,以便数据的存放。
1.2.2总体设计方案
根据总体设计思路,可画出总体方案方框图,如图2。
图2总体方案方框图
1.3单元电路设计
1.3.1过零比较整形
采用比较芯片LM311,f0反相输入信号,正相输入端接地,输出信号f1即为脉冲信号。
1.3.2加法器
为方便数据采集,需将待测信号幅值变换到A/D转换器的采集范围内。
fo通过加法器把信号提到零上来,然后通过放大电路把最大幅值调整到+5V,即为信号f3。
图5两级运放电流/电压变换电路
1.3.3锁相环
集成锁相环芯片CD4046是由CMOS电路构成的多功能单片集成锁相环,具有功耗低、输入阻抗高、电源电压范围宽等优点。
在信号处理和数字系统中,CD4046都得到了广泛的应用,常被用于频率调制、频率锁定、时钟同步和频率合成等方面。
CD4046的工作频率小于1.2MHz,属于低频锁相环。
电源电压为5~15V,输出驱动电流大于2.6mV。
其内部结构及典型应用电路如图3-12所示。
图3-12CD4046内部结构图
与其他锁相环不同的是:
CD4046具有两个可选用的鉴相器Ⅰ和Ⅱ:
相位比较器Ⅰ是一个异或门,适用于输入信号中噪声分量较多、信噪比较低的场合,但必须要求输入信号具有50%的占空比。
当无输入信号或噪声信号输入时,异或门输出平均电压等于UDD/2,经低通滤波器后送到VCO输入端9,使VCO在中心频率上起振。
相位比较器Ⅱ由四个触发器、控制门和三态输出电路组成,是边缘触发工作方式的鉴相器,因而对输入信号占空比无特定的要求,但相位比较器Ⅱ的信噪比容限不如相位比较器Ⅰ高。
选用相位比较器Ⅱ为鉴相器时,捕获带和同步带具有相同的带宽
。
如图3-12所示,CD4046采用的是RC型压控振荡器,必须外接电容C1和电阻R1作为充放电元件,当锁相环对跟踪的输入信号的频率宽度有要求时还需要外接电阻R2。
CD4046的工作频率与芯片外围的器件取值有关。
为使锁相环工作在最佳状态,在选择外接元件参数时,既要考虑压控振荡器的中心频率
,也要兼顾最高频率
和最低频率
。
根据经验公式得
、
,压控振荡器的中心频率为
。
其中C0为寄生电容,约为30pF;R1、R2的取值一般在10KΩ~1MΩ之间;UDD≥10V时,C1取值大于50pF;UDD≥5V时,C1取值大于100pF。
本系统中中心频率为50Hz。
设计电路时,C1取值为164pF,R1为一最大电阻为100KΩ的电位器,R2接空,即R2无穷大。
图3-13CD4046的倍频电路
1.3.4数据采集
采用A/D转换芯片ADC0809。
电路如下:
1.3.5结果显示
显示采用LCD。
电路如下:
2.数据处理
2.1准同步采样原理
对于周期信号的某些特征的测量可以看作是进行一种积分求均值运算。
对于任意周期信号的平均值
式中,T为信号f(t)的周期,T0为积分起点。
若将积分区间[t0,t0+T]等分为N段,匀采样得到N个数据,可以证明当N>M(M为信号,f(t)的最高谐波次数)时,有如下等式成立:
通过增加采样点数N,就可以使平均值的测量结果达到令人满意的精度,这就是同步采样算法及其理论基础。
然而,在实际的采样中不可能做到采样周期与信号周期严格同步,也就是在实际采样中,区间的长度不是T而是,T±△,其中△为同步误差,准同步算法就是要在|△|不太大的情况下,通过适当增加采样数据量来实现对高准确度估计的算法,较好地解决了同步误差对测量准确度的影响问题,同时降低对采样时间问隔的要求。
假设被测信号,f(t)处于稳定状态,将宽度为,n<(T+△)的积分区间[t0,t0+n×(T+△)]等分为,n×N段,由此得到n×N+1个数据f(ti),(i=i0,i0+1……i0+n×N),则有如下定义:
经过n层递推运算
可以最终表示为如式(5)所示的形式,n为权系数。
式(3)和式(4)中,
(i=i0,i0+1……i0+n×N)为对应的数值求积公式所确定的权系数(一般的求均值运算式所有系数为1);C为递推计算所在的层数;k为序号,k=1,……,(n-c)×N+1,这说明在从第1层到第n层的递推计算中各层中F的个数是逐渐以N个数为步长递减的,例如,
=l,n=3,N=2,信号S长度为7时,递推过程的计算情况如表1所示。
在实际的测量中,为了实现当递推的层数,n很小时,就能使
在一定的精度条件下接近
,这就必须要求:
|△|较小(|△|<0.2л),同时满足|△|<ε×2л(ε为与递推次数相关的一个足够小的常数),且N>1.2M(假定N>30,若N<30可将系数适当加大)。
由于在实际测量中希望尽可能地减小同步误差△以减少递推次数,从而提高计算速度,所以称以上所讲的数据处理方法为准同步采样法。
2.2利用准同步技术实现失真度的高精度测量
2.2.1失真度的定义
失真度定义为信号中全部谐波分量的能量与基波能量之比的方根值,如果负载与信号频率无关,则信号的失真度也可以定义为全部谐波电压的有效值与基波电压的有效值之比并以百分数表示,即
式中
为失真度,P为信号总功率,P1为基波信号的功率,U1为基波电压的有效值,U2~Un为谐波电压有效值。
因此,失真度可以通过基波和各次谐波的幅值计算得到。
2.2.2周期信号基波和谐波幅值的测量
任意周期信号都可通过傅立叶变换成以下格式:
周期信号(M为最高谐波次数)存在同步误差△的情况下,取n×N+1个数据(本系统中,采用20倍频,测量四个周期,故n=4,N=20),当满足
是,经过n层递推计算,有:
根据三角函数的正交特性,基波与各次谐波的幅值有:
由式(8)可知,第m次谐波的幅值Am可归结为对周期信号f(t)积分求均值运算,则采用准同步采样方法可以获得接近予“理想同步采样”的幅值测量准确度。
综合式(5)、式(7)和式(8)可得准同步采样时谐波幅值计算公式:
2.2.3基于准同步算法的失真度计算
由式(9)求得各次谐波幅值,结合失真度定义式(6),准同步条件下,得到进行失真度计算公式:
3.软件设计
3.1设计中所用软件及编程语言的简介
本设计硬件由数字模拟电路组成,软件为Keil,编程语言是C51。
调试时用Wave仿真器进行模拟仿真调试。
Keil软件是目前最流行开发MCS-51系列单片机的软件,它提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
即使不使用C语言而仅使用汇编语言,Keil方便易用的集成环境、强大的软件仿真调试工具也会大大提高仿真调试的效率。
Wave是南京伟福实业有限公司开发的集成调试环境,配合E6000、H51、K51、P51、LPC76X、LPC932、PIC6000、LAB2000P、LAB6000等型号的伟福仿真器的使用,支持C语言的编写和软件仿真。
3.2总体程序流程
4系统数据测试
4.1测试仪器与设备
支流稳压稳流电源,SG1733SB3A
信号源,Agilent33120A
4.2指标测试
每种频率测三次,三种波形。
失真度单位为:
%
正弦波实际失真度为0,本系统理论值为0.2%。
实际测量值分布在0.46%---1.51%之间,大部分数据都在1%以下,而实际要求为5%以下。
达到了要求。
方波实际失真度为48%,本系统理论值为50.2%。
系统实际测量值分布在45.09%---50.32%之间,即相对误差在2.91%----2.32%之间,而实际要求为5%以下。
达到了要求。
三角波实际失真度大约为12%,本系统理论值为12.5%。
系统测试结果的相对误差都在5%以下。
达到了要求。
参考文献
1.书
[1]谢自美编,<<电子线路设计·实验·测试>>,武汉:
华中理工大学出版社,2000年第二版。
[2]阎石主编,<<数字电子技术基础>>,北京:
高等教育出版社,1998年11月第四版。
[3]康光华编,<<电子技术基础·模拟部分>>,北京:
高等教育出版社,1999年6月第四版。
[4]李华编,<<电子线路设计·实验·测试>>,武汉:
华中理工大学出版社,2000年第二版。
2.论文
袁晓峰,许化龙,陈淑红,<<基于准同步技术的失真度测量方法研究>>。
附录c51程序
/***************失真度测量******/
#include
#include
#include
#include
#definelcd_dataXBYTE[0xdfff]//LCD数据写入地址//
#definelcd_comXBYTE[0x9fff]//LCD指令写入地址//
#definelcd_busyXBYTE[0xbfff]//LCD查忙标志地址//
#definead_0809XBYTE[0xefff]//AD0809地址//
#defineulongunsignedlong
#defineucharunsignedchar
#defineuintunsignedint
#definePI3.1415926
/****************全局变量定义****************/
//ucharpdataa[82];
ucharxdata*s;
uchari=1;
ucharDisp_Buff[16];//LCD显示缓冲区//
/********准同步系数********************/
uintcodep[82]={
0,1,4,10,20,35,56,84,120,65,220,
286,264,455,560,680,816,969,1140,1330,1540,
1770,2018,2281,2556,2840,3130,3423,3716,4006,4290,
4565,4828,5076,5306,5515,5700,5858,5986,6081,6140,
6160,6140,6081,5986,5858,5700,5515,5306,5076,4828,
4565,4290,4006,3716,3423,3130,2840,2556,2281,2018,
1770,1540,1330,1140,969,816,680,560,455,364,
286,220,165,120,84,56,35,20,10,4,1};
/*************************函数声明********************/
/*********公用子程序**********/
voiddelay(uintTime);//短延时
voidL_delay(uchark);//长延时
voidf_busy(void);//查忙标志
voidlcd_clear(void);//清屏LCD
voidDatas_dis(ulongDatas,ucharP_str,charP_end,ucharP_pon);//数字显示
voidChars_dis(uchar*s);//字符显示
//voidLCD_Dis(ucharstr,ucharend);//LCD显示
voidLCD_Dis();
/*********功能子程序***************/
voidDFT(void);//求取基波和谐波的幅值
/*********中断函数*****************/
//voidint0(void)interrupt0using2//*****计数器中断INT0******/
//voidint1(void)interrupt2using3//*****计数器中断INT1******/
/***********************************************************/
/****************数据显示程序******************/
/*Datas:
Thedatatobedisplayed;P_str:
Startingdisplayposition;
P_end:
Endingdisplayposition;P_pon:
Pointdisplayposition;
以上所述显示位置均为LCD上的绝对位置。
P_end比P_pon小1,则无小数点,按整数方式显示,以此方式显示时不能显示到显示屏的最右边一位;
所有的整型都化成ulong后送显,小数以整数表示以减少代码量*/
voidDatas_dis(ulongDatas,ucharP_str,charP_end,ucharP_pon)
{
ulongd_t;
ucharm;
for(m=0;m<16;m++)
Disp_Buff[m]='';
for(d_t=1;P_end>=P_str;P_end--)
{
if(P_end==P_pon)
{
Disp_Buff[P_end]='.';
}
else
{
Disp_Buff[P_end]=(Datas/d_t>0)?
0x30+((Datas/d_t)%10):
((P_end0x20:
0x30);
d_t=d_t*10;
}
}
}
/***************字符显示程序*******************/
/*整体刷以便显示缓冲区,在Data_dis();之前使用,将要显示数字的位用空格填充,
用其他符号填充也可。
入口为字符串首地址*/
voidChars_dis(uchar*s)
{
ucharw;
for(w=0;w<16;w++)
Disp_Buff[w]=s[w];
}
/****************************************************************************************/
/**************软件延时程序*************/
/****************************
voiddelay(uintTime)
{
while(Time--);//短延时
}*/
voiddelay(uintTime)
{inti;
for(i=0;i