实验三信号的采集及其频率和周期的测量一、实验目的1.学习在CVI环境里使用非NI数据采集卡2.学习用过零法计算被测每周期采样点数3.学习数据采集卡采样间隔的标定4.学习计算被测信号的频率和周期二、实验原理1.CVI环境里非NI数据采集卡的驱动1.1NI数据采集卡驱动库的添加在CVI工程文件编辑器中单击Edit菜单,选择Add FilesTo Project就能弹出可以在工程文件编辑器中添加的文件类型(如图3-1所示)。
选择Library就可进入添加库文件采单(图3-2)。
选中PCI-Dask.lib文件,单击Add控件就可将库文件添加到工程文件编辑器中。
注意图3-2中第一项是被添加文件的路径。
图3-1 添加库文件路径图3-2 添加库文件菜单1.2 非NI 数据采集卡头文件的添加在CVI 源文件编辑环境中,在所有的“#include ”行的最后,添加 “#include "Dask.h"”。
如图3-3所示。
图3-3 非NI 数据采集卡头文件添加的位置2.零计数法测频原理不含直流分量的正弦波每个周期内都应有两个过零点。
根据每两个过零点之间的采样次数我们可以得到每周期的采样点数N 。
由于采样时间间隔t ∆是由数据采集卡决定的,是一个确定值。
所以可以得到正弦波的周期为N*t ∆;从而可以计算出频率f 。
对被测信号x (t )进行数据采集,得到被测信号序列为x (n ), n =1,2,…,k 。
我们把该信号序列中上次采样为负值、本次采样为正值的点记为正过零点,两个正过零点的时间间隔t 为:t k t ∆=(3-1) 式中 t ∆——采样时间间隔; k ——两次过零点时间内采样的次数;t ——两个正过零点之间的时间间隔,也即被测波形周期。
故被测波形频率f 为tk t f ∆==11 (3-2)3. 具有实测功能的虚拟示波器基本原理实测是指该虚拟示波器可以测量实际信号。
这时需要数据采集卡,将所测电量信号采集到计算机中,由软件完成波形的显示。
如图3-4所示的框图说明了具有实测功能的虚拟示波器的原理框图。
图3-4 具有实测功能的虚拟示波器的原理框图在上述的框图中由计算机对采集卡发出指令,启动采集卡,计算机将采集的信号数据进行存储,处理和显示,从而实现虚拟示波器。
4.PCI_9111数采卡的使用方法4.1 PCI_9111数采卡性能指标本节中所使用的数据采集卡的型号为PCI_9111,其性能指标为:32位PCI数据总数;16路单端模拟输入通道;A/D采样速率100KHz;模拟输入电压范围为±10V、±5V、±2.5V、±1.25V、±0.625V;3种A/D触发方式:软件触发、外部脉冲出发和可编程定时触发。
使用PCI_9111数据采集卡时,将PCI_9111数据采集卡插入计算机的PCI插槽中,经过37芯排线与一转接板相连,如图5-2所示。
被测信号与转接板上相应接线插座相连,转接板上的接线插座对应数采卡的输入通道号。
图3-5 PCI_9111数据采集卡的连接方法本例中的被测信号是由信号发生器产生的标准正弦波信号。
4.PCI_9111数据采集卡的使用在使用PCI_9111数采卡时,程序开始时要用Register_Card来初始化数采卡,程序结束时用 Release_Card 释放数采卡。
在主函数里添加以下A/D卡注册程序CardID=Register_Card(PCI_9111DG,0);AI_9111_Config (CardID,TRIG_INT_PACER,0,9216);在需要进行数据采集时添加以下程序:AI_AsyncDblBufferMode(CardID, 0);AI_ContReadChannel (CardID, channel, adRange,volt3, ReadCount, SampleRate, SyncMode);其中的具体参数说明清参考附录3-1。
三、程序设计要求与实验内容1.程序如下:#include <ansi_c.h>#include <cvirte.h> /* Needed if linking in external compiler; harmless otherwise */#include <userint.h>#include "e:\实验室\现测实验\PCI—9111采集卡的使用说明\频谱(实验三)\频谱.h"#include <analysis.h>#include "Dask.h" //c:\ADLINK\PCI-DASK\include\Dask.h//c:\ADLINK\PCI-DASK\lib\PCI-Dask.lib#define MAX 2048 //采样点数MAX必须是2n,且大于等于512static int panelHandle;static double *Wave; //定义正弦波的数组指针static double *Mag,*Phase; //定义极值和极值的相角数组指针short int volt[MAX]={0}; //定义采集后的正弦波的数组int CardID; //定义采集卡的设备号double amp=0.0; //定义幅值int sumpo,channel; //定义每周期点数和通道号double fre; //定义频率int main (int argc, char *argv[]){if (InitCVIRTE (0, argv, 0) == 0) /* Needed if linking in external compiler; harmless otherwise */return -1; /* out of memory */if ((panelHandle = LoadPanel (0, "频谱.uir", PANEL)) < 0)return -1;CardID = Register_Card(PCI_9111DG, 0); //采集卡的初始化AI_9111_Config (CardID, TRIG_INT_PACER,0, 1024); //采集卡的配置DisplayPanel (panelHandle);RunUserInterface ();return 0;}int CVICALLBACK GenerateWave (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){ int adRange = AD_B_10_V; //设置采集卡电压范围double SampleRate=0; //设置采样速率int i,signpo[10]={0},k=1;switch (event){case EVENT_COMMIT:GetCtrlVal (panelHandle, PANEL_CHANNEL, &channel); //获得采集卡的通道号GetCtrlVal (panelHandle, PANEL_RATE, &channel); //获得采集卡的采样速率AI_AsyncDblBufferMode(CardID, 0); //设置A/D卡的数据缓存AI_ContReadChannel(CardID,channel,adRange,volt,MAX,SampleRate,1); //单通道采集DeleteGraphPlot(panelHandle,PANEL_GRAPH,-1,VAL_IMMEDIATE_DRAW);PlotY (panelHandle, PANEL_GRAPH, volt, MAX, VAL_SHORT_INTEGER,VAL_THIN_LINE,VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED);/*计算频率*/for(i=1;i<MAX;i++){if((volt[i-1]*volt[i]<=0) && volt[i-1]<0){signpo[k]=i;k++;if(k>8)break;}}sumpo= signpo[k-1]- signpo[1];fre= SampleRate / sumpo*(k-2);SetCtrlVal (panelHandle, PANEL_FRE, fre); //显示频率SetCtrlVal (panelHandle, PANEL_SUMPO, sumpo/(k-2)); //显示每周期点数break;}return 0;}int CVICALLBACK Close (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:free(Mag);free(Phase);QuitUserInterface (0);break;}return 0;}int CVICALLBACK CalFFT (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){double *Img; //为虚部定义数组指针int i; //定义循环变量switch (event){case EVENT_COMMIT:Wave=malloc(MAX*sizeof(double)); //为量化后的正弦波动态开辟数组空间for(i=0;i<MAX;i++) //将采集后的波形全量程转换为电压值Wave[i]=volt[i]*20.00/0xffff;DeleteGraphPlot (panelHandle, PANEL_GRAPH, -1,VAL_IMMEDIATE_DRAW);PlotY (panelHandle, PANEL_GRAPH, Wave, MAX, VAL_DOUBLE, VAL_FAT_LINE, VAL_EMPTY_SQUARE,VAL_SOLID, 1, VAL_RED);Img=malloc(MAX*sizeof(double)); //为虚部数组动态开辟空间for(i=0;i<MAX;i++) //为虚部数组清零Img[i]=0; //为极值和极值的相角数组动态开辟空间Mag=malloc(MAX*sizeof(double));Phase=malloc(MAX*sizeof(double));FFT (Wave, Img, sumpo); //进行频谱变换ToPolar1D (Wave, Img, sumpo, Mag, Phase); //进行极坐标转换for(i=0;i<sumpo;i++) //对极值进行量化处理Mag[i]=Mag[i]/(sumpo/2);DeleteGraphPlot (panelHandle, PANEL_GRAPH_2, -1, VAL_IMMEDIATE_DRAW);PlotY (panelHandle, PANEL_GRAPH_2, Mag, sumpo, VAL_DOUBLE, VAL_FAT_LINE, VAL_EMPTY_SQUARE,VAL_SOLID, 1, VAL_YELLOW);free(Wave); //释放数组free(Img);break;}return 0;}2. 运行检验四报告要求1.简述在CVI使用非NI数据采集卡的步骤;答:(1)在CVI工程文件编辑器中单击Edit菜单,选择Add Files To Project就能弹出可以在工程文件编辑器中添加的文件类型,选中PCI-Dask.lib文件,单击Add控件就可将库文件添加到工程文件编辑器中。