VC++单片机虚拟仪器测试系统 第15页

VC++单片机虚拟仪器测试系统 第15页
p->m_pCS->InvalidateRect(p->rect,TRUE);
  g_End.ResetEvent();
     return 0; }
    return 0;
}
5 万用表模块
5.1 Agilent E1412A 6.5高精度万用表介绍
   安捷伦的E1412A 6位半高精度万用表是一个规格为C,具有一个槽,基于消息基的VXI模块,它与E1312A模块只是规格上的不同。它具有更多的功能和更高的执行效率,而在价格上却与5位半的万用表相当。该万用表提供了广泛的测量功能包括电压、幅值、电阻、和频率的高级测量以及对测试TTL输出和直流电压比测量。标准的测量包括ac/dc电压、ac/dc电流、2-4线电阻和频率与周期的测量。测量直流电压时,该万用表可以提供每秒65次范围变化和每秒30次函数变化。
5.2 Agilent E1412A 6.5高精度万用表界面设计和编程
    通过阅读Agilent E1412A的用户使用手册,了解到Agilent E1412A能进行高精度的测量。然而,为了到达最好的测量效果,必须做一些准备工作来消除一些潜在的测量误差。在使用手册中给出了一些常见的错误,并提供了一些解决的办法。譬如在DC电压测量过程中,就会遇上如下的一些常见的错误:热电动势、阻抗错误、电流泄漏错误、不合格电源的噪声、共模以及磁环路和地环路引起的噪声等等,都提供了一些解决的思路。
而在进行测量之前也需要对万用表进行适当的配置:比如说AC信号的过虑(设置三种不同的AC过滤器,可以提高低频测量的精度或是在进行AC电压以及电流测量时提高读取速率。又如DC输入阻抗(在正常的情况下,所有的DC电压范围的输入阻抗是10兆欧姆来最小化噪声。你可以为100mVdc, 1Vdc and 10Vdc 范围的直流电压设置输入阻抗高于10G欧姆以利于减少测量负载的错误。)还有许多配置,用户手册中都给出了说明。
最简单的测量是通过使用MEASURE命令来进行的,该命令用来配置函数,启动测量和置数据于缓冲区以便计算机利用IO命令的读取。一条MEASURE命令将会启动多个测量(如果触发数或采样数大于1);如果读回数据的速度不够快以至于模块的输出缓冲区满时,测量将会停止直至有空间来存储数据时才重新启动测量。譬如:
*RST   //复位万用表
MEAS:VOLT:DC?//配置dc电压测量,并从万用表返回数据
ENTER statement//将数据传送给计算机
   而指令read?也是可以用来启动测量的,在使用read?指令之前,需要使用所需的测量函数对万用表进行配置。该命令启动测量并将数据直接放入输出缓冲区,接着由用户提供IO函数来取回数据并发送给计算机。一条read?指令可以启动多个测量(如果触发数或采样数大于1时);如果读回数据的速度不够快以至于模块的输出缓冲区满时,测量将会停止直至有空间来存储数据时才重新启动测量。read?指令被分解为两个命令:init和fetc?.指令init置万用表于等待触发状态,外部触发发生来启动测量,测量值被存储于万用表内部存储器中。而指令fetc?将万用表的内存中的数据输出到输出缓冲区中并由计算机取回数据。注意:在使用init和fetc?命令时应当小心,万用表的内部存储器的容量只有有512个字节,超过该范围的最先的数据将会被丢弃。
每个测量以LF(换行符)结束。HP-IB End or Indentify信号将会在最后一个字节被发送。如果多个测量被返回,测量值会以逗号分隔,EOI也会在最后一个字节被发送。
例如:+1.23456E+LF,+1.234567E+12LF,+1.23456E+12LFEOI。
   做外部触发测量时,必须提供TTL外部触发信号到BNC(同轴电缆插接件);测量将会被这个信号低脉冲触发。注意:Configure命令用于指定函数配置万用表,该命令并不启动测量。
对万用表的测量过程有了一定的了解之后,心中也有了一定的思路,如下图:
对于万用表的初始化,我将其设置为多选按钮来进行配置,设计的思想是这样的:采用多选按钮,也就意味着可以不选,采用默认的参数值;而用户如果需要设置的话,则单击选中按钮,会弹出一个对话框提供用户选择如下所示:图5-1
上面就是我的万用表的基本的框图了。而测量结果的显示部分则是通过弹出式信息框的形式来对测量结果进行显示。这里给出了程序的部分代码如下:
//这里对万用表的输入输出以及采样进行设置,而这些参数的值是通过用户界面中的//控件进行传递的
viPrintf(/*multimeter*/theApp.m_Session,"SAMPLE:COUNT%s\n",m_nStr_Sample);
viPrintf(/*multimeter*/theApp.m_Session,"INPUT:IMPEDANCE:AUTO %s\n",m_nStr_Input);
viPrintf(/*multimeter*/theApp.m_Session,"OUTPUT:%s\n",m_nStr_Output);
//触发器设置按钮的点击-这里是一个大的循环,对用户是否对触发器进行了设置操作//通过变量m_btrigger进行判断
 if(m_btrigger==1)
 {viPrintf(/*multimeter*/theApp.m_Session,"TRIG:SOURCE %s\n",SetParam.m_nTrigger_Source);
viPrintf(/*multimeter*/theApp.m_Session,"TRIG:COUNT %s\n",SetParam.m_nTrigger_Count);  
viPrintf(/*multimeter*/theApp.m_Session,"TRIG:DELAY %s\n",SetParam.m_nTrigger_Delay);//这里要对延时做处理判断
//*******************参数是否已经被选择的判断2005/5/22*********************
 int m_nID;
 m_nID=GetCheckedRadioButton(IDC_RADIO_VOLTAGE,IDC_RADIO_PERIOD);
 if(m_nID==0)
 { MessageBox("请先选择测量参数!","提示信息",MB_OK);
  return;}
    switch(m_nID)//通过这个switch语句对用户选择的测量参数的判断
 {case IDC_RADIO_VOLTAGE://电压测量
  viPrintf(/*multimeter*/theApp.m_Session,"CONF:VOLT:%s %s,%s\n",SetParam.m_nParam_Type,SetParam.m_nParam_Range,SetParam.m_nParam_Resolution);
  if("DC"==SetParam.m_nParam_Type)  {viPrintf(/*multimeter*/theApp.m_Session,"VOLT:DC:%s\n",SetParam.m_nParam_Aper);   viPrintf(/*multimeter*/theApp.m_Session,"VOLT:DC:%s\n",SetParam.m_nParam_NPLC);}   break; ………………
//通过如下的SCPI命令启动测量
 viPrintf(/*multimeter*/theApp.m_Session,"INIT;FETC?\n");
//通过函数viScanf()来读取读取数据,并通过一个弹出式信息框对测量结果进行显示
 char buff[100];
 viScanf(/*multimeter*/theApp.m_Session,"%s",buff);
 CString temp;
 temp.Format("Result is %s",buff);
 MessageBox(temp,"测量结果显示",MB_OK);
在万用表的设计和编程过程中,由于有了函数信号发生器以及示波器的经验,所以工作进度就相对来的快一些,关键的的问题还在于程序的调试上。
6 测试系统的测试举例
6.1 利用函数信号发生器调频波和调制波的实现
首先,运行主程序如下:
 如左图所示,通过单击查找资源按钮来搜索仪器
 并通过一个列表控件将有效的资源列于表中,通
 过双击列表框中的资源地址来激活建立会话按钮
 从而允许用户建立会话(会话建立成功与否会提
 示用户相关的信息)。在三个模块的按钮的处理函
 数中,对地址进行有效的判断,从而无需用户来
                                    记忆仪器的地址,即使单击错误也没有什么关                   
 图6-1                系,重新进行建立即可。
因为是调频波,所以需要对载波和调制信号进行设置,这里只给出了设置窗口的一部分:

 << 上一页  [11] [12] [13] [14] [15] [16] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有