机械振动测量及球杆定位控制系统实验.docx
- 文档编号:13405720
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:52
- 大小:1.59MB
机械振动测量及球杆定位控制系统实验.docx
《机械振动测量及球杆定位控制系统实验.docx》由会员分享,可在线阅读,更多相关《机械振动测量及球杆定位控制系统实验.docx(52页珍藏版)》请在冰点文库上搜索。
机械振动测量及球杆定位控制系统实验
机械振动测量实验
一、实验目的
1、熟悉并掌握MATLAB的基本操作以及调试器的使用方法
2、理解图形句柄的含义,熟悉MATLAB界面设计的常用函数和设计方法
3、熟悉Simulink的使用,理解一些常用模块的功能和含义,并熟悉通过Simulink进行动态系统建模和仿真的流程,特别是子系统的创建与封装
4、进行数据采集程序的设计,能够将通过采集卡采集到的数据显示到界面中
5、掌握用MATLAB对机械振动信号进行信号频谱分析的方法,初步了解简单滤波器的设计。
二、实验原理和设计思路
该自主实验的硬件平台是转子实验台,设置合适的通道数,即可通过采集卡对转子的机械振动信号进行采集。
Simulink是MATLAB的重要软件包,是一种用来实现计算机仿真的软件工具,用于对动态系统建模和仿真,它采用系统模块直观地描述系统典型环节,方便建立系统模型。
它是MATLAB的一个附加组件,可用于实现各种动态系统(包括连续系统、离散系统和混合系统)的建模、分析和仿真。
由Simulink建立动态仿真模型,即可获得采集到的振动信号。
为了使采集到的振动信号以及信号处理结果能够更好地呈现出来,需要搭建图形交互界面。
MATLAB提供了丰富的绘图功能,在MATLAB中,图形对象的名字叫做句柄,它是图形对象的标识代码(唯一的身份),标识代码含有图形对象的各种必要的属性信息。
其中,根屏幕的句柄为0,图形窗口的句柄为正整数,其它对象的句柄为对应的双精度浮点数。
可以通过这个“句柄”,得到或者修改图形对象的属性。
同时,MATLAB还提供了很多图形对象属性函数,能够很方便地对一些图形或控件进行属性设置。
具体设计思路如下:
我们设计的这个“机械振动测量”软件平台主要包括四个模块,即Simulink动态仿真模块、数据采集模块、图形界面绘制模块、信号处理模块。
1、Simulink动态仿真模块
该模块为shilei1.mdl文件。
通过S-Function,用户可以将自己的模块加入Simulink模型中,从而可以实现用户自定义的算法或者与硬件设备交互等。
在该模块中,能够设置采样频率等相关参数,从而获得不同采样频率下的机械振动信号。
2、数据采集模块
该模块为shilei.cpp文件,功能是实现采集卡的数据信号采集。
因为我们所使用的转子实验平台中,振动加速度信号是从通道1中采集,所以在对应采集函数中要将通道设置为通道1。
然后通过采集卡初始化函数ADCardInit()、采集函数DAQ1()、读取采样数据函数ReadDaq()等,实现机械振动信号的采集。
3、图形界面绘制模块
该模块主要是在jixiezhendong.m文件中实现,能够将采集到的机械振动信号绘制到图形界面中,同时能够提供人机交互的一些控件,方便用户进行机械振动测量的相关操作,并获取频谱分析图、振动频率和振动加速度等相关信息。
4、信号处理模块
该模块主要包括getdata.m,callradio1.m,callradio2.m三个M文件。
由于采集到的机械振动信号中混杂有噪声信号,要想得到准确的振动信号和振动参数,需要通过滤波来滤掉高频的噪声信号,只留下低频的机械振动信号,所以首先需要进行滤波器的设计。
其次,关于机械振动测量有两个重要参数,即振动频率和振动加速度。
其中,振动频率为幅值最大的波对应的频率,振动加速度为最大幅值电压通过一个转换得到的加速度。
所以,在频谱分析的基础上,通过数据处理即可得到振动频率和振动加速度这两个参数。
三、设计过程
1、复习MATLAB的一些基本指令和操作。
比如数值数组及其运算、控制流、M文件等,同时还有MATLAB调试器的相关操作使用,以及MATLAB的图形绘制操作。
2、“机械振动测量”界面的设计。
参照《DRVI快速可重组虚拟仪器实验平台》中的《转子实验台——加速度传感器振动测量实验》的测量界面,如上图所示,了解机械振动测量所需要得到的数据和结果。
然后结合老师课堂讲解和实验指导书中关于界面设计的内容,进行“机械振动测量”界面的设计。
3、数据采集程序设计。
参考实验指导书中数据采集的步骤介绍,进行数据采集程序的设计,同时还有Simulink仿真模块的搭建。
从而,实现通过采集卡对转子振动信号的采集,同时能够使振动信号在设计的界面中显示出来。
4、机械振动信号的数据处理。
获得机械振动信号后,就要对信号进行处理,主要包括频谱分析、低通滤波、参数计算等部分。
通过低通滤波滤掉高频的噪声信号,通过参数计算获得振动频率和振动加速度两个机械振动参数。
四、Simulink模型
下图为本系统的Simulink模型(shilei1.mdl)
其中,Constant模块表示的是采样频率,通过修改该常数的值,即可设置不同的采样频率。
ToWorkspace模块的功能是把输出的数据写入工作空间,以便于getdata.m文件对输出信号进行读取,并绘制到界面中。
Scope模块的功能是将输出的信号实时显示出来。
五、代码及注释
1、C++代码及注释
shilei.cpp文件的主要功能包括Simulink模型的输入输出通道的设置,以及采集卡的初始化、开启、更新以及退出等功能,可以生成动态链接库,是能够实现对通道信号进行采集的重要文件。
以下是shilei.cpp文件的代码及注释
/*
*sfuntmpl_basic.c:
Basic'C'templateforalevel2S-function.
*
*-------------------------------------------------------------------------
*|Seematlabroot/simulink/src/sfuntmpl_doc.cforamoredetailedtemplate|
*-------------------------------------------------------------------------
*
*Copyright1990-2002TheMathWorks,Inc.
*$Revision:
1.27$
*/
/*
*YoumustspecifytheS_FUNCTION_NAMEasthenameofyourS-function
*(i.e.replacesfuntmpl_basicwiththenameofyourS-function).
*/
#defineS_FUNCTION_NAMEshilei//将S_FUNCTION名字改成和文件名一样,即shilei
#defineS_FUNCTION_LEVEL2
/*
*Needtoincludesimstruc.hforthedefinitionoftheSimStructand
*itsassociatedmacrodefinitions.
*/
#include"simstruc.h"//添加头文件
#include"abc.h"
/*定义全局变量*/
doublebuffer[5000];//定义一个通道的数据缓存buffer
doublebuffer1[5000];//定义另一个通道的数据缓存buffer
intpnum;//定义读取指针数
charch[8];//定义表示8个通道的二进制字符数组
/*Errorhandling
*--------------
*
*Youshouldusethefollowingtechniquetoreporterrorsencounteredwithin
*anS-function:
*
*ssSetErrorStatus(S,"Errorencountereddueto...");
*return;
*
*Notethatthe2ndargumenttossSetErrorStatusmustbepersistentmemory.
*Itcannotbealocalvariable.Forexamplethefollowingwillcause
*unpredictableerrors:
*
*mdlOutputs()
*{
*charmsg[256];{ILLEGAL:
tofixuse"staticcharmsg[256];"}
*sprintf(msg,"Errordueto%s",string);
*ssSetErrorStatus(S,msg);
*return;
*}
*
*Seematlabroot/simulink/src/sfuntmpl_doc.cformoredetails.
*/
/*====================*
*S-functionmethods*
*====================*/
/*Function:
mdlInitializeSizes===============================================
*Abstract:
*ThesizesinformationisusedbySimulinktodeterminetheS-function
*block'scharacteristics(numberofinputs,outputs,states,etc.).
*/
/*mdlInitializeSizes函数用于获取输入端口和输出端口的数量、端口宽度,以及
*S-function所需的任何其它对象(诸如状态数量)等有关信息。
*/
staticvoidmdlInitializeSizes(SimStruct*S)
{
/*Seesfuntmpl_doc.cformoredetailsonthemacrosbelow*/
ssSetNumSFcnParams(S,0);/*Numberofexpectedparameters*/
if(ssGetNumSFcnParams(S)!
=ssGetSFcnParamsCount(S)){
/*Returnifnumberofexpected!
=numberofactualparameters*/
return;
}
ssSetNumContStates(S,0);
ssSetNumDiscStates(S,0);
//设置3个输入通道
/*voidssSetNumInputPorts(SimStruct*S,int_TnInputPorts),该函数的第一
*参数为模块的一个数据结构,第二个参数nInputPorts指定模块有几个输入接口。
*/
if(!
ssSetNumInputPorts(S,3))return;
/*voidssSetInputPortWidth(SimStruct*S,int_Tport,int_Twidth),该函数
*的第一个参数为模块的一个数据结构,第二个参数为接口编号,第三个参数指定第
*二个参数所指定接口的数据宽度。
*/
ssSetInputPortWidth(S,0,1);
ssSetInputPortRequiredContiguous(S,0,true);/*directinputsignalaccess*/
ssSetInputPortWidth(S,1,1);
ssSetInputPortRequiredContiguous(S,1,true);/*directinputsignalaccess*/
ssSetInputPortWidth(S,2,1);
ssSetInputPortRequiredContiguous(S,2,true);/*directinputsignalaccess*/
/*
*Setdirectfeedthroughflag(1=yes,0=no).
*Aporthasdirectfeedthroughiftheinputisusedineither
*themdlOutputsormdlGetTimeOfNextVarHitfunctions.
*Seematlabroot/simulink/src/sfuntmpl_directfeed.txt.
*/
/*voidssSetInputPortDirectFeedThrough(SimStruct*S,int_Tport,int_T
*dirFeed),该函数的第一个参数为模块的一个数据结构,第二个参数为接口编号,
*第三个参数为用于指定接口的输入数据是否能在mdlOutputs或者
*mdlGetTimeOfNextVarHit中调用,0表示不能调用,1表示能调用。
*/
ssSetInputPortDirectFeedThrough(S,0,1);
ssSetInputPortDirectFeedThrough(S,1,1);
ssSetInputPortDirectFeedThrough(S,2,1);
//设置2个输出通道
if(!
ssSetNumOutputPorts(S,2))return;
ssSetOutputPortWidth(S,0,1);
ssSetOutputPortWidth(S,1,1);
ssSetNumSampleTimes(S,1);
ssSetNumRWork(S,0);
ssSetNumIWork(S,0);
ssSetNumPWork(S,0);
ssSetNumModes(S,0);
ssSetNumNonsampledZCs(S,0);
ssSetOptions(S,0);
}
/*Function:
mdlInitializeSampleTimes=========================================
*Abstract:
*Thisfunctionisusedtospecifythesampletime(s)foryour
*S-function.Youmustregisterthesamenumberofsampletimesas
*specifiedinssSetNumSampleTimes.
*/
//设置S-function的采样时间
staticvoidmdlInitializeSampleTimes(SimStruct*S)
{
ssSetSampleTime(S,0,CONTINUOUS_SAMPLE_TIME);
ssSetOffsetTime(S,0,0.0);
}
#defineMDL_INITIALIZE_CONDITIONS/*Changeto#undeftoremovefunction*/
#ifdefined(MDL_INITIALIZE_CONDITIONS)
/*Function:
mdlInitializeConditions========================================
*Abstract:
*Inthisfunction,youshouldinitializethecontinuousanddiscrete
*statesforyourS-functionblock.Theinitialstatesareplaced
*inthestatevector,ssGetContStates(S)orssGetRealDiscStates(S).
*Youcanalsoperformanyotherinitializationactivitiesthatyour
*S-functionmayrequire.Note,thisroutinewillbecalledatthe
*startofsimulationandifitispresentinanenabledsubsystem
*configuredtoresetstates,itwillbecallwhentheenabledsubsystem
*restartsexecutiontoresetthestates.
*/
staticvoidmdlInitializeConditions(SimStruct*S)
{
}
#endif/*MDL_INITIALIZE_CONDITIONS*/
#defineMDL_START/*Changeto#undeftoremovefunction*/
#ifdefined(MDL_START)
/*Function:
mdlStart=======================================================
*Abstract:
*Thisfunctioniscalledonceatstartofmodelexecution.Ifyou
*havestatesthatshouldbeinitializedonce,thisistheplace
*todoit.
*/
/*采集卡初始化及开启数据采集*/
staticvoidmdlStart(SimStruct*S)
{
constreal_T*u=(constreal_T*)ssGetInputPortSignal(S,0);
doublefs=u[0];//将Simulink仿真模型中的第一个常数值赋给采样频率fs
//采集卡初始化
//ADCardInit()是采集卡DLL函数,作用是初始化采集卡。
如果初始化成功则返
//回1,用于判断是否连上采集卡。
if(ADCardInit()!
=1)
{
ssSetErrorStatus(S,"Can'tfindtheDAQCard!
");
}
//DAQ1(ch,Fs,len,buffer)是采集卡DLL单通道采集函数,作用是启动采集卡
//进行单通道数据采集。
参数1为采样通道,是以8为二进制数表示各个通道是否
//开启。
参数2为采样频率,参数3为采样点个数,参数4为数据缓存数组。
DAQ1(0x1,fs,1024*4,buffer);//开启采集:
对通道1采集数据
pnum=0;//初始化指针位置
}
#endif/*MDL_START*/
/*Function:
mdlOutputs=======================================================
*Abstract:
*Inthisfunction,youcomputetheoutputsofyourS-function
*block.Generallyoutputsareplacedintheoutputvector,ssGetY(S).
*/
/*读取buffer数据和输出数据*/
staticvoidmdlOutputs(SimStruct*S,int_Ttid)
{
intlength=1024*4;//读取的buffer的长度
//ReadDaq()的作用是读取下位机buf里的采样数据。
其中,参数1为通道号,参数
//2为buffer长度,参数3为保存的buffer指针。
ReadDaq(1,length,buffer);//从采集卡读取buffer
//constreal_T*u=(constreal_T*)ssGetInputPortSignal(S,0);
real_T*y=ssGetOutputPortRealSignal(S,0);//获取输出指针
//y[0]=u[0];
if(pnum>=length)pnum=0;//判断指针是否已满
*y=buffer[pnum];//输出第pnum个点的值
pnum++;//指针加1
}
#defineMDL_UPDATE/*Changeto#undeftoremovefunction*/
#ifdefined(MDL_UPDATE)
/*Function:
mdlUpdate======================================================
*Abstract:
*Thisfunctioniscalledonceforeverymajorintegrationtimestep.
*Discretestatesaretypicallyupdatedhere,butthisfunctionisuseful
*forperforminganytasksthatshouldonlytakeplaceonceper
*integrationstep.
*/
staticvoidmdlUpdate(SimStruct*S,int_Ttid)
{
}
#endif/*MDL_UPDATE*/
#defineMDL_DERIVATIVES/*Changeto#undeftoremovefunction*/
#ifdefined(MDL_DERIVATIVES)
/*Function:
mdlDerivatives=================================================
*Abstract:
*Inthisfunction,youcomputetheS-functionblock'sderivatives.
*Thederivativesareplacedinthederivativevector,ssGetdX(S).
*/
staticvoidmdlDerivatives(SimStruct*S)
{
}
#endif/*MDL_DERIVATIVES*/
/*Function:
md
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机械振动 测量 球杆 定位 控制系统 实验