数字式相位差测量系统(基于51单片机)_第1页
数字式相位差测量系统(基于51单片机)_第2页
数字式相位差测量系统(基于51单片机)_第3页
数字式相位差测量系统(基于51单片机)_第4页
数字式相位差测量系统(基于51单片机)_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字式相位差测量系统(基于51单片机)数字相差检测仪的制作专业:电气班级:XX班学号:XXXXXXXXXX学生姓名:XXX指导教师:XX法外部硬件电路比较复杂,成本较高。所以,本文提出的最小二乘法因其成本低,使用范围广,可靠性高而被广泛应用。主要方法是,在单周期内对两个信号进行2N点的采样,把离散化后的信号相乘,通过快速傅里叶变化分解出其中的直流信号,最终计算得到两个正弦信号的相位差。关键词:最小二乘法,快速傅里叶变换Thelow-frequencydigitalphasedetectorbasedonleast-squaremethodresearchAbstract:thephasedifferencedetectionmethodincommonisthezeropassagemethodandthroughexternalhardwarecircuitofzeropointofsinesignaldetection,producethepulsesignaloftheexternalinterruptofMCUbyMCUtimertocalculatethefrequencyandphasedifferenceofsignals.Sinesignalinreallife,however,especiallythealternatingcurrentpowergridprovided,therewillbemoreorlessdistortion,ifalternatingcurrent(ac)inazerodistortionisextremelyserious,islikelytoleadtodetectthezeroordetectmorethanzero,andthetestmethodofexternalhardwarecircuitismorecomplex,highcost.So,inthispaper,theleastsquaremethodbecauseofitslowcost,wideuse,highreliabilityandiswidelyused.Themainmethodis,inasinglecycleoftwosignals2nsamplingpoints,AfterthediscretizationofthesignalmultipliedbyfastFourierchangeintothedcsignal,finallythephasedifferenceoftwosinesignalsiscalculated.Keywords:leastsquaresmethod,fastFouriertransform第一章绪论1.1测量相位差的作用和意义信号的相位差测量在电力系统、工业自动化、功率因素测量、谐波分析等许多领域都有着广泛的应用。相位差是工业领域经常需要测量的一个参数,它是信号分析的基本任务,在实际工作中,经常需要测量两个同频信号之间的相位差,来解决实践中的各种问题。相位差测量与传统电压、电流信号、温度量测量不同。首先,相位差依附于电压、电流信号中,如何消除电压、电流、频率变化对相差测量的影响是相差测量中很重要的一个方面;其次,相差是一个比较量,测量两路信号之间的相差不但需要保证两路信号的频率相同,而且需要排除信号幅值不同等其他因素造成的影响,所以如何准确可靠得测量相差是一个值得研究的课题。在实际工作中,通常需要测量两个同频信号的相位差来解决实际问题。例如电网合闸时,需要保证两电网电信号的相位相同,这时需要精确测量两工频信号之间的相位差,如果两信号之间的相差不相同,就会有很大的冲击电流流过电网,会对电网产生很大的破坏,所以必须精确测量出两信号之间的相位差。随着数字电子技术的发展,由数字电路组成的控制系统已经变成现代检测技术的主流,人们对数字测量系统也越来越重视。相差的数字测量采用液晶屏显示,精度高,稳定性好,读数方便,所以,相位差的数字化测量有应用前景很广泛。1.2相位差测量的研究现状随着电子技术和计算机技术的发展,相位测量技术的发展也非常迅速,尤其在电气、电力电子技术方面得到了极大的重视和发展。目前,相位测量技术已比较完善,测量方法及理论也比较成熟,相位测量仪已商品化和系列化,广泛应用于测量RC、LC网络、放大器相频特性以及依靠信号相位传递信息等方面的电子设备。现代相位测量技术的可分为三个阶段第一阶段是在早期采用的如李妙育法、阻抗法、和差法、三电压法等,这些测量方法通常采用对比法和平衡法,虽然方法简单,但测量精度较低;第二阶段是利用数字专用电路、微处理器等来构成测试系统,使测量精度得以大大提高;第三阶段是充分利用计算机及智能化测量技术,从而大大简化程序设计,增强功能,使得响应的产品精度高、功能更全。同时,各种新的算法、测量手段和新的设计方法及器件也随之出现。目前,国内外提出了许多改进的高精确度的相位差测量方法,主要包括有:采用专用的数字处理芯片,利用正余弦表格及快速傅立叶变换方法来计算相位差,可大大提高测量精度。采用新器件及设计方法来提高相差测量精度及展宽频带。、采用新的算法来改进相差测量采用高精度相位测量设备,通过相位输出信号,利用桥路与输入信号相位进行比较,从而测出相位差。基于不同微处理芯片也已开发了许多不同的相位计,常见的有以下几种:基于FPGA/CPLD的相差测量。其优点是可以进行功能仿真,而且FPGA和CPLD的片内资源丰富,设计的流程简单,缺点是开发成本高。基于单片机控制的相位差测量设备。该方法硬件上需要用到过零检测及异或电路,将两路输入信号的相位差转换成方波,再利用单片机测出该方波的占空比,并最终换算出电压。基于DSP技术的相位计。相位检测系统主要由前置放大电路实现将被测信号(无论是电压还是电流)衰减为5V以内交流电压信号;由电压跟随器将前后级电路进行隔离,以保证测量系统不吸收被测信号源的能量,保证信号源的工作状态不被改变。基于PLD和PLL的相位计。该数字式相位差测量仪以可编程逻辑PLD和锁相环PLL倍频电路为核心,实现两列信号相位差的自动测量。在相位/频率测量技术领域,美国一直处于遥遥领先的地位,主要的公司有Agilent(安捷伦)、Tektronix(泰克)、AD-YU公司、DRANETZ实验室。此外,俄罗斯,英国以及德国在此领域也具有较高水平。国外的主要产品有美国安捷伦构思的53131=1\*ROMANIA型通用计数器,该产品提供10秒/位的频率/周期分辨率和225MHz带宽,测量结果范围是1ns-10000s,时间分辨率为500ps,测相范围为-180°-360°,测量频率高达12.4GHz。标准测量包括相位、频率、周期、时间间隔和上升/下降时间等。英国Avpower公司的高精度相位计SD1000:具有自动设置量程的功能,测量频率范围高达700KHz,允许输入频率高达100GHz,相位分辨率高达0.001,相位测量范围为-180°-180°,在相位测量精度方面,低频精度为±0.0020,高频精度为±0.20,微波为±0.10。该产品被公认为是目前等级最高的相位计,输入信号幅值得范围为1mV-350V。通过调研,目前国外商品化的通用相位计的水平低频段达1xHz数量级。国内相位计领域起步较晚,相位测量技术的研究开始于70年代,早期研究相位测量的单位和技术人员很少,国内主要有天津中环电子生产商品化相位计,相位计量机构是中国计量科学研究院和国防科工委,产品主要测量工频信号。目前,国内相位计产品领域发展迅速,如深圳创新仪器仪表SP312B系列等精度通用计数器/相位计,它以高性能的AVR单片机与CPLD为核心,测频分辨率8位/秒,可测周期范围10ns-7000s,测时范围40ns-7000s,相位测量范围0°-360°,测相精度0.05°,测量功能与Agilent53131A型计数器基本相同,但测量指标略低。此外还有天津中环科仪电子仪器公司HG4180型数字相位计,其特点包括:频率范围覆盖范围广、测量精度高、不但能测量相位,而且能测量频率、在全部频率范围内都能直接得到五位有效数字的频率读数、具有IEE488借口选件,主要用于工业测量领域。总体来说,我国相位测量技术与国外相比还有较大的差距,主要体现在产品种类少,配套产品少、产品测试功能单一、仪器精度、数字化和自动化程度较低,相位计量标准不完备。因此对高精度相位测量算法的研究和相位计产品化设计刻不容缓。1.3本课题研究的主要内容当需要测量大功率,高压信号之间的相位差时,通常需要通过放大器或者变压器先将大功率、高压信号转换成小功率、低压信号才能输入到检测设备进行相位差进行测量。但现实中的器件往往与理论上有一些差距。受到器件的非线性、环境因素的影响,变换后的信信号总会出现或大或小的失真,在信号过零点出现震荡。这样,通过过零检测的方法根本无法检测相位差。这就需要有一种新的方法来进行相位差测量。本设计主要是研究如何利用最小二乘法和快速傅立叶变换算法来测量相位差。通过对两路信号在一个周期内进行点的采样,在将采样后的两路信号相乘,通过快速傅立叶变换算法计算出相乘后的信号中的直流分量的大小。因为该直流分量的大小仅与两路信号的幅值及其相位差有关系,所以可以在通过公式计算出相位差。应用这种测量方法,不仅提高了测量精度,节省了硬件成本,而且可以允许变换后的输入信号有一定程度的失真。第一章:最小二乘法以及快速傅里叶变换简介1.1:最小二乘法简介对于两个相位差为的正弦信号和,利用积化和差公式可得不难看出,合成的信号中包含了二次谐波和直流分量,且直流分量的大小仅和两信号的相位差和幅值有关系,也就是说,只要能求出该直流分量以及两个信号幅值的大小,相位差也就可以计算出来了。1.2:傅里叶级数简介对于任意满足狄里赫利收敛条件(即周期函数的极值点数目为有限个,间断点的数目为有限个,且在一个周期内绝对可积)的周期函数,必定可以展开成一个收敛的傅里叶级数,其形、式为:由欧拉公式1.2.6可以得出利用定积分换元可得再对该积分离散化得也就是说,每计算一次谐波大小,需要进行N次复数乘法运算和N-1次复数加法运算,那么,计算N次谐波的大小则需要N2次复数乘法运算和N*(N-1)次复数加法运算,如果采样点数非常密集,运算需要大量的时间,对于一些实时性要求比较的高的场合,显然是不能满足其要求的。1.3快速傅里叶变换原理介绍1965年,J.W.库和T.W.图共同提出了快速傅里叶变换。早期时应用比较广泛的是基二的快速傅里叶变换,后来,因为应用场合的要求,又相继提出了基四和基八的快速傅里叶变换算法,在此,主要介绍基二的快速傅里叶变换。对于一个N(N=2n)点采样的信号,我们将其的离散序列 分成奇偶两组,并且令,则k次谐波的大小可表示为利用旋转因子的对称性和周期性可得:再根据旋转因子的对称性可得: 至此,一个N点的离散傅里叶变换就被分解成了两个点的离散傅里叶变换(DFT),依此类推,两个点的DFT变换可以分解成四个点的DFT变换,最终可以分解成个两点的DFT变换。由公式可知,对于两点的DFT变换我们把这样一个两点的DFT运算称为蝶形变换,一个蝶形变换需要消耗4次复数乘法和2次复数加减。对于一个N点的离散傅里叶变换,蝶形结深度为,而每一级有个蝶形结。所以,一个N点的离散傅里叶变换化简成基2的快速傅里叶变换后就是*个蝶形结的计算,最终也就是2*N*次复数乘法运算和N*次复数加减法运算。以1024点的傅里叶变换为例,DFT算法需要消耗=1048576次复数乘法运算,需要消耗次复数加减法运算。而FFT算法仅消耗20480次复数乘法运算和10240次复数加减法运算,因此,运算速度得到很大的提高。正常顺序二进制十进制位倒序后二进制十进制0000000000111004010201020113110610040011101510151106011311171117在把一个N点的DFT变换化简成个2点的DFT变换的过程中,因为总是不断地把一个表18点FFT算法位倒叙前后的顺序变化表18点FFT算法位倒叙前后的顺序变化采样序列按奇偶项分成两个序列,所以离散采样点顺序已经不是原来的排序了,例如8点的DFT变换后的序列应该是04261537,这个排列看起来似乎很乱,没有什么规律,但是我们把他写成二进制的形式,其规律也就一目了然了,通过雷德算法可以得到位倒叙后的正确排序。第二章:软件设计2.1主程序流程图对AD采样信号进行冒泡排序,计算正弦信号幅值及被抬高的电压值并对信号还原对AD采样信号进行冒泡排序,计算正弦信号幅值及被抬高的电压值并对信号还原对两路信号进行乘法运算AD,定时器,12864初始化AD采样完成了?开始雷德算法对信号序列进行位倒序FFT算法分解出直流分量根据直流分量大小计算出相位差送屏幕显示图1主程序流程图 2.2位倒序算法实现由表1可以看出,按自然顺序排列的二进制数,其下面一个数总是比上面一个数大1,下面一个数是上面一个数最低位加1并向高位进位得到的。而位倒序数的下面一个数是上面一个数最高位加1并向低位进位得到的。若已知某个位倒序数J,要求其下一个位倒序数,应判断J的最高位是否为1,可以与比较。若,则J的最高位为0,只需要将该位变成1即可。若,则J的最高位为1,将该位变为0,并判断次高位(与比较),若位0则置1,若位则继续与比较,以此类推,其C语言函数原型为voidleide(structcompx*value,intnum),形参structcompx*value为结构体指针,用于传入待进行倒序运算的复数序列,形参intnum用于传入待排序的复数的个数。2.3冒泡排序法实现冒泡排序法(Bubblesort)是计算机科学领域比较简单的一种排序方法,它重复走访要排列的序列,一次比较两个序列,如果它们顺序错误,就把它们交换过来,走访数列的工作重复进行,直到没有可以交换的序列为止,也就是说该数列已经排序完成,其C语言函数原型为voidBubble(int*value,uintnum),形参int*value是待排序的整数序列,uintnum是待排序的整数个数。2.4FFT算法的实现计算下一个蝶形计算下一个蝶形结改变旋转因子计算蝶形结级数级蝶形结都计算完了?计算旋转因子相同的蝶形结之间的距离计算同一蝶形结中两个运算数据之间的距离给旋转因子赋初值旋转因子相同的蝶形结运算完了?结束图2FFT算法程序流程图开始开始FFT算法C语言函数原型为voidFFT(structcompx*value,intnum),形参structcompx*value是结构体指针,用来传入待进行FFT运算的复数序列,形参intnum用来传入待运算的复数的个数。2.5AD采样的使用STC12C5A60S2系列带AD转换的单片机的AD转换口在P1口(PSTC12C5A60S2系列单片机的AD是逐次比较型AD。逐次比较型AD由一个比较器和DA转换器构成,通过逐次比较逻辑,从最高位(MSB)开始,顺序得对每一输入电压与内置DA转换器输出作比较,通过多次比较,使转换所得的数字逐次逼近输入模拟量与对应值,逐首先,模拟信号要输入到AD必须要有AD输入通道,所以先要把复用IO口P1设置为AD输入,通过对P1ASF寄存器器操作可以实现,需要将P1口的哪一位设置为AD输入,则将P1ASF的该位置一。例如:要将P1.0作为AD输入,其他的作为普通IO口,则将P1ASF设置为0X01。接下来,模拟信号输入到AD通道以后,要使用AD模块对其进行转换,但是AD模块只有一个,所以同一时刻只能选择一个通道进行转换,因此启动AD转换之前还必须告诉AD当前要对哪一个通道进行转换。此外,在启动转换之前还要告诉AD模块基准电压是多少,转换速率是多少,以及转换精度是多少位,这些都设置完成以后就可以启动AD转换了。知道了使用AD模块需要做的相应的配置,接下来就是具体如何实现这些配置了。首先,通过CH0:CH2可以选择AD转换的通道。例如:当CH0:CH2=000是即选择通道0。AD模块的电源只能用5V的单片机电源,无法选择,通过对ADC_POWER置一可以给AD模块上电,AD转换的基准电压就是5V,当不进行AD转换时,为了省电,要断掉AD模块的电源。通过SPEED0和SPEED1两位可以设置AD的转换速率,分别可以设置成90,180,360,540个时钟周期(AD的时钟基准信号就是单片机的时钟基准信号)。AD的转换精度可配置成10位或者8位,默认为10位,8位转换精度太低,所以我们直接使用默认的10位精度,增加两位精度对转换速率影响并不大。最后,将ADC_START置一就可以启动AD转换了。最后,通过查看ADC_FLAG就可以知道AD转换是否完成了,当ADC-FLAG=1时说明AD转换已经完成,可以读取数据了。ADC转换完成后,十位的ADC转换结果从低到高分别存放在ADC_RESL的低2位和ADC_RES中,通过公式可以得到十位的ADC转换结果,最后,再通过公式:可以计算出当前采样信号的电压值。图3ADC转换模块的构成示意图图3ADC转换模块的构成示意图2.6定时器的使用STC12C5A60S2单片机与89C51单片机的定时器类似,不同的是它的定时器时钟信号可以是是单片机的震荡周期,也可以是其12分频(与普通的89C采用定时器0,使其工作在方式1,时钟信号为震荡周期的12分频。因为待测的正弦信号的频率为50HZ,所以周期为20MS,要再一个周期内完成32次采样,所以采样的时间间隔为625uS,所以定时器计数器的初值为625,初始化完成后,启动定时器,在定时器的中断服务程序中进行AD采样,就可以在每个周期内对信号进行等时间间隔的32点采样。2.712864液晶的使用方法首先,通过RS,RW这两个引脚的电平,12864可以知道当前写入的是数据还是指令。当RS=0,RW=0时,12864认为当前写入的是指令。当RS=1,RW=0时,12864认为当前写入的是数据,数据写入以后,通过IO口操作,在EN引脚产生一个上升沿来告诉12864数据已经发出,让12864采样当前接口的数据。当然,之前的这些操作都是在12864为空闲的情况下才可以操作的,通过读取12864接口的最高位的电平就可以判断当前12864当前是否为空闲。当RS=0,RW=1时,读取12864当前数据接口的值,然后在判断其最高位的值就可以知道12864的状态了。将写数据和写指令这两个功能进行封装,得到数据写和指令写的函数,函数原型为voidlcd_wcmd(ucharcmd)(写命令函数)voidlcd_wdat(uchardat)(写数据函数)按一定的顺序发送几个不同的指令以后可以完成对12864的初始化操作,将该操作封装好,得到函数原型为voidlcd12864_init()最后,要搞清楚汉字区在屏幕上的分布情况,再写入要操作的区域的坐标,最后写入要显示的字符的ASCII值或者汉字的编码值就可以了,例如,要在第一行第二列显示一个汉字,只要先写入指令81H,再写入该汉字的对应的编码值即可。通过一定的算法,可以将在屏幕的固定区域写入字符和写入字符串这两个功能封装,得到两个函数原型如下:voiddisplay_12864(ucharx,uchary,uchar*str)voiddischar_12864(ucharx,uchary,ucharzifu)图412864液晶屏汉字区分布示意图图412864液晶屏汉字区分布示意图2.8软件设计部分总结可移植性一直是评价程序好坏的一个很重要的标准,该项目所用到的三个算法全部由个人完成,在算法复杂度尽可能低的情况下,把算法的可移植性做好。由于算法部分不涉及任何硬件,所以这三个算法可以在任何MCU上运行,只需要修改相应的形参即可。这三种算法也是数字信号处理中常用的算法,将其功能封装好做成可移植函数也为以后项目中调用该算法提供了方便.第三章:硬件电路设计3.1移相电路的设计图5移相模块电路图测相差一般都是针对正弦信号,所以要需要有两路相位差可调的正弦信号,这里采用最简单的RC低通滤波电路。其上限截止频率为,输出信号与输入信号的相位差为,通过调节滑动变阻器的阻值可以调节相位差的大小,这样就可以得到两路相差可调的正弦信号了,电路图如下所示:图5移相模块电路图3.2电压跟随器模块电压跟随器具有输入电阻大,输出电阻小,输出电压等于输入电压的优点,通常用作前后级电路的隔离。电压跟随器可以采用集成运放,也可以采用三极管构成的共集放大电路,考虑到现在的集成运放价格非常低,所以这两种方法的成本是差不多的,显然,采用集成运放构成的电压跟随器具有更高的稳定性,所以在本设计中采用了集成运算放大器构成的电压跟随器作为移相电路和加法电路的隔离电路。3.3加法器模块3.3.1OP07简介OP07是一种低噪声,非斩波稳0的双极性集成运算放大器,由于OP07具有非常低的输入失调电压(对于OP07最大为25uV),所以在很多场合下不需要在增加额外的调0电路,OP07的输入电阻非常大,且开环增益高,其输入偏置电流通常为2nA,所以OP07常用于高增益测量设备或者放大传感器的微弱信号。OP07是双电源供电,电源电压范围为,电源电压越大,集成运放的线性区就越宽,所以可以根据输出信号的大小来确定电源电压的大小,要注意到,电源电压不能小于输出信号。例如,输出信号的范围为0-5V,则电源电压一定要大于5V,否则,当输入信号过大,输出电路的晶体管由放大区进入饱和区,集成运放就由线性区进入到非线性区,输出电压等于电源电压,不在具有放大功能。3.3.2实用电路设计由于STC12C5A60S2单片机的片内AD只能测0-5V的模拟信号,所以如果直接把信号接到单片机的AD输入通道上,信号负半波是测不到的,所以考虑先把该交流信号与一个直流信号相加,使得该正弦信号的电压值在任何时刻都大于0,再用单片机AD进行采样,最终结果在加法器采用同相加法运算电路,通过反馈电阻R10和R11引入深度负反馈,使得运放工作在线性区。当集成运放工作在线性区时,其输入端具有虚短和虚断效应。通过集成运放的虚短和虚断效应可以推导出输出信号与输入信号的关系为其中,,将图中数据带入公式可得图6加法器电路图图6加法器电路图3.4电源电路电源电路由变压器,单相全桥整流电路,滤波电路和稳压模块构成,首先通过变压器将220V交流电编程12V交流电,然后利用单相全桥整流电路将交流信号整成直流信号,再通过滤波电路,利用电容的充放电使得电压信号波动较小,最后通过稳压芯片输出稳定的电压信号。3.4.1变压器简介变压器也可以称之为静态电机,就是通过磁场来耦合前后级电路,通过电磁场来进行能量传递。当在变压器的一次侧加交流电压U1,交变的电流流过线圈后,在铁芯内产生交变的磁场,该磁场与二次侧线圈交链,在二次侧感应出电动势,这样一次侧的能量就通过磁场传递到了二次侧。假设一次侧线圈匝数为N1,二次侧线圈匝数为N2,由法拉第电磁感应定律可知,一次侧电压为,二次侧感应电动势为,所以一二次侧电压比。3.4.2单相全桥整流电路图7单相全波整流电路桥式整流电路的工作原理如图11所示。在u2的正半周,D1、D3导通,D2、D4截止,电流由TR次级上端经D1→RL→D3回到TR次级下端,在负载RL上得到一半波整流电压。

在u2的负半周,D1、D3截止,D2、D4导通,电流由Tr次级的下端经D2→RL→D4回到Tr次级上端,在负载RL上得到另一半波整流电压。

这样就在负载RL上得到一个与全波整流相同的电压波形,其电流的计算与全波整流相同,即

图7单相全波整流电路

流过每个二极管的平均电流为

每个二极管所承受的最高反向电压为结论本文讨论了一种全新的相位差检测的算法,相对于传统的过零检测方法具有很多优势,容许待检测信号具有一定的失真,检测精度更高,但是硬件和软件相对而言也更加复杂,本设计最终实现了0-90º的相位差测量,测量精度精确到小数点后两位。在此基础上,利用STC12C5A60S2单片机实现了本设计方案,本设计方案对硬件设计要求很高,因为AD模块不能采样到低于0的电压,而交流信号必定会存在负半波,为了能对信号整个周期进行采样,必须通过硬件电路对信号进行处理,在通过算法对其还原,如果硬件电路做的不好,处理信号的过程中因为集成运放的温飘和零飘是的信号产生较大的失真,会导致相差检测波动较大32点的FFT运算的精度过低,也会导致相差测量精度不高,在本设计中为了节省成本,采用了价格较低的STC单片机,由于收到内存的限制,最大只能运行32点的FFT运算,所以相差测量精度很低,且波动较大。如果想要提高测量精度,可以换更高端的MCU或者扩展存储器,采用128或者256点的FFT运算,可以大大提高相位差测量的精度。由于时间仓促,本设计还有很多的不足之处,测量精度也不高且波动较大。硬件稳定性和算法精度都有待改进,在今后的设计中可以从这两个方面进行改进。参考文献(Reference)[1]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社.2004[2]童诗白、华成英.模拟电子技术基础(第四版)[M].北京:高等教育出版社.2006[3]邱关源、罗先觉.电路(第五版)[M].北京:高等教育出版社.2006[4]赵金利、肖兴达.单片机原理及应用教程(第二版)[M].北京:机械工业出版社.2007[5]邓新蒲、卢启中、孙仲康.数字式相位差测量方法及精度分析[E].国防科技大学学报.2002[6]胡文军、李震梅、饶明忠.基于虚拟仪器的电网信号相位差测量研究[B].山东理工大学学报.2003[7]王兆华等.基于全相位谱分析的相位测量原理及其应用[J].数据处理与采集.2009年第六期[8]王兆华等.基于FFT的相位差测量及虚拟相位计的实现.[J].电子测试.2008年第九期[9]曹海翔等.利用小波变换抑制数字相位测量中的噪声.[J].电工电能新技术.1999年第二期[10]丁玉美、高西全.数字信号处理[M].西安电子科技大学出版社.2004年附录:一:源程序1AD.H文件#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#defineADC_POWER0x80//ADC电源控制位#defineADC_FLAG0x10//ADC完成标志#defineADC_START0x08//ADC起始控制位#defineADC_SPEEDLL0x00//540个时钟#defineADC_SPEEDL0x20//360个时钟#defineADC_SPEEDH0x40//180个时钟#defineADC_SPEEDHH0x60//90个时钟voidDelay1(uintn){uintx;while(n--){x=5000;while(x--);}}voidInitADC(){P1ASF=0xff;//设置P1口为AD口ADC_RES=0;//清除结果寄存器ADC_CONTR=ADC_POWER|ADC_SPEEDHH;Delay1(2);//ADC上电并延时}longintGetADCResult(ucharch){longintadcresult;ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;_nop_();//等待4个NOP_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FLAG));//等待ADC转换完成ADC_CONTR&=~ADC_FLAG;//CloseADCadcresult=ADC_RES*4+(ADC_RESL&0x03);//返回ADC结果 returnadcresult;}2:12864.C文件#include"lcd12864.h"voiddelay5us(ucharn){ uintx; while(n--){x=0;while(x--);}}/*******************************************************************//**//*延时函数*//**//*******************************************************************/voiddelayms_12864(uintn){uintx;while(n--){x=628;while(x--);}} /*******************************************************************//**//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*//**//*******************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;//NOP(); delay5us(12);result=(bit)(P0&0x80);LCD_EN=0;return(result);}/*******************************************************************//**//*写指令数据到LCD*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*//**//*******************************************************************/voidlcd_wcmd(ucharcmd){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=cmd; delay5us(12);//NOP();LCD_EN=1;//NOP(); delay5us(12);LCD_EN=0;}/*******************************************************************//**//*写显示数据到LCD*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。*//**//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;//NOP(); delay5us(12);LCD_EN=1;//NOP(); delay5us(12);LCD_EN=0;}/*******************************************************************//**//*LCD初始化设定*//**//*******************************************************************/voidlcd12864_init(){//LCD_PSB=1;//并口方式 LCD_RST=0; //液晶复位delayms_12864(3);LCD_RST=1;delayms_12864(3);lcd_wcmd(0x34);//扩充指令操作delayms_12864(5);lcd_wcmd(0x30);//基本指令操作delayms_12864(5);lcd_wcmd(0x0C);//显示开,关光标delayms_12864(5);lcd_wcmd(0x01);//清除LCD的显示内容delayms_12864(5);}/************************************************************图形显示************************************************************/voidphotodisplay(uchar*bmp) {uchari,j;lcd_wcmd(0x34);//写数据时,关闭图形显示for(i=0;i<32;i++){lcd_wcmd(0x80+i);//先写入水平坐标值lcd_wcmd(0x80);//写入垂直坐标值for(j=0;j<16;j++)//再写入两个8位元的数据lcd_wdat(*bmp++);delayms_12864(1);}for(i=0;i<32;i++){lcd_wcmd(0x80+i);lcd_wcmd(0x88);for(j=0;j<16;j++) lcd_wdat(*bmp++); delayms_12864(1);}lcd_wcmd(0x36);//写完数据,开图形显示}/************************************************************闪烁函数************************************************************/voidlcdflag(){lcd_wcmd(0x08);delayms_12864(400);lcd_wcmd(0x0c);delayms_12864(400);lcd_wcmd(0x08);delayms_12864(400);lcd_wcmd(0x0c);delayms_12864(400);lcd_wcmd(0x08);delayms_12864(200);lcd_wcmd(0x0cdelayms_12864(5);lcd_wcmd(0x01);delayms_12864(5);}/************************************************************清屏函数************************************************************/voidclr12864_screen(){lcd_wcmd(0x34);//扩充指令操作delayms_12864(5);lcd_wcmd(0x30);//基本指令操作delayms_12864(5);lcd_wcmd(0x01);//清屏delayms_12864(5);}/*********************************************************//**//*设定显示位置*//**//*********************************************************/voidlcd_pos(ucharX,ucharY){ucharpos;if(X==1){X=0x80;}elseif(X==2){X=0x90;}elseif(X==3){X=0x88;}elseif(X==4){X=0x98;}pos=X+Y;lcd_wcmd(pos);//显示地址}voiddisplay_12864(ucharx,uchary,uchar*str){ lcd_pos(x,y); while(*str!='\0') { lcd_wdat(*str++);} }3:12864.H文件#ifndef__LCD12864_H__#define__LCD12864_H__#include<stc12c5a#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint/*************12864LCD引脚定义*************/#defineLCD_dataP0//数据口sbitLCD_RS=P2^0;//寄存器选择输入sbitLCD_RW=P2^1;//液晶读/写控制sbitLCD_EN=P2^2;//液晶使能控制//sbitLCD_PSB=P3^2;//串/并方式控制sbitLCD_RST=P2^7;//液晶复位端口voiddelay5us(ucharn);voiddelayms_12864(uintn);bitlcd_busy();voidlcd_wcmd(ucharcmd);voidlcd_wdat(uchardat);voidlcd12864_init();voidphotodisplay(uchar*bmp);voidlcdflag();voidclr12864_screen();voidlcd_pos(ucharX,ucharY);voiddisplay_12864(ucharx,uchary,uchar*str);4main.c文件#include"lcd12864.h"#include"AD.h"#include"math.h"#defineon1#defineoff0#defineFFT_N32#definePI3.1415926ucharxdatafigure[10]="0123456789";ucharxdataflag=0;intxdataadvalue[FFT_N];structcompx//定义复数结构体{floatreal,imag;};structcompxxdatas1[FFT_N];//待进行FFT运算的数据structcompxxdatas2[FFT_N];structcompxEE(structcompxa,structcompxb)//复数运算函数{structcompxc; c.real=a.real*b.real-a.imag*b.imag; c.imag=a.real*b.imag+a.imag*b.real; returnc;}voiddisfigure(ucharx,uchary,uintvalue){ucharbai,shi,ge; lcd_pos(x,y);bai=value/100; shi=value%100/10; ge=value%100%10; lcd_wdat(figure[bai]); lcd_wdat('.'); lcd_wdat(figure[shi]); lcd_wdat(figure[ge]);}voiddaoxufun(structcompx*value,intnum)//FFT运算倒序函数{uinti,k,j=0; structcompxt; for(i=0;i<num-1;i++) { if(i<j) {t=value[j]; value[j]=value[i]; value[i]=t;} k=num/2; while(k<=j) {j=j-k; k=k/2; } j=j+k;}}voidFFT(structcompx*value,intnum){uintle=0,lei=0,ip=0;//uintl=0;//计算蝶形算法的级数uintf=0;//计算蝶形算法的级数uintm=0;//控制蝶形结级数uinti=0;//控制不同蝶形结计算uintj=0;//控制相同蝶形结计算intn=0;structcompxt;//蝶形运算中间变量structcompxu;//structcompxw;//f=num;for(l=1;(f=f/2)!=1;l++);//计算蝶形算法的级数 for(m=1;m<=l;m++) { le=2<<(m-1);//旋转因子相同的蝶形结之间的距离 lei=le/2;//同一蝶形结中两个运算数据之间的距离 u.real=1.0;// u.imag=0.0;//旋转因子的初值 w.real=cos(PI/lei);// w.imag=-sin(PI/lei);//后一个旋转因子与前面一个旋转因子的? for(i=0;i<=lei-1;i++) { for(j=i;j<num-1;j=j+le)//控制相同蝶形结的计算,即旋转因子相同 {ip=j+lei; t=EE(value[ip],u);//蝶形运算公式 value[ip].real=value[j].rea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论