冯晓伟,李正生
(第二炮兵工程学院101教研室,陕西西安710025)
传统的频率测量方法有两种[1-2]:直接测频法和测周期法。直接测频法[3]是在给定的闸门信号中填入被测脉冲,通过必要的计数电路,得到填充脉冲的个数,从而获得待测信号的频率。测周期法[4]是在一个信号周期内记录下基准定时脉冲的个数,然后换算成频率f。而测信号幅度则采用峰值保持电路加ADC完成。笔者在进行课题设计时,遇到了这样一个问题:对某装备输出的频率19±1 kHz、幅度4.3~5.5 V的非标准方波信号,需要测试它的幅度值和频率。对于非标准方波信号幅度和频率的测量,传统方法是采用峰值保持电路和ADC测量幅度值,用脉冲整形电路和计数器测量频率,这样虽然可以完成测试任务,但是测量电路复杂且分离,测量方法不能统一。采用幅度和频率值一体化测量的方法,可以精简测试电路,简化测试方法。
单片微型计算机的广泛应用,促进了测量仪表和测量系统的自动化、智能化[5]。使用ADC(Analog-to-Digital Converter,模数转换器)进行数据采集是单片机的一个典型应用。
假如某次对被测周期信号采样结果如图1所示(图中“*”为采样点)。
图1 采样示意图Fig.1 Sketch map of sampling
这里先定义一个特征点的概念,特征点是这样的一个点,它的数值大于或等于设定阈值,而它前一个点的数值小于阈值,如图1中的e点和p点。
程序从第一个测得的点开始,逐点寻找特征点,当找到一个特征点后从该点开始计数(如图1中点e),继续向后逐点查询,直到下一个临近的特征点(如图1中点p),则视两点的时间间隔为一个脉冲周期,该周期值与采样周期和计数值的关系为:
其中,T为被测周期,n为计数值,t为采样周期,其误差为±t,为减小误差可多采样几个脉冲周期,然后取平均值。而这些采样值中的最大值就是被测信号幅度值。
根据Nyquist抽样定理[6],只要抽样频率大于两倍信号最高频率,则整个连续信号就可以完整地用它的抽样值来代替,而不会丢失掉任何信号。工程中通常以信号最高频率的8倍以上采样,这对于普通的信号采集来说已经足够了,然而本系统为了获得较高的测频精度,采用ADC以最高频率的500倍,即10 MHz的采样频率对被测信号进行采样。
由PC104通过CPLD译码控制ADC以一定的频率采样,由FIFO存储采样结果,采样结束后进行数据处理并显示处理结果,系统总体设计方案如图2所示。
图2 系统总体设计方框图Fig.2 Block diagram of sytem overall design
系统电原理图如图3所示,U1为ADC1175,它是一种最大采样速率达20 MHz的8位高速ADC,其模拟电压输入范围为0~2.5 V,而被测信号的幅值为4.3~5.5 V,故需要先对信号幅度进行调理,系统采用一级减法电路将信号幅度减去3.3 V,得到幅值为1.0~2.2 V的方波信号,方波信号的底端经减法器后变为负电压值,而负电压值经ADC转换得到的数值为0,故不影响测频及测幅结果,U3为CY7C4261,它是一种容量为16 kB、读写速度达100 MHz的高速FIFO(先进先出存储器),用于存储ADC的采样结果。3.3 V参考电压由ADR366提供,2.5 V参考电压由ADR361提供,10 MHz高精度采样时钟信号由有源晶振提供。U2是高密度、高性能的CPLD[7],其型号为EPM7128STC100-10,主要用于对PC104的地址译码,完成对ADC芯片的控制及数据存储工作,1JP2为PC104的ISA总线,完成测试板与PC104的通信工作。
图3 系统原理图Fig.3 System schematic diagrams
上位机软件基于C++Builder 6.0[8]编写,主要完成系统初始化设置、总线通信控制、数据采样控制、数据的读取与计算、结果显示等工作,ADC以10 MHz的频率对被测信号进行多个周期的采样并同步存储在FIFO中,当FIFO存满后自动停止存储,并由软件从FIFO中读取数据。由于采样频率较高,故在采样开始后FIFO会很快存满,因此不用等待FIFO的中断信号,而是稍作延迟即可开始读取数据。采样结束后的频率计算流程图如图4所示。
上位机系统对ISA总线的端口读写控制最简单的就是使用inport(…)和outport(…)函数,或者通过内嵌汇编语言的方式来实现,这两种端口读写操作方法在Windows 95/98下面工作很正常,但是在Windows NT/2000/XP上就会出现非法指令调用问题,这些非法指令来自于底层对IO端口的直接地址访问。在Windows 95/98时代,这些操作是没有受到保护的,而在Windows NT/2000/XP就会出现保护问题,为了解决这个问题需要使用第三方提供的WinIO程序库[9]。WinIO程序库允许在32位的Windows应用程序中直接对I/O端口和物理内存进行存取操作。通过使用一种内核模式的设备驱动器和其他几种底层编程技巧,它绕过了Windows系统的保护机制。
在需要开始采样前,程序首先调用WinIO函数库提供的InitializeWinIo()函数初始化WinIO函数库,当需要采样时,程序利用SetPortVal(…)函数通过CPLD译码向ADC、FIFO芯片发出控制命令,系统进行高速采样存储,采样完毕再利用GetPortVal(…)函数读取FIFO中的采样结果并进行相应处理,处理全部结束后调用ShutdownWinIo()清除WinIO库。
图4 软件流程图Fig.4 Flow chart of software
由于C++Builder的定时器组件定时最小单位仅为1 ms,远小于系统对ADC 10 MHz的采样频率频率要求,故不能依靠上位机直接对ADC进行采样控制,而需要采用FIFO作为高速采样存储器。
本系统中使用CPLD作为地址译码译码器,可进行高速采样存储控制,当需要采样时,上位机给出正确的地址码,当CPLD检测到地址码后,便以控制ADC以10 MHz的频率控制采样,并将采样结果存储在FIFO存储器中,采样完毕后再由上位机将FIFO中存储的数据读出并进行后续处理。
为了验证所述方法的正确性与可行性,制作了硬件电路,并对F05型函数发生器输出的方波信号进行实际测试,测试结果如表1所示。
表1 ADC频幅同测法测试结果Tab.1 The test result of Frequency and Amplitude Measurement by ADC
本文论述了在windows XP系统环境下基于PC104总线对非标准方波信号频幅同测的方法。该方法测试简便、接口简单、可扩展性强,由表1所示测试结果可见,该方法还具有测试精度高等优点。工程应用中需要同时测量方波信号[10]的幅度和频率的场合较多,此方法具有较宽的应用前景。
[1] 周霞,赵雪飞,张红芳,等.基于ARM的等精度测频技术在机组转速测控中的应用[J].水电自动化与大坝监测,2010,34(1):18-20.ZHOU Xia,ZHAO Xue-fei,ZHANG Hong-fang.Application of ARMbased equal precision frequency measurement method to rotational speed measuring and control system[J].Hydropower Automation and Dam Monitoring,2010,34(1):18-20.
[2] 刘国华,何华锋,田鹏飞,等.基于PC104总线和CPLD的测频模件设计[J].现代电子技术,2010,33(2):86-89.LIU Guo-hua,HE Hua-feng,TIAN Peng-fei,et al.Design of frequency measuring module based on PC104 and CPLD[J].Modern Electronic Technique,33(2):86-89.
[3] 魏钟记,刘峰,汪铭东.数字测频方法及实现[J].电子测量技术,2006,29(4):28-29.WEI Zhong-ji,LIU Feng,WANG Ming-dong.Digital measure method of frequency and it’s reality[J].Electronic Measurement Technology,2006,29(4):28-29.
[4] 王宏利,程旭德,徐兵,等.基于AT89C51的智能测频仪设计[J].计算机测量与控制,2007,15(3):410-412.WANG Hong-li,CHENG Xu-de,XU Bing,et al.Design of intelligent cymometer based on single chip microcomputer AT89C51[J].Computer measurement and Control,2007,15(3):410-412.
[5] 求是科技.单片机典型模块设计实例导航[M].2版.北京:人民邮电出版社,2008.
[6] 程佩青.数字信号处理教程[M].3版.北京:清华大学出版社,2007.
[7] 宋万杰,罗丰,吴顺君.CPLD技术及其应用[M].西安:西安电子科技大学出版社,2004.
[8] 程展鹏.Borland C++Builder应用开发技术解析[M].北京:清华大学出版社,2003.
[9] 李桂岩,魏宾,贾瑞凤.在C++Builder中实现I/O端口的读写操作[J].硅谷,2009(17):70-71.LI Gui-yan,WEI Bin,JIA Rui-feng.Realization of I/O port read and writes in C++builder[J].Silicon Valley,2009(17):70-71.
[10] 王坤.基于SVPWM的STATCOM设计及实现[J].陕西电力,2011,39(1):11-15.WANG Kun.SVPWMbased design and realization of STATCOM[J].Shaanxi Electric Power,2011,39(1):11-15.