基于Lab windows的虚拟示波器Word格式.docx
《基于Lab windows的虚拟示波器Word格式.docx》由会员分享,可在线阅读,更多相关《基于Lab windows的虚拟示波器Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
![基于Lab windows的虚拟示波器Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/30/33008217-bc91-4976-ab6f-eb189bc28a5e/33008217-bc91-4976-ab6f-eb189bc28a5e1.gif)
再放置接收信号频率增益和幅度增益控件,设置为图5和图6。
图5接收信号频率增益
图6接收信号幅度增益
2.用代码生成器生成程序框架。
选择Code>
>
Generate>
AllCode,在如图2
面中选择QuitCallk项后确定。
图7生成程序框架
3.插入库函数。
将鼠标放在需要插入库函数的地方,点击library菜单来插入。
在Library>
AdvancedAnalysis有各种函数,选中任意函数会弹出设置面板,需要设置具体的参数。
设置完成后选择Code>
InsertFunctionCall即完成函数插入。
4.完成了程序框架的填写后对每个函数具体按照示波器的各个按钮的功能来写代码。
此时要特别注意回调函数的用法,可以在函数上点击右键,选择BrowseIdentifier,如图3,来查看函数的定义与用法举例,还可以在右边的库中查找到其他有类似用法的函数,如图4,方便你的调用。
图8查看函数定义图9库函数
另外,还可以直接右键,选择FindUIObject来直接查看该函数对应的用户面板上的控件。
5.再完成了程序的编写后就需要进行程序的调试了。
点击菜单RunDebug**.exe或点击快捷栏内绿色三角图标就可以运行程序。
未开启示波器时显示如图5.电源开关未按下时电源指示灯为绿色,开启电源开关后电源指示灯为红色。
图10示波器面板
此时,点击电源开关,在选择好输入信号形式,输入信号幅度和频率以及输入信号通道,接受信号通道,曲线滚动模式及频率增益和幅度增益后,就可以显示需要的波形了。
六、关键代码及注释
#include<
analysis.h>
//头文件
ansi_c.h>
cvirte.h>
/*做扩展编译时需要*/
userint.h>
#include"
综合示波器.h"
#definePI3.1416//宏命令定义
#defineTRUE1
#defineFALSE0
#defineMAX_POINTS51200
structCHANNELDATA{
intwaveform;
doublefrequency;
doublescope;
intpointnum;
doubledata[MAX_POINTS];
//定义通道数据结构体
}Channel1,Channel2;
staticinthandle;
//定义参数
intchannel=0,channel_signal=0;
doublechannel_scope_gain=1.0,channel_frequency_gain=1;
intchartmode=1;
//继续
intpower=0;
//关闭
//静态整形波形
staticdoubledata[MAX_POINTS*2];
voidGenerateData(void);
intmain(intargc,char*argv[])//主函数
{
if(InitCVIRTE(0,argv,0)==0)/*做扩展编译时需要*/
return-1;
/*读出内存*/
if((handle=LoadPanel(0,"
综合示波器.uir"
PANEL))<
0)
DisplayPanel(handle);
Channel1.frequency=1;
//通道1初始频率
Channel1.scope=1.0;
//通道1初始幅度
Channel1.pointnum=512;
//通道1初始采样点数
Channel1.waveform=1;
//正弦函数
Channel2.frequency=1;
Channel2.scope=1.0;
Channel2.pointnum=512;
Channel2.waveform=1;
RunUserInterface();
return0;
}
//函数参数设置函数
intCVICALLBACKDataFunc(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
doublesignal_scope,signal_frequency;
intwaveform;
switch(control)
{
casePANEL_SCOPEGAIN:
if(event==EVENT_VAL_CHANGED)
GetCtrlVal(handle,PANEL_SCOPEGAIN,&
channel_scope_gain);
break;
casePANEL_FREQGAIN:
GetCtrlVal(handle,PANEL_FREQGAIN,&
channel_frequency_gain);
casePANEL_SCOPE:
if(event==EVENT_COMMIT)
{
GetCtrlVal(handle,PANEL_SCOPE,&
signal_scope);
if(channel_signal==0)
Channel1.scope=signal_scope;
else
Channel2.scope=signal_scope;
}
break;
casePANEL_FREQUENCY:
GetCtrlVal(handle,PANEL_FREQUENCY,&
signal_frequency);
Channel1.frequency=signal_frequency;
Channel2.frequency=signal_frequency;
casePANEL_WAVEFORM:
if(event==EVENT_COMMIT)
GetCtrlVal(handle,PANEL_WAVEFORM,&
waveform);
if(channel_signal==0)
Channel1.waveform=waveform;
Channel2.waveform=waveform;
}
}
return(0);
//曲线滚动模式选择
intCVICALLBACKChartMode(intpanel,intcontrol,intevent,
intMode;
switch(event)
caseEVENT_COMMIT:
GetCtrlVal(handle,PANEL_CHART_MODE,&
chartmode);
switch(chartmode)
{
case0:
Mode=VAL_SWEEP;
break;
case1:
Mode=VAL_CONTINUOUS;
case2:
Mode=VAL_BLOCK;
}
SetCtrlAttribute(handle,PANEL_CHART,ATTR_SCROLL_MODE,Mode);
break;
//退出示波器
intCVICALLBACKQuit(intpanel,intcontrol,intevent,
QuitUserInterface(0);
//通道选择
intCVICALLBACKSelectChannel(intpanel,intcontrol,intevent,
GetCtrlVal(handle,PANEL_CHANNEL,&
channel);
//定时函数
intCVICALLBACKTimer(intpanel,intcontrol,intevent,
inti;
caseEVENT_TIMER_TICK:
GenerateData();
if(channel==0)
PlotStripChart(handle,PANEL_CHART,Channel1.data,Channel1.pointnum,0,0,VAL_DOUBLE);
if(channel==1)
PlotStripChart(handle,PANEL_CHART,Channel2.data,Channel2.pointnum,0,0,VAL_DOUBLE);
if(channel==2)
PlotStripChart(handle,PANEL_CHART,data,Channel1.pointnum*2,0,0,VAL_DOUBLE);
//电源开关
intCVICALLBACKPower(intpanel,intcontrol,intevent,
GetCtrlVal(handle,PANEL_POWER,&
power);
SetCtrlVal(handle,PANEL_LED,power);
SetCtrlAttribute(handle,PANEL_TIMER,ATTR_ENABLED,power);
if(power==0)
ClearStripChart(handle,PANEL_CHART);
//输入信号通道选择
intCVICALLBACKChannelSignal(intpanel,intcontrol,intevent,
GetCtrlVal(handle,PANEL_CHANNELSIGNAL,&
channel_signal);
if(channel_signal==0)
SetCtrlVal(handle,PANEL_FREQUENCY,Channel1.frequency);
SetCtrlVal(handle,PANEL_SCOPE,Channel1.scope);
SetCtrlVal(handle,PANEL_WAVEFORM,Channel1.waveform);
else
SetCtrlVal(handle,PANEL_FREQUENCY,Channel2.frequency);
SetCtrlVal(handle,PANEL_SCOPE,Channel2.scope);
SetCtrlVal(handle,PANEL_WAVEFORM,Channel2.waveform);
//显示波形通道选择
intCVICALLBACKChannel(intpanel,intcontrol,intevent,
SetCtrlAttribute(handle,PANEL_CHART,ATTR_NUM_TRACES,1);
SetTraceAttribute(handle,PANEL_CHART,1,ATTR_TRACE_COLOR,VAL_GREEN);
}
SetTraceAttribute(handle,PANEL_CHART,1,ATTR_TRACE_COLOR,VAL_RED);
}
SetCtrlAttribute(handle,PANEL_CHART,ATTR_NUM_TRACES,2);
SetTraceAttribute(handle,PANEL_CHART,1,ATTR_TRACE_COLOR,VAL_GREEN);
SetTraceAttribute(handle,PANEL_CHART,2,ATTR_TRACE_COLOR,VAL_RED);
}
//记数点函数
voidCalculatePointNum()
if(channel==0)
Channel1.pointnum=1024/Channel1.frequency/channel_frequency_gain;
elseif(channel==1)
Channel2.pointnum=1024/Channel2.frequency/channel_frequency_gain;
else
{//设置同样的点
Channel2.pointnum=1024/Channel1.frequency/channel_frequency_gain;
//参数设置函数
voidGenerateData()
CalculatePointNum();
switch(Channel1.waveform)
{
case0:
for(i=0;
i<
Channel1.pointnum/2;
i++)
Channel1.data[i]=Channel1.scope/channel_scope_gain;
for(i=Channel1.pointnum/2;
Channel1.pointnum;
Channel1.data[i]=-Channel1.scope/channel_scope_gain;
case1:
Channel1.data[i]=sin(i*2.0*PI/Channel1.pointnum)*Channel1.scope/channel_scope_gain;
case2:
for(i=0;
Channel1.data[i]=((rand()/23767.0)-0.5)*Channel1.scope/channel_scope_gain;
switch(Channel2.waveform)
Channel2.pointnum/2;
Channel2.data[i]=Channel2.scope/channel_scope_gain;
for(i=Channel2.pointnum/2;
Channel2.pointnum;
Channel2.data[i]=-Channel2.scope/channel_scope_gain;
Channel2.data[i]=sin(i*2.0*PI/Channel2.pointnum)*Channel2.scope/channel_scope_gain;
Channel2.data[i]=((rand()/23767.0)-0.5)*Channel2.scope/channel_scope_gain;
if(channel==2)
for(i=0;
i<
i++)
data[i*2]=Channel1.data[i];
data[1+i*2]=Channel2.data[i];
}
//输入信号频率调整
intCVICALLBACKFREQUENCY(intpanel,intcontrol,intevent,
GetCtrlVal(handle,PANEL_FREQUENCY,FREQUENCY);
七、实验结果
图11面板界面图12正弦波
图13方波图14噪声
八、心得
虚拟仪器(VirtualInstrument--VI)是虚拟现实在仪器仪表领域中的一个重要应用,目前已在国际上悄然兴起。
虚拟仪器是以多媒体计算机作为基础,使用图形界面编程技术,模拟实际仪器的面板、功能和操作,从而生成完成各种任务的专用仪器。
虚拟仪器的出现是是测量仪器领域的一个突破,从根本上更新了测量仪器的概念。
虚拟仪器技术不仅可以简化仪器系统结构,而且能有效的降低生产成本和缩短开发时间。
示波器是时域测量最常用的仪器。
在做课程实验之前,我对LabWindows知之甚少,只学习过C语言。
通过几次的实验,逐渐对其有了一些了解,通过边学习边练习,我很快掌握了部分要领,也使我对LabWindows有了更深刻的了解。
看到结课作业时,我感觉很头疼,设计内容比实验时多了很多,对照着设计样例,一步一步的进行设计修改,我们不单单要显示出被测波形,还要通过界面,对波形的幅值及周期进行调整,使波形整体感觉更加完善。
我深刻的体会到,边学习边实践是一种很好的学习方法,它不仅使我对知识点的理解更深,也是我真真体味到学习新知识的乐趣。
九、参考文献
[1]薛源,基于LabWindows/CVI平台的虚拟仪器的设计与开发.东北大学,2005,12-27.
[2]刘君华,虚拟程序编程语言LabWindows_CVI编程.北京大学出版社,2009,1-1.