1577.简易信号测量仪.doc
简易信号测量仪 摘 要本系统以单片机为核心设计了一种用于测量频率、周期、脉宽、占空比、峰峰值的简易信号测量仪,其中还可分辩正弦波与方波,利用单片机的数学运算和控制功能,结合部分中规模数字电路,实现测量中的功能自动切换。各项实测表明,设计原理正确合理,指标符合设计要求。Abstract A simple signal instrument base on a microcontroller can measure frequency, period, pulse width , duty cycle and Vpp, and can differentiate sine wave from square wave .By taking full use of the microcontroller and by combining some middle scale IC, can switch automatically among different function. The test shown that the theory is correct and reasonable, and index satisfy the requirement of design. 一、 方案比较及论证1、 方案比较方案一:系统测频部分采用中小规模数字集成电路,对输入信号作分频整形处理后,再与1s脉宽的标准信号相与,其输出作为计数脉冲,由计数器计数,然后锁存、译码输出到数码管显示。该方案的特点是硬件电路简单,但工作速度低,精度差,难以达到设计要求,而且不能测量周期与占空比。方案二:系统采用可编程逻辑器件作为信号处理及系统控制核心,完成包括计数、门控、显示等一系列工作。该方案集成度高,但可编程逻辑器件价格较高,在本题中使用,将导致系统性能价格比降低。方案三:系统采用MCS-51单片机AT89C52作为控制核心,由于单片机自带计数器的计数频率上限较低,输入时钟的频率通常只能是系统时钟频率的几分之一甚至几十分之一,因此采用外部计数器对输入信号进行计数,计数值再由单片机读取,单片机只完成运算、控制及显示功能。该方案由于采用单片机技术,使其具有智能化的特点,简化了硬件电路, 提高了测量精度, 同时也能利用软件对测量误差进行补偿,并能方便地对系统进行功能扩展与改进。2、 方案确定分析以上三种方案的优缺点,方案三具有更大的优越性、灵活性,因此我们采用方案三作为具体实施的方案。二、 基本测量原理1、 频率、周期测量频率的测量按照频率的定义进行:在某个已知的标准时间间隔T(如1s)内,测出被测信号重复的次数N,f=N/T就是信号频率。基本原理框图如图1所示放大整形时间闸门计数器译码显示门控信号晶振分频电路被测信号图中晶振提供测量的时间基准,经分频后产生准确地时间间隔T,作为门控信号去开启与关闭时间闸门。闸门开启时,被测信号经过放大整形后,进入计数器进行计数,闸门关闭时,停止计数。若在时间间隔T内,计数值为N,则被测信号的频率f=N/T。 由于单片机具有程序运算功能,且频率为周期的倒数,测的频率值,即可通过运算得到周期数。2、 脉宽测量 测量电路在检测到脉冲的上升沿时打开计数器,在下降沿时关闭计数器,所测脉冲宽度为 ,其中N为计数值,fs 为计数器的工作频率。3、 峰值测量 测量正弦信号VPP的原理框图如下图所示被测信号峰值电压采样保持滤波显示 峰值电压采样保持电路由一片采样保持器芯片和一块电压比较器构成。采样保持器的输出电压和输入电压通过电压比较器进行比较,当Vi>V0时,电压比较器输出高电平,送到采样保持器的逻辑控制端8脚,使之处于采样状态;当Vi达到峰值而下降时,Vi<V0,电压比较器输出低电平,采样保持器的逻辑控制端置低电平,使之处于峰值保持状态。 4、 相位测量 相位指两个同频率正弦信号间的相位角之差,测量方法如图4 所示,放大整形时间闸门计数器译码显示门控信号晶振rdfe振 振RDFR振被测信号1被测信号2放大整形相位差=3600(T/T),T为两方波前沿的时间差,T为正弦信号周期。三、 系统设计 硬件部分设计1. 电源部分由于被测信号易受干扰而发生失真,使测量精确度下降,故自制稳压电源供电,其原理图如下:双12V的交流电经四个二极管整流、电容滤波后经两个三端稳压管稳压得到8V后给系统的运放等供电,再经7805稳压管为单片机提供工作电压+5V。2. 信号整形电路电路原理图如下单片机很难直接对正弦信号进行频率的测量,当正弦波和方波在同一输入端时就更难直接测量,两正弦波的相差也无法直接测量,因而使用整形电路把正弦波变成占空比为50%,频率不变的方波,便于进行频率和相差的测量。图中,正弦信号用电压比较器LM393和0.1V的电压作比较,便可得到同频的方波,用于测量其频率。和负0.1V比较可得负半波对应的负脉冲,进入单片机后可识别是否是正弦波,原信号和相移后的信号经过零比较后可得到同频的两路方波信号。稳压管用于电平的转换。3. Vpp测量电路电路原理图如下:由采样保持集成电路LF398和电压比较器LM393、场管等组成峰值电压采样保持电路,其原理是:输入的电压进入采样集成,对电容充电,电压达到最大值(峰值)之后,输出的电压和输入的电压作比较,电压达到最大值(峰值)之后,由于输出电压大于圆锥形入电压,比较器的输出使采样集成禁止电压的输入而保持峰值不变。运放OP07用于对信号进行两倍的电压放大,满足A/D转换器ADC0832的最大电压分辩条件。ADC0832是一个8位串行A/D转换器,用于采集正弦信号的Vpp值。4. 系统控制电路 其电路原理图如下:此部分是系统的主要控制部分,要完成信号的选通和计数脉冲的分频,及显示数值功能,两个模拟电子开关集成CD4052作为信号的选通开关,8253作为计数脉冲的分频,LCD1602作为系统的显示器件。 软件部分设计系统程序流程 开始初始化开始初始化开始初始化YYN测量脉宽、占空比信号指示测量相位差、峰峰值检测信号输入是否为方波?显示N测量频率、周期四、 系统指标测试1、 指标测试 频率、周期测试: 用函数信号发生器产生频率范围为1Hz10KHz的方波信号(TTL电平,占空比50%,),用标准频率计测的标准频率,再用设计的测量仪测出频率,求出误差。脉宽测试:用函数信号发生器产生频率范围为1Hz10KHz的方波信号,用标准周期测量仪测出周期,再除以2,得到标准脉宽,再用设计的测量仪测出脉宽,求出误差。占空比测试:用函数信号发生器产生频率范围为1Hz10KHz的方波信号,用标准周期测量仪测出周期,用标准数字频率计测出脉宽,两者相除,得到标准占空比,再用设计的测量仪测出占空比,求出误差。峰值测量:用用函数信号发生器产生频率范围为1Hz10KHz的正弦波信号,用标准交流毫伏表测出有效值,通过运算得到标准峰值,再用设计的测量仪测出占空比,求出误差。2、 设计与测试使用的仪器EM32501DDS任意波形发生器 HM1004-3双踪示波器(100M) HC-F1000L频率计 VC9801A数字万用表 WYK-303B2直流稳压源 微型计算机3、 测试数据表1 频率测量数据标准输入频率(Hz)本仪器测量值(Hz)本仪器测量误差1Hz1Hz0%1000Hz1000Hz0%5000Hz5000Hz0%7000Hz7000Hz0%10000Hz10000Hz0%表2 周期测量数据标准输入周期(ms)本仪器测量值(ms)本仪器测量误差0.1000.1000%0.2000.2000%1.0001.0000%2.0002.0000%10.0010.000%表3 脉宽测量数据(1K)标准输入脉宽(ms)本仪器测量值(ms)本仪器测量误差0.2000.1924.0%0.3000.3206.7%0.4000.4123%0.5000.5000%0.6000.5862.3%表5 占空比测量数据 标准输入频率(Hz)标准占空比(%)本仪器测量值(%)本仪器测量误差1K20195.0%1K30326.7%1K70682.8%1K80800%1K60566.7%标6 峰值测量数据标准输入频率(Hz)标准峰值(mV)本仪器测量值(mV)本仪器测量误差50400041203%500400042205.5%3K400041604.0%5K400040802%10K400040802%4、 误差分析及措施由于硬件的性能不够理想,信号经过器件时会有一些无法消除的迟延,这些迟延在高频率下引起的误差就尤为突出,系统使用的边沿触发器,其上升沿时间和其下降沿时间不相等,这信号的脉宽发生了一些变化,但这样的误差只能通过用性能更好的器件得到减小。计数脉冲也是的精度产生误差的一个方面,脉冲的精度直接的影响了测量得到频值,因此,我们在系统的设计时,使用了稳定度好的有源晶振。因为测量频率范围比较大,因此,只用一个档难以达到高的精度,因而采用自动换档和不同频段用不同的测量方法来提高精度,减小误差。单片机的计数器对计数脉冲频率最大只支持500K,扩展支持更高频的计数将能提高测量的精度。 源代码:JS_A1DATA30H;计算用数据AJS_A2DATA31HJS_A3DATA32HJS_A4DATA33H JS_A5DATA34HJS_A6DATA35HJS_A7DATA36HJS_A8DATA37H;-JS_B1DATA38H;计算用数据BJS_B2DATA39HJS_B3DATA3AHJS_B4DATA3BH;-JS_C1DATA3CH;计算用数据CJS_C2DATA3DHJS_C3DATA3EHJS_C4DATA3FHJS_C5DATA40HJS_C6DATA41HJS_C7DATA42HJS_C8DATA43H;-DINSIDATA44H;-;显存设置DT_A1DATA45HDT_A2DATA46HDT_A3DATA47HDT_A4DATA48HDT_A5DATA49HDT_A6DATA4AHDT_A7DATA4BHDT_B1DATA4CHDT_B2DATA4DHDT_B3DATA4EHDT_B4DATA4FHDT_B5DATA50HDT_B6DATA51HDT_B7DATA52HDT_B8DATA53HDT_B9DATA54HDT_C1DATA55HDT_C2DATA56HDT_C3DATA57HDT_C4DATA58HDT_C5DATA59HDT_C6DATA5AHDT_C7DATA5BHDT_C8DATA5CHDT_D1DATA5DHDT_D2DATA5EHDT_D3DATA5FHDT_D4DATA60HDT_D5DATA61HDT_D6DATA62HDT_D7DATA63HDT_D8DATA64H;-F_D1DATA65HF_D2DATA66HT_D1DATA67HT_D2DATA68HT_D3DATA69HD_D2DATA6AHW_D1DATA6BHW_D2DATA6CHW_D3DATA6DHD_D1DATA6FHVPP_D1DATA70H VPP_D2DATA71HF_D3DATA72HX_D1DATA74HX_D2DATA75HX_D3DATA76H;SP79H;-OVEREQU20H;溢出标志ZXBEQU21HFBEQU22H;-OVEBITP0.0;管脚定义CLERBITP0.1CS_ADBITP0.2ZXB_DBITP0.2IOBITP0.3CLKBITP0.4RSBITP0.5FB_DBITP0.6EBITP0.7DDEQUP1PXEQUP1D0BITP1.0D1BITP1.1D2BITP1.2D3BITP1.3D4BITP1.4D5BITP1.5D6BITP1.6D7BITP1.7A12BITP2.0A11BITP2.1A2BITP2.2B2BITP2.3R11BITP2.4A34BITP2.5A1BITP2.6B1BITP2.7GATE10BITP3.0A81BITP3.1GATE2BITP3.2A80BITP3.3OUT2BITP3.4CS_BITP3.5RD_BITP3.6WR_BITP3.7;=ORG0000HAJMPSTARTORG000BH LJMPINTT0 ORG001BHAJMPINTT1ORG0030HSTART:LCALLINIT;初始化JMPMAIN;-INIT:MOVSP,#079HMOVA,#00H;清内存单元MOVR0,#4CH;开发、始单元CL1:MOVR0,AINCR0CJNER0,#72H,CL1;结束单元MOVP0,#0FFHMOVP1,#0FFHMOVP2,#0FFHMOVP3,#0FFHCLRGATE10MOV P1,#01H ;清除屏幕ACALL ENABLE MOV P1,#38H ;8位点阵ACALL ENABLE MOV P1,#0FH ;开显示ACALL ENABLE MOV P1,#06H ;移动光标ACALL ENABLE MOVTMOD,#1DH;MOVTH1,#03CHMOVTL1,#0B0HMOVTL0,#0MOVTH0,#0CLREACLROVERMOVDINSI,#22;定时时间=22*50MS=1.1SRET;=MAIN:CLRA11JMPBOXINLCALLBOXIN;波形识别LCALLGET_F;频率、周期测量JBZXB,AIN1LCALLGET_W;脉宽、占空比的测量JMPAIN2AIN1:LCALLGET_X;相位的测量LCALLGET_VPP;峰峰值的测量AIN2:LCALLXIANSHI;数据显示JMPMAIN;=波形识别BOXIN:MOVTMOD,#1DHSETBEASETBET1SETBTR1CLROVERBOXIN1:JBA11,BOXIN2JNBOVER,BOXIN1CLRZXBCLRFBLCALLZS_BXJNBA11,$BOXIN2:CLRTR1;关定时并置初值CLRET1CLREAMOVTH1,#03CHMOVTL1,#0B0HMOVDINSI,#22JNBA11,$JBA11,$MOVTMOD,#1DHSETBEASETBET1SETBTR1CLROVERBOXIN3:JBA11,BOXIN4JBA12,BOXIN5JNBOVER,BOXIN3JMPBOXINBOXIN4:SETBFBCLRZXBJMPBOXIN6BOXIN5:SETBZXBCLRFBBOXIN6:CLRTR1;关定时并置初值CLRET1CLREAMOVTH1,#03CHMOVTL1,#0B0HMOVDINSI,#22LCALLZS_BXRET;=频率、周期测量GET_F:LCALLGET_FF;计数法测频LCALLBIJIAO100JNCGET_F1LCALLGET_FT;测T法测频GET_F1:RET;-计数法测频GET_FF:CLRB2;CLRA2CLRB1CLRA1LCALLOUT_1SLCALLGET_JSMOVF_D3,R0MOVF_D2,TH0MOVF_D1,TL0LCALLWORK_TLCALLDIS_FFT;频率和周期放入显存RET;-测T法测频GET_FT:SETBA2;CLRB2SETBA1CLRB1LCALLOUT_4USLCALLGET_JSLCALLJS_DIV4;计数值乘以4MOVT_D3,R0MOVT_D2,TH0MOVT_D1,TL0LCALLWORK_FLCALLDIS_TFTRET;=BIJIAO100:MOVJS_A4,#0;测得频率是否大于或等于100Hz,返回CMOVJS_A3,F_D3MOVJS_A2,F_D2MOVJS_A1,F_D1MOVJS_B4,#0MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#100LCALLJIANFARET;=脉宽、占空比的测量GET_W:LCALLGET_WA;LCALLDIS_WD MOVA,DT_D4SUBBA,#5JNCGET_W1LCALLGET_WBLCALLDIS_WD;脉宽和占空比放入显存GET_W1:RET;-GET_WA:SETBA2CLRB2CLRA1SETBB1LCALLOUT_4USLCALLGET_JSMOVW_D3,R0MOVW_D2,TH0MOVW_D1,TL0LCALLW_DIV4LCALLWORK_D RET;=GET_WB:SETBA2CLRB2SETBA1SETBB1LCALLOUT_4USLCALLGET_JSLCALLJS_DIV4LCALLT_JSMOVW_D3,R0MOVW_D2,TH0MOVW_D1,TL0LCALLWORK_D RET;=GET_JS:SETBGATE10MOVTMOD,#1DHSETBEASETBET0CLRTR0MOVR0,#0MOVTH0,#0MOVTL0,#0SETBR11CLRR11JBGATE2,$SETBTR0JNBGATE2,$JBGATE2,$CLRTR0CLRET0CLREACLRGATE10RET;=峰峰值的测量GET_VPP:SETBCLER MOVR2,#100DJNZR2,$CLRCLERCLRCLERJBOVE,$SETBCS_ADCLRCLKNOPNOPCLRCS_ADNOPSETBIOCLRCLKNOPNOPSETBCLKNOPNOPSETBIOCLRCLKNOPNOPSETBCLKNOPNOPSETBIOCLRCLKNOPNOPSETBCLKNOPNOPCLRCLKSETBIOMOVR1,#8GET1:SETBCLKNOPNOPCLRCLKNOPNOPMOVC,IORLCADJNZR1,GET1SETBCS_ADMOVVPP_D2,#0;置入显示数高位MOVVPP_D1,A;置入显示数低位LCALLVPP_DIV2LCALLDIS_VPPLCALLZS_BXRET;=相位的测量GET_X:SETBB2CLRA2SETBB1CLRA1LCALLOUT_4USLCALLGET_JSLCALLJS_DIV4LCALLWORK_XLCALLDIS_XLCALLDIS_JX;显示极性RET;=T_JS:MOVJS_A4,#0;MOVJS_A3,T_D3MOVJS_A2,T_D2MOVJS_A1,T_D1MOVJS_B4,#0MOVJS_B3,R0MOVJS_B2,TH0MOVJS_B1,TL0LCALLJIANFAMOVR0,JS_A3MOVTH0,JS_A2MOVTL0,JS_A1RET;=WORK_T:MOVJS_A4,#00H;1000000(F 42 40)/F=TMOVJS_A3,#0FHMOVJS_A2,#42HMOVJS_A1,#40HMOVJS_B4,#00HMOVJS_B3,F_D3MOVJS_B2,F_D2MOVJS_B1,F_D1LCALLCHUFAMOVT_D3,JS_A3MOVT_D2,JS_A2MOVT_D1,JS_A1RET;=WORK_F:MOVJS_A4,#3BH;1000000000(3B 9A CA 00)/T=F(mHz)MOVJS_A3,#9AHMOVJS_A2,#0CAHMOVJS_A1,#00HMOVJS_B4,#00HMOVJS_B3,T_D3MOVJS_B2,T_D2MOVJS_B1,T_D1LCALLCHUFAMOVF_D3,JS_A3MOVF_D2,JS_A2MOVF_D1,JS_A1RET;=WORK_D:MOVJS_A4,#00H;W*1000/T=DMOVJS_A3,W_D3MOVJS_A2,W_D2MOVJS_A1,W_D1MOVJS_B4,#0MOVJS_B3,#0MOVJS_B2,#03HMOVJS_B1,#0E8HLCALLCHENFAMOVJS_B4,#00HMOVJS_B3,T_D3MOVJS_B2,T_D2MOVJS_B1,T_D1LCALLCHUFAMOVD_D2,JS_A2MOVD_D1,JS_A1RET;=WORK_X:MOVJS_A4,#00H;计数值*360/T=相位MOVJS_A3,R0MOVJS_A2,TH0MOVJS_A1,TL0MOVJS_B4,#0MOVJS_B3,#0MOVJS_B2,#01HMOVJS_B1,#68HLCALLCHENFAMOVJS_B4,#00HMOVJS_B3,T_D3MOVJS_B2,T_D2MOVJS_B1,T_D1LCALLCHUFAMOVX_D3,JS_A3MOVX_D2,JS_A2MOVX_D1,JS_A1RET;=DIS_FFT:MOVJS_A4,#00H;要转换的数MOVJS_A3,F_D3MOVJS_A2,F_D2MOVJS_A1,F_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVR2,#5;要转换出来的位数MOVR1,#DT_A5;转换后存放的第一个显存地址DIS_FFT1:LCALLCHUFAMOVR1,JS_C1DECR1DJNZR2,DIS_FFT1MOVDT_A6,#14;HMOVDT_A7,#21;zMOVJS_A4,#00H;要转换的数MOVJS_A3,T_D3MOVJS_A2,T_D2MOVJS_A1,T_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVR2,#7;要转换出来的位数MOVR1,#DT_B7;转换后存放的第一个显存地址DIS_FFT2:LCALLCHUFAMOVR1,JS_C1DECR1DJNZR2,DIS_FFT2MOVDT_B8,#26;uMOVDT_B9,#17;SRET;=DIS_TFT:MOVJS_A4,#00H;要转换的数MOVJS_A3,F_D3MOVJS_A2,F_D2MOVJS_A1,F_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10LCALLCHUFALCALLCHUFAMOVDT_A7,#21;zMOVDT_A6,#14;HMOVDT_A5,JS_C1LCALLCHUFAMOVDT_A4,JS_C1MOVDT_A3,#10LCALLCHUFAMOVDT_A2,JS_C1LCALLCHUFAMOVDT_A1,JS_C1MOVJS_A4,#00H;要转换的数MOVJS_A3,T_D3MOVJS_A2,T_D2MOVJS_A1,T_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVR2,#7;要转换出来的位数MOVR1,#DT_B7;转换后存放的第一个显存地址DIS_TFT2:LCALLCHUFAMOVR1,JS_C1DECR1DJNZR2,DIS_TFT2MOVDT_B8,#26;uMOVDT_B9,#17;SRET;=DIS_WD:MOVJS_A4,#00H;要转换的数MOVJS_A3,W_D3MOVJS_A2,W_D2MOVJS_A1,W_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVR2,#6;要转换出来的位数MOVR1,#DT_C6;转换后存放的第一个显存地址DIS_WD1:LCALLCHUFAMOVR1,JS_C1DECR1DJNZR2,DIS_WD1MOVDT_C7,#26;uMOVDT_C8,#17;SMOVJS_A4,#0;要转换的数MOVJS_A3,#0MOVJS_A2,D_D2MOVJS_A1,D_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVDT_D8,#23LCALLCHUFAMOVDT_D7,JS_C1MOVDT_D6,#10LCALLCHUFAMOVDT_D5,JS_C1LCALLCHUFAMOVDT_D4,JS_C1RET;=DIS_VPP:MOVJS_A4,#00H;要转换的数MOVJS_A3,#00HMOVJS_A2,VPP_D2MOVJS_A1,VPP_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVR2,#3;要转换出来的位数MOVR1,#DT_D5;转换后存放的第一个显存地址DIS_VPP1:LCALLCHUFAMOVR1,JS_C1DECR1DJNZR2,DIS_VPP1MOVDT_D6,#0MOVDT_D7,#24;mMOVDT_D8,#19;VRET;=DIS_X:MOVJS_A4,#00H;要转换的数MOVJS_A3,X_D3MOVJS_A2,X_D2MOVJS_A1,X_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#10MOVR2,#3;要转换出来的位数MOVR1,#DT_C7;转换后存放的第一个显存地址DIS_X1:LCALLCHUFAMOVR1,JS_C1DECR1DJNZR2,DIS_X1MOVDT_C8,#22;.RET;=DIS_JX: SETBA34JBA34,DIS_JX1MOVDT_C4,#27;+RETDIS_JX1:MOVDT_C4,#28;-RET;=T_DIV4:MOVJS_A4,#00H;计数的值MOVJS_A3,T_D3MOVJS_A2,T_D2MOVJS_A1,T_D1MOVJS_B4,#0;除以10MOVJS_B3,#0MOVJS_B2,#0MOVJS_B1,#4LCALLCHENFAMOVT_D3,JS_A3MOVT_D2,JS_A2MOVT_D1,JS_A1RET;=W_DIV4:MOVJS_A4,#00H;计数的值MOVJS_A3,W_D3MOVJS_A2,W_D2MOVJS_A1,W_D1