综合实验示波器.docx

上传人:b****6 文档编号:5149971 上传时间:2022-12-13 格式:DOCX 页数:23 大小:619.84KB
下载 相关 举报
综合实验示波器.docx_第1页
第1页 / 共23页
综合实验示波器.docx_第2页
第2页 / 共23页
综合实验示波器.docx_第3页
第3页 / 共23页
综合实验示波器.docx_第4页
第4页 / 共23页
综合实验示波器.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

综合实验示波器.docx

《综合实验示波器.docx》由会员分享,可在线阅读,更多相关《综合实验示波器.docx(23页珍藏版)》请在冰豆网上搜索。

综合实验示波器.docx

综合实验示波器

综合实验:

示波器

一、实验目的

学会在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;i

Channel1.data[i]=Channel1.scope/channel_scope_gain;

for(i=Channel1.pointnum/2;i

Channel1.data[i]=-Channel1.scope/channel_scope_gain;

break;

case1:

for(i=0;i

Channel1.data[i]=sin(i*2.0*PI/Channel1.pointnum)*Channel1.scope/channel_scope_gain;

break;

case2:

for(i=0;i

Channel1.data[i]=((rand()/23767.0)-0.5)*Channel1.scope/channel_scope_gain;

break;

}

switch(Channel2.waveform)

{

case0:

for(i=0;i

Channel2.data[i]=Channel2.scope/channel_scope_gain;

for(i=Channel2.pointnum/2;i

Channel2.data[i]=-Channel2.scope/channel_scope_gain;

break;

case1:

for(i=0;i

Channel2.data[i]=sin(i*2.0*PI/Channel2.pointnum)*Channel2.scope/channel_scope_gain;

break;

case2:

for(i=0;i

Channel2.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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1