综合测试实验报告题目:转子轴心轨迹测量控制台运动控制指导老师:弢班级:姓名:XXX姓名:XXX学号:学号:20XX年X月目录第一章轴心轨迹测量1.实验台简介 (5)2.实验原理 (5)3.实验仪器和设备 (5)4.实验基础 (6)4.1Simulink动态仿真 (6)4.2S-function的工作机制 (7)4.3C MEX-file S-function (7)5.数据采集程序设计 (8)5.1创建DDL文件 (8)5.2mdl文件示意图 (11)5.3GUI设计 (11)5.4信号处理 (13)5.4.1 未滤波getdata代码 (13)5.4.2 低通滤波getdata代码 (14)6.实验结果 (15)6.1采集信号前后示波器scope波形分析 (15)6.2采用滤波器前后波形分析 (16)6.3应用Bufferworth低通滤波器处理的实验结果 (17)6.3.1不同采样频率波形比较 (17)6.3.2不同低通区间的波形比较 (19)6.3.3不同截取长度波形比较 (21)6.3.4不同运转速度时波形比较 (22)7.实验结论 (23)8. 低通滤波的进一步尝试与研究 (24)8.1建立界面的m文件 (24)8.2 设计界面的效果图 (28)8.3 低通滤波结果 (29)第二章控制台运动控制1.实验原理 (30)2.实验基本要求 (31)3.实验基础 (31)3.1控制运动模块 (31)3.2 模块功能具体实现 (32)4. 实验结果 (33)4.1 重要参数设计 (33)4.2 程序图解 (34)5. 功能理解 (34)6. 分析 (36)7. 实验过程 (37)7.1 尝试一 (37)7.1.1 功能描述 (37)7.1.2 结论一 (37)7.2 尝试二 (38)7.2.1 功能描述 (39)7.2.2 结论二 (39)心得体会 (40)●XXX (40)●XXX (42)附录 (44)组员分工第一章转子轴心轨迹测量第二章控制台运动控制说明:实验过程中的每一个部分,两个小组成员基本上都是全部参与。
在完成整个实验的过程中,我们一起讨论,共同研究,克服一个个困难,最终顺利完成实验。
第一章轴心轨迹测量一、实验台简介DRZZS-A型多功能转子试验台由:1底座、2主轴、3飞轮、4直流电机、5主轴支座、6含油轴承及油杯、7电机支座、8连轴器及护罩、9RS9008电涡流传感器支架、10磁电转速传感器支架、11测速齿轮(15齿)、12保护挡板支架,几部分组成,如图1所示。
图1 DRZZS-A型多功能转子试验台传感器安装位置示意图主要技术指标为:可调转速范围:0~2500转/分,无级电源:DC12V主轴长度:500mm主轴直径:12mm外形尺寸:640×140×160mm重量:12.5kg二、实验原理轴心轨迹是转子运行时轴心的位置,在忽略轴的圆度误差的情况下,可以将两个电涡流位移传感器探头安装到实验台中部的传感器支架上,相互成90度,并调好两个探头到主轴的距离(约1.6mm),标准是使从前置器输出的信号刚好为0(mV)。
这时,转子实验台启动后两个传感器测量的就是它在两个垂直方向(X,Y)上的瞬时位移,合成为李沙育图就是转子的轴心运动轨迹。
三、实验仪器和设备1. 计算机(已安装MATLAB 软件) 1台2. DRVI 快速可重组虚拟仪器平台 1套3. 电涡流位移传感器 2套4. 转子试验台1套 5. 虚拟仪器数据采集工作台1台四、实验基础4.1 Simulink 动态仿真SIMULINK 是MATLAB 重要软件包,用于对动态系统建模和仿真,它适用于连续系统和离散系统,也适用线性系统和非线性系统。
它采用系统模块直观地描述系统典型环节,可十分方便地建立系统模型。
Simulink 模块包括一系列输入、状态和输出。
输出是采样时间、输入、模块状态的函数。
下面的方程描述了输入、输出和状态的数学关系。
+10=(t,,u) ()=(t,,u) ()=(t,,u) () =+k c d d u c dy f x x f x x f x x x x 输出求导更新其中,Simulink 模型的执行按下述几个步骤。
首先是初始化阶段。
在这个阶段Simulink 将库模块集合到模型,传播宽度、数据类型和采样时间,评估模块参数,确定模块执行顺序,分配内存。
然后是仿真阶段。
此时Simulink 进入一个仿真循环,循环的每次执行对应一个仿真步。
在每个仿真步,Simulink 按初始化阶段确定的顺序执行各个模块。
对每个模块,Simulink 计算模块在当前采样时间的状态、微分和输出,这将持续到仿真介绍。
下图描述了Simulink 的仿真过程。
4.2 S-function的工作机制S-function包括一系列的回调方法,用以执行每个仿真步骤所需的任务。
在一个模型的仿真过程中,每个仿真步骤,Simulink将调用各S-function的适当方法。
S-function的执行方法包括:1)初始化:在首次仿真循环中执行。
2)计算下一采样点:如果定义了一个可变采样步长的模块,这一步将计算下一次采样点,也就是计算下一步长。
3)计算在主要时间步中的输出:这一步结束之后,模块的输出端口在当前时间步是有效的。
4)更新主要时间步中的离散状态:所有的模块在该回调方法中,必须执行一次每次时间步都要执行的活动。
5)积分:这用于具有连续状态的或者具有非采样过零的模型。
4.3 C MEX-file S-function定义了S-function模块的C MEX-file必须在仿真过程中向Simulink提供模型信息。
mdlInitializeSize是Simulink与S-function交互时调用的第一个方法。
随后Simulink将调用其他S-function方法(都以mdl开头)。
仿真结束时,Simulink调用mdlTerminate。
利用C写的S-Function仿真步骤如下:五、数据采集程序设计5.1 创建DLL(work1 文件)#define S_FUNCTION_NAME work1 //S_Function文件名为work1 #define S_FUNCTION_LEVEL 2#include "simstruc.h"#include "abc.h"double buffer[5000];double buffer1[5000];int pnum;char ch[8];static void mdlInitializeSizes(SimStruct *S){ssSetNumSFcnParams(S, 0);if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {return;}ssSetNumContStates(S, 0);ssSetNumDiscStates(S, 0);if (!ssSetNumInputPorts(S, 2)) return; ssSetInputPortWidth(S, 0, 1);ssSetInputPortRequiredContiguous(S, 0, true);ssSetInputPortWidth(S,1,1);ssSetInputPortRequiredContiguous(S,1,tr ue);ssSetInputPortDirectFeedThrough(S, 0, 1);ssSetInputPortDirectFeedThrough(S, 1, 1);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); }static void mdlInitializeSampleTimes(SimStruct *S) {ssSetSampleTime(S, 0, CONTINUOUS_SAMPLE_TIME); ssSetOffsetTime(S, 0, 0.0); }#define MDL_INITIALIZE_CONDITIONS#if defined(MDL_INITIALIZE_CONDITIONS)static void mdlInitializeConditions(SimStruct *S) { }#endif#define MDL_START//定义两个输入信号端口 //设置信号1接口宽度 //输入信号1的接口设置 //设置信号1接口宽度 //输入信号2的接口设置//直接反馈信号1输入接口设置 //直接反馈信号2输入接口设置#if defined(MDL_START)static void mdlStart(SimStruct *S) {const real_T *u1 = (const real_T *)ssGetInputPortRealSignalPtrs(S,0); //生成input1的S-Function 源文件const real_T *u2 = (const real_T *)ssGetInputPortRealSignalPtrs(S,1); //生成input2的S-Function 源文件 if(ADCardInit()!=1) {ssSetErrorStatus(S,"Sorry,can not find DAQCard!"); //报错提醒,未找到DAQCard }DAQ2(0x0C,5000,1024*4,buffer,buffer1); pnum=0;}#endifstatic void mdlOutputs(SimStruct *S, int_T tid) {int Length=1024*4;ReadDaq(3,Length,buffer);ReadDaq(4,Length,buffer1);real_T *x =ssGetOutputPortRealSignal(S,0);real_T *y =ssGetOutputPortRealSignal(S,1);if(pnum>=Length)pnum=0; *x=buffer[pnum];*y=buffer1[pnum]; pnum++; } //读取的buffer 长度 //从采集卡读取通道3的buffer //从采集卡读取通道4的buffer //获取坐标轴X 的输出指针 //获取坐标轴Y 的输出指针 //判断指针是否已满 //输出X 轴方向第pnum 个点的值 //输出Y 轴方向第pnum 个点的值 //指针加1#define MDL_UPDATE#if defined(MDL_UPDATE)static void mdlUpdate(SimStruct *S, int_T tid)//开启采集,0x0C 表示采集通道3、4 //初始化buf 指针位置{}#endif#define MDL_DERIVATIVES#if defined(MDL_DERIVATIVES)static void mdlDerivatives(SimStruct *S) {}#endifstatic void mdlTerminate(SimStruct *S) {ADCardQuit(); }#ifdef MATLAB_MEX_FILE#include "simulink.c"#else#include "cg_sfun.h"#endif5.2 work2.mdl示意图5.3 GUI 设计//退出采集卡clf resetset(gcf,'menubar','none')set(gcf,'color',[0.5 0.6 0.4])set(gcf,'unit','normalized','position',[0.2,0.2,0.5,0.35]); set(gcf,'defaultuicontrolunits','normalized')h_axes1=axes('position',[0.05,0.5,0.4,0.38]);ht1=uicontrol(gcf,'Style','toggle','position',[0.55,0.08,0.08,0.05],'horizontal','left','fon tname','楷体_GB2312','fontsize',14,'string','Grid X', 'callback',['axes(h_axes1),','grid']); //制作“Grid X ”按钮h_axes2=axes('position',[0.05,0.05,0.40,0.38]); ht2=uicontrol(gcf,'Style','toggle','position',[0.7,0.08,0.08,0.05],'horizontal','left','fontname','楷体_GB2312','fontsize',14,'string','Grid Y', 'callback',['axes(h_axes2),','grid']); //制作“Grid Y ”按钮h_axes3=axes('position',[0.50,0.3,0.45,0.58]);ht3=uicontrol(gcf,'Style','toggle','position',[0.85,0.08,0.08,0.05],'horizontal','left','fon tname','楷体_GB2312','fontsize',14,'string','Grid X-Y', 'callback',['axes(h_axes3),','grid']);//制作“Grid X-Y ”按钮hpush1=uicontrol(gcf,'Style','push','position',[0.55,0.20,0.08,0.05],'horizontal','left','f ontname','楷体_GB2312','fontsize',14,'string','采集'); //设置“采集”按钮的位置和大小hpush2=uicontrol(gcf,'Style','push','position',[0.7,0.20,0.08,0.05],'horizontal','left','fo ntname','楷体_GB2312','fontsize',14,'string','滤波'); //设置“滤波”按钮的位置和大小hpush2=uicontrol(gcf,'Style','push','position',[0.85,0.20,0.08,0.05],'horizontal','left','f ontname','楷体_GB2312','fontsize',14,'string','停止');//设置 “停止”按钮的位置和大小ht0=uicontrol(gcf,'Style','text',...'position',[0.34,0.92,0.27,0.043],'horizontal','left','fontname','楷体_GB2312','fontsize',25,'string','轴心轨迹测量实验')//取名figure 为“轴心轨迹测量实验” ht1=uicontrol(gcf,'Style','text',...'position',[0.2,0.89,0.10,0.028],'horizontal','left','fontname','楷体//设置背景颜色 //设置unit 位置//设置用户缺省控件单位属性值_GB2312','fontsize',16,'string','X轴向波形')//命名第1个图形窗口“X轴向波形”ht2=uicontrol(gcf,'Style','text',...'position',[0.2,0.435,0.10,0.028],'horizontal','left','fontname','楷体_GB2312','fontsize',16,'string','Y轴向波形')//命名第2个图形窗口“Y轴向波形”ht3=uicontrol(gcf,'Style','text',...'position',[0.65,0.89,0.15,0.028],'horizontal','left','fontname','楷体_GB2312','fontsize',16,'string','X-Y轴合成波形')//命名第3个图形窗口“X-Y轴合成波形”set(hpush1,'callback',['set_param(''work2'',''SimulationCommand'',''start''),',...'t=timer(''TimerFcn'',''getdata'',''Period'',2,''ExecutionMode'',''fixedSpacing'',''TasksT oExecute'',inf),',...//设置定时器,运行getdata文件,与上面是一行'pause(2);start(t);',... //暂停2秒并启动定时器]);//“停止”按键引起的回调set(hpush2,'callback','stop(t);set_param(''work2'',''SimulationCommand'',''stop'');'); //停止定时器,mdl文件停止运行信号采集及处理界面如下:5.4 信号处理5.4.1 未滤波getdata代码set_param('work2','SimulationCommand','stop'); // mdl文件停止运行x1=evalin('base','xd.signals.values');//读取保存到工作空间的信号xd并绘制出来axes(h_axes1); //设置联系,第1个图形窗口plot(x1(1:600));//在第1个图形窗口中绘制X轴向波形y1=evalin('base','yd.signals.values');//读取保存到工作空间的信号yd并绘制出来axes(h_axes2); //设置联系,第2个图形窗口plot(y1(1:600));//在第2个图形窗口中绘制Y轴向波形set_param('work2','SimulationCommand','start'); //mdl文件运行axes(h_axes3); //设置联系,第3个图形窗口plot(x1(1:600),y1(1:600));//在第3个图形窗口中绘制X-Y轴合成波形5.4.2 低通滤波getdata代码set_param('work2','SimulationCommand','stop'); // mdl文件停止运行x1=evalin('base','xd.signals.values');//读取保存到工作空间的信号xd并绘制出来axes(h_axes1); //设置联系,第1个图形窗口Fs=5000; //采样频率fp=280;fs=450;//设置通带截止频率, 阻带截止频率wp=2*fp/Fs;ws=2*fs/Fs;rp=0.1;rs=60; [N,Wc]=buttord(wp,ws,rp,rs);//估算得到Butterworth低通滤波器的最小阶数N和3dB截止频率Wc[b,a]=butter(N,Wc);//设计Butterworth低通滤波器x1t=filter(b,a,x1);plot(x1t(1:200));y1=evalin('base','yd.signals.values');//读取保存到工作空间的信号yd 并绘制出来 axes(h_axes2); y1t=filter(b,a,y1); plot(y1t(1:200)); axes(h_axes3);plot(x1t(1:200),y1t(1:200));//在第3个图形窗口中绘制X-Y 轴合成波形set_param('work2','SimulationCommand','start');六、实验结果6.1 采集信号前后示波器scope 波形分析 1) 未采集信号时两示波器scope 的信号波形X 轴向波形Y 轴向波形2) 采集转子试验台信号后两示波器scope的信号波形X 轴向波形Y 轴向波形//调用Bufferworth 低通滤波器 //在第1个图形窗口中绘制X 轴向波形//设置联系,第2个图形窗口 //调用Bufferworth 低通滤波器//在第2个图形窗口中绘制Y 轴向波形 //设置联系,第3个图形窗口//mdl 文件运行结果分析:未采集信号时,示波器scope中显示的是随机变化的信号,信号的均值在零附近,不能反映试验台转子的轴心轨迹具体位置;采集信号后,两示波器scope显示的波形体现出一定的规律性,信号的均值偏离零,体现出轴心的实际位置。