资源描述
高精度失真度测试仪摘 要:设计并制作了一个高精度失真度测试仪,用于测量正弦波、方波以及三角波等等信号波的失真度。该测试仪硬件系统基于AT89S52单片机,控制包括过零比较整形电路,倍频锁相环,加法器,A/D信号采集和系统显示板五部分组成;软件基于离散型傅立叶变换,应用准同步技术的失真度测量方法。由于锁相环的作用,使得采样周期与信号周期严格同步,有效地克服了传统的基于DFT的失真度测量方法中非整周期采样引起的频谱泄漏对测量结果的影响,实验结果表明,该方法的采用使失真度测量的准确度提高了一个数量级,测量误差在百分之一以下。关键字:倍频锁相环,A/D信号采集,离散型傅立叶变换目录1. 系统设计31.1 设计要求31.1.1 设计任务31.1.2 技术要求31.2 总体方案31.2.1 总体设计思路31.2.2 总体设计方案41.3单元电路设计41.3.1 过零比较整形41.3.2 加法器41.3.3 锁相环51.3.4 数据采集71.3.5 结果显示72. 数据处理72.1 准同步采样原理72.2利用准同步技术实现失真度的高精度测量92.2.1 失真度的定义92.2.2 周期信号基波和谐波幅值的测量92.2.3 基于准同步算法的失真度计算103. 软件设计103.1 开发软件及编程语言的简介103.2 总体程序流程104 系统测试124.1 测试仪器与设备124.2 指标测试12参考文献12附录:c51程序:131.系统设计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,属于低频锁相环。电源电压为515V,输出驱动电流大于2.6mV。其内部结构及典型应用电路如图3-12所示。图3-12 CD4046内部结构图与其他锁相环不同的是:CD4046具有两个可选用的鉴相器和:相位比较器是一个异或门,适用于输入信号中噪声分量较多、信噪比较低的场合,但必须要求输入信号具有50的占空比。当无输入信号或噪声信号输入时,异或门输出平均电压等于UDD/2,经低通滤波器后送到VCO输入端9,使VCO在中心频率上起振。相位比较器由四个触发器、控制门和三态输出电路组成,是边缘触发工作方式的鉴相器,因而对输入信号占空比无特定的要求,但相位比较器的信噪比容限不如相位比较器高。选用相位比较器为鉴相器时,捕获带和同步带具有相同的带宽。如图3-12所示,CD4046采用的是RC型压控振荡器,必须外接电容C1和电阻R1作为充放电元件,当锁相环对跟踪的输入信号的频率宽度有要求时还需要外接电阻R2。CD4046的工作频率与芯片外围的器件取值有关。为使锁相环工作在最佳状态,在选择外接元件参数时,既要考虑压控振荡器的中心频率,也要兼顾最高频率和最低频率。根据经验公式得、,压控振荡器的中心频率为。其中C0为寄生电容,约为30pF;R1、R2的取值一般在10K1M之间;UDD10V时,C1取值大于50pF;UDD5V时,C1取值大于100pF。本系统中中心频率为50Hz。设计电路时,C1取值为164 pF,R1为一最大电阻为100 K的电位器,R2接空,即R2无穷大。图3-13 CD4046的倍频电路1.3.4 数据采集采用A/D转换芯片ADC0809。电路如下: 1.3.5 结果显示显示采用LCD。电路如下:2. 数据处理2.1 准同步采样原理对于周期信号的某些特征的测量可以看作是进行一种积分求均值运算。对于任意周期信号的平均值式中,T为信号 f(t)的周期,T0为积分起点。若将积分区间t0,t0+T等分为N段,匀采样得到N个数据,可以证明当NM (M为信号,f(t)的最高谐波次数)时,有如下等式成立:通过增加采样点数N,就可以使平均值的测量结果达到令人满意的精度,这就是同步采样算法及其理论基础。然而,在实际的采样中不可能做到采样周期与信号周期严格同步,也就是在实际采样中,区间的长度不是T而是,T,其中为同步误差,准同步算法就是要在| 不太大的情况下,通过适当增加采样数据量来实现对高准确度估计的算法,较好地解决了同步误差对测量准确度的影响问题,同时降低对采样时间问隔的要求。假设被测信号,f(t)处于稳定状态,将宽度为,n(T+)的积分区间t0,t0+n(T+)等分为,nN 段,由此得到nN+1个数据f(ti),(i=i0,i0+1i0+nN),则有如下定义:经过n层递推运算可以最终表示为如式(5)所示的形式,n为权系数。式(3)和式(4)中,(i=i0,i0+1i0+nN)为对应的数值求积公式所确定的权系数(一般的求均值运算式所有系数为1);C为递推计算所在的层数;k为序号,k=1,(n-c)N+1,这说明在从第1层到第n层的递推计算中各层中F的个数是逐渐以N 个数为步长递减的,例如,=l,n=3,N=2,信号S长度为7时,递推过程的计算情况如表1所示。在实际的测量中,为了实现当递推的层数,n很小时,就能使在一定的精度条件下接近,这就必须要求:|较小(|0.2),同时满足|1.2 M (假定N30,若N30可将系数适当加大)。由于在实际测量中希望尽可能地减小同步误差以减少递推次数,从而提高计算速度,所以称以上所讲的数据处理方法为准同步采样法。2.2 利用准同步技术实现失真度的高精度测量2.2.1 失真度的定义失真度定义为信号中全部谐波分量的能量与基波能量之比的方根值,如果负载与信号频率无关,则信号的失真度也可以定义为全部谐波电压的有效值与基波电压的有效值之比并以百分数表示,即式中为失真度,P为信号总功率,P1为基波信号的功率,U1为基波电压的有效值,U2Un为谐波电压有效值。 因此,失真度可以通过基波和各次谐波的幅值计算得到。2.2.2 周期信号基波和谐波幅值的测量任意周期信号都可通过傅立叶变换成以下格式:周期信号(M 为最高谐波次数) 存在同步误差 的情况下,取nN+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信号源,Agilent33120A4.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#define lcd_data XBYTE0xdfff /LCD数据写入地址/#define lcd_com XBYTE0x9fff /LCD指令写入地址/#define lcd_busy XBYTE0xbfff /LCD查忙标志地址/#define ad_0809 XBYTE0xefff /AD0809 地址 /#define ulong unsigned long#define uchar unsigned char#define uint unsigned int#define PI 3.1415926/* 全局变量定义*/uchar pdata a82;uchar xdata *s;uchar i=1;uchar Disp_Buff16; /LCD显示缓冲区/*准同步系数*/uint code p82=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 ;/*函数声明*/*公用子程序*/void delay(uint Time); /短延时void L_delay(uchar k); /长延时void f_busy(void); /查忙标志void lcd_clear(void); /清屏LCDvoid Datas_dis(ulong Datas,uchar P_str,char P_end,uchar P_pon); /数字显示void Chars_dis(uchar *s); /字符显示/void LCD_Dis(uchar str,uchar end); /LCD显示void LCD_Dis();/*功能子程序*/void DFT(void);/求取基波和谐波的幅值/*中断函数*/ /void int0(void) interrupt 0 using 2 /*计数器中断 INT0*/ /void int1(void) interrupt 2 using 3 /*计数器中断 INT1*/*/*数据显示程序*/*Datas:The data to be displayed;P_str:Starting display position; P_end:Ending display position; P_pon:Point display position; 以上所述显示位置均为LCD上的绝对位置。 P_end比P_pon小1,则无小数点,按整数方式显示,以此方式显示时不能显示到显示屏的最右边一位; 所有的整型都化成ulong后送显,小数以整数表示以减少代码量 */void Datas_dis(ulong Datas,uchar P_str,char P_end,uchar P_pon) ulong d_t; uchar m; for(m=0;m=P_str;P_end-) if(P_end=P_pon) Disp_BuffP_end=.; else Disp_BuffP_end=(Datas/d_t0)?0x30+(Datas/d_t)%10):(P_endP_pon-1)?0x20:0x30); d_t=d_t*10; /*字符显示程序*/*整体刷以便显示缓冲区,在Data_dis();之前使用,将要显示数字的位用空格填充, 用其他符号填充也可。 入口为字符串首地址 */void Chars_dis(uchar *s) uchar w; for(w=0;w16;w+) Disp_Buffw=sw;/*/*软件延时程序*/*void delay(uint Time) while(Time-); /短延时 */void delay(uint Time) int i; for(i=0;iTime;i+);/*/void L_delay(uchar k) uchar p; for(p=0;pk;p+) /软件长时间延时 delay(40000);/*/*查忙标志子程序*/void f_busy(void) int p2,y; int t7; p2=0x80; do y=lcd_busy;t7=p2&y; while (t7=0x80); /*/*LCD清屏*/void lcd_clear(void) P0=0x00; f_busy(); lcd_com=0x01; f_busy(); lcd_com=0x38; f_busy(); lcd_com=0x0e; f_busy(); lcd_com=0x06;/*/*void LCD_Dis(uchar str,uchar end) uchar r=0; for(r=str-1;r8?8:end);r+) f_busy(); /显示前八位 lcd_data=Disp_Buffr; if(end8) f_busy(); /移光标 lcd_com=0xc0; for(r=8;rend;r+) /显示后八位 f_busy(); lcd_data=Disp_Buffr; */void LCD_Dis() uchar r; f_busy(); /移光标 lcd_com=0x80; for(r=0;r8;r+) f_busy(); lcd_data=Disp_Buffr; delay(10000); f_busy(); /移光标 lcd_com=0xc0; for(r=8;r16;r+) f_busy(); lcd_data=Disp_Buffr; /*/void DFT(void) int m,n; double Real_sum,Imag_sum,Mean_sq_power=0.0,A1,distortion; /* */ for(m=1;m=13;m+) Real_sum=0; Imag_sum=0; for(n=1;n=81;n+) Real_sum+=pn*(*(s+n)/51.0-2.5)*cos(0.3102807506*m*n); Imag_sum+=pn*(*(s+n)/51.0-2.5)*sin(0.3102807506*m*n); /*Real_sum+=pn*(*(s+n)/51.0-2.5)*cos(2*4*PI*m*n/81); Imag_sum+=pn*(*(s+n)/51.0-2.5)*sin(2*4*PI*m*n/81); /*Real_sum+=pn*(an/51.0-2.5)*cos(1.19679718*4*m*n); Imag_sum+=pn*(an/51.0-2.5)*sin(1.19679718*4*m*n); /* Real_sum+=(an/51.0-2.5)*4*cos(2*PI*m*n/21)/21; Imag_sum+=(an/51.0-2.5)*4*sin(2*PI*m*n/21)/21;*/ if(m=1) A1=pow(Real_sum,2)+pow(Imag_sum,2); continue; /Mean_sq_power+=pow(Real_sum,2)+pow(Imag_sum,2); Mean_sq_power+=Real_sum*Real_sum+Imag_sum*Imag_sum; distortion=sqrt(Mean_sq_power/A1); lcd_clear(); /Chars_dis( ); Datas_dis(ulong)(distortion*10000),0,8,4); LCD_Dis();/*/*中断INT0*/void int0(void) interrupt 0 using 2 uchar b; ad_0809=0; /delay(70); b=ad_0809; EX0=0; /延时半个周期 /delay(40); EX1=1; ad_0809=0;/*中断INT1*/void int1(void) interrupt 2 using 3 uchar c; /ai=ad_0809; c=ad_0809; *(s+i)=c; EA=0 ; i+; if(i=82) EA=0; else ad_0809=0; / delay(5); EA=1; main() lcd_clear(); Chars_dis( wait! ); LCD_Dis(); L_delay(2); s=0xf010; IT0=1; /中断设订 IT1=1; EX0=1; EA=1; while(i!=82); DFT(); while(1);
展开阅读全文