综合实验示波器.docx
《综合实验示波器.docx》由会员分享,可在线阅读,更多相关《综合实验示波器.docx(23页珍藏版)》请在冰豆网上搜索。
![综合实验示波器.docx](https://file1.bdocx.com/fileroot1/2022-12/13/893e5dc2-25a1-4d1c-86e6-29c67fe5c1ef/893e5dc2-25a1-4d1c-86e6-29c67fe5c1ef1.gif)
综合实验示波器
综合实验:
示波器
一、实验目的
学会在Labwindows下设计控制界面,掌握波形产生原理和示波器的工作原理。
二、实验内容
设计一个如下图所示界面的示波器程序。
三、实验仪器
计算机一台,装有LabWindows
四、实验原理
1、由电脑模拟生成正弦、方波、噪声的波形,输出端有通道1和通道2,可改变波形的频率和幅度。
2、在示波器的输入端选择不同的通道,改变频率增益、幅度增益,便可改变波形的形状,同时还可以选择波形滚动模式。
五、实验步骤
步骤1:
在用户界面的空面板上放置所需的控件
在用户界面编辑器窗口中UntitledPanel的灰色区域中单击鼠标右键,弹出如图7所示的控件选择的快捷菜单。
图1控件菜单
在本实验中我们共选择1个命令按钮(CommandButton),1个显示控件(Graph),1个显示器(LED),1个电源开关(BrinarySwitch),3个Ring,3个NumericSlide,2个RingKnob,2个文本框(text),1个时钟控件(Timer),4个Decoration。
步骤2:
修改用户界面中各控件元素的属性。
根据设计要求,设计如上图所示的用户界面,其部分控件属性设置如下表所示。
控件类型
ConstantName
属性设置
面板Panel
PANEL
Command
Button
QUIT
Callbackfunction
Quit
Label
退出
LED
LED
Label
电源指示
Brinary
Switch
POWER
Callbackfunction
Power
Label
电源开关
其余控件属性修改如下:
(1)频率增益控件
①将ConstantName项改为FREQGAIN
②将CallbackFunction项改为DataFunc
③将Label项改为频率增益
(ms/1单位)
④将Defaultindex项改为3(1ms)
修改结果如图2所示。
图2
选择Label/ValuePairs,对其属性进行修改,结果如图3
图3
(2)幅度增益控件
①将ConstantName项改为SCOPEGAIN
②将CallbackFunction项改为DataFunc
③将Label项改为幅度增益
(V/1单位)
④将Defaultindex项改为3(1V)
修改结果如图4所示
图4
选择Label/ValuePairs,对其属性进行修改,结果如图3
图5
(3)波形选择控件
①将ConstantName项改为WAVEFORM
②将CallbackFunction项改为DataFunc
③将Label项改为波形选择
④将Defaultindex项改为1(正弦)
⑤选择Label/ValuePairs,对其属性进行修改,结果如图6
图6
(4)同理,可对其余类似控件作如上设置,结果如图所示
图7通道
图8通道的Label/ValuePairs属性
图9通道选择
图10通道选择的Label/ValuePairs属性
图11曲线滚动模式
图12曲线的滚动模式的Label/ValuePairs属性
(5)幅度选择控件
①将ConstantName项改为SCOPE
②将CallbackFunction项改为DataFunc
③将Label项改为幅度选择(V)
④将Defaultvalua项改为1.00
⑤选择RangValuas,作图13修改,选择Show/HideParts,作图14修改。
图13图14
(6)频率选择控件
①将ConstantName项改为FREQUENCY
②将CallbackFunction项改为DataFunc
③将Label项改为频率选择(Khz)
④将Defaultvalua项改为1.00
⑤其余修改同(5)
(7)时钟控件设置如图14所示
图15
(8)两文本控件设置如图所示
图16
图17
(9)描述型控件
点右键,选择Classic-StyleControls>>Decoration,选择所需控件。
设置方式如图所示:
图18
步骤3:
用代码生成器生成程序框架
从用户图形界面窗口中选择:
Code>>Generate>>AllCode…然后会显示出如下界面:
图19
请用你的鼠标点击SelectQuituserInterfaceCallback中的Quit项,确保其前面出现一个小钩,同时将PanelVaribleName改为handle。
点击OK按扭,便会弹出源代码(Code)窗,此时,便可以进行编程,在如下图光标处即可添加程序。
图20
步骤4、运行程序完成项目文件
选择Run>>Debug示波器_dbg.exe运行。
选择:
Edit>>AddFilestoProject…>>AllFiles(*.*),按住键,点击示波器.h,示波器.c,示波器.uir。
然后点击Add按扭把这些文件方到SelectedFiles框中。
点击OK按扭,把以上文件添加到工程文件中去。
六、关键代码及注释
#include
#include
#include
#include
#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;//continue
intpower=0;//off
staticdoubledata[MAX_POINTS*2];
voidGenerateData(void);
intmain(intargc,char*argv[])
{
if(InitCVIRTE(0,argv,0)==0)
return-1;/*outofmemory*/
if((handle=LoadPanel(0,"示波器.uir",PANEL))<0)
return-1;
DisplayPanel(handle);
Channel1.frequency=1.0;//设置初始状态
Channel1.scope=1.0;
Channel1.pointnum=512;
Channel1.waveform=1;//sin
Channel2.frequency=1.0;
Channel2.scope=1.0;
Channel2.pointnum=512;
Channel2.waveform=1;//sin
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:
if(event==EVENT_VAL_CHANGED)
GetCtrlVal(handle,PANEL_FREQGAIN,&channel_frequency_gain);
break;
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:
if(event==EVENT_COMMIT)
{
GetCtrlVal(handle,PANEL_FREQUENCY,&signal_frequency);
if(channel_signal==0)
Channel1.frequency=signal_frequency;
else
Channel2.frequency=signal_frequency;
}
break;
casePANEL_WAVEFORM:
if(event==EVENT_COMMIT)
{
GetCtrlVal(handle,PANEL_WAVEFORM,&waveform);
if(channel_signal==0)
Channel1.waveform=waveform;
else
Channel2.waveform=waveform;
}
break;
}
return(0);
}
intCVICALLBACKChartMode(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
intMode;
switch(event)
{
caseEVENT_COMMIT:
GetCtrlVal(handle,PANEL_CHART_MODE,&chartmode);
switch(chartmode)
{
case0:
Mode=VAL_SWEEP;
break;
case1:
Mode=VAL_CONTINUOUS;
break;
case2:
Mode=VAL_BLOCK;
break;
}
SetCtrlAttribute(handle,PANEL_CHART,ATTR_SCROLL_MODE,Mode);
break;
}
return0;
}
intCVICALLBACKQuit(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
QuitUserInterface(0);
break;
}
return0;
}
intCVICALLBACKSelectChannel(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
GetCtrlVal(handle,PANEL_CHANNEL,&channel);
break;
}
return0;
}
intCVICALLBACKTimer(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
inti;
switch(event)
{
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);
break;
}
return0;
}
intCVICALLBACKPower(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
GetCtrlVal(handle,PANEL_POWER,&power);
SetCtrlVal(handle,PANEL_LED,power);
SetCtrlAttribute(handle,PANEL_TIMER,ATTR_ENABLED,power);
if(power==0)
ClearStripChart(handle,PANEL_CHART);
break;
}
return0;
}
intCVICALLBACKChannelSignal(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
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);
}
break;
}
return0;
}
intCVICALLBACKChannel(intpanel,intcontrol,intevent,
void*callbackData,inteventData1,inteventData2)
{
switch(event)
{
caseEVENT_COMMIT:
GetCtrlVal(handle,PANEL_CHANNEL,&channel);
if(channel==0)
{
SetCtrlAttribute(handle,PANEL_CHART,ATTR_NUM_TRACES,1);
SetTraceAttribute(handle,PANEL_CHART,1,ATTR_TRACE_COLOR,VAL_GREEN);
}
if(channel==1)
{
SetCtrlAttribute(handle,PANEL_CHART,ATTR_NUM_TRACES,1);
SetTraceAttribute(handle,PANEL_CHART,1,ATTR_TRACE_COLOR,VAL_RED);
}
if(channel==2)
{
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);
}
break;
}
return0;
}
voidCalculatePointNum()
{
if(channel==0)
Channel1.pointnum=1024/Channel1.frequency/channel_frequency_gain;
elseif(channel==1)
Channel2.pointnum=1024/Channel2.frequency/channel_frequency_gain;
else
{//SETSAMEPOINT
Channel1.pointnum=1024/Channel1.frequency/channel_frequency_gain;
Channel2.pointnum=1024/Channel1.frequency/channel_frequency_gain;
}
}
voidGenerateData()
{
inti;
CalculatePointNum();
switch(Channel1.waveform)
{
case0:
for(i=0;iChannel1.data[i]=Channel1.scope/channel_scope_gain;
for(i=Channel1.pointnum/2;iChannel1.data[i]=-Channel1.scope/channel_scope_gain;
break;
case1:
for(i=0;iChannel1.data[i]=sin(i*2.0*PI/Channel1.pointnum)*Channel1.scope/channel_scope_gain;
break;
case2:
for(i=0;iChannel1.data[i]=((rand()/23767.0)-0.5)*Channel1.scope/channel_scope_gain;
break;
}
switch(Channel2.waveform)
{
case0:
for(i=0;iChannel2.data[i]=Channel2.scope/channel_scope_gain;
for(i=Channel2.pointnum/2;iChannel2.data[i]=-Channel2.scope/channel_scope_gain;
break;
case1:
for(i=0;iChannel2.data[i]=sin(i*2.0*PI/Channel2.pointnum)*Channel2.scope/channel_scope_gain;
break;
case2:
for(i=0;iChannel2.data[i]=((rand()/23767.0)-0.5)*Channel2.scope/channel_scope_gain;
break;
}
if(channel==2)
for(i=0;i{
data[i*2]=Channel1.data[i];
data[1+i*2]=Channel2.data[i];
}
}
七、实验结果
1、打开电源开关,指示灯亮,示波器处于默认初始状态,如图所示
图21
2、将波形选择改为噪声,其他不变,结果如图所示
图22
3、再将通道改为通道2,通道选择移向通道2,其他不变,结果如图所示
图23
4、将通道1波形改为正弦,再通道选择移向通道1、2,其他不变,结果如图所示
图24
5、将通道改为通道2,波形选择改为正弦,频率增益改为0.5ms,幅度增益改为0.5V,其他不变,结果如图所示
图25
6、将被测信号中的波形选择和幅度选择的值都改为2.00,幅度增益改为2V,其他不不变,结果如图所示
图26