课程名称 机电系统设计仿真实验
课程代码 171703
机电系统设计和仿真
实验报告
20##年6月15日
索 引
一、Simulink自主实验—具有悬挂物的移动高架吊车……………………………………1二、Maple自主实验—滑块摆………………………………………………………………7
三、实验总结…………………………………………………………………………………12
一、Simulink自主实验—具有悬挂物的移动高架吊车
为了调整力F作用下沿x轴移动的质量为M的高架吊车和挂在长缆绳上的块m的自由度,必须建立一个模型,块m与垂直点成角θ振荡
图1 移动高架吊车模型
1、具有两个自由度的移动高架吊车模型
为此,使用如下定义的拉格朗日方程
其中:q x(t)和θ(t)的自由度
D 由于摩擦而消耗的能量
Fq 由自由度q产生的力
Ec和Eq 系统的动能和势能
1.1 系统移动时的动能
组件速度由下式决定:
于是
1.2 系统的势能
1.3 在q(t)=θ(t)自由度下的Lagrange方程
如果D=0,则自由度相等,因此不考虑总摩擦损失
根据自由度θ施加的力为零
简化后给出第一Lagrange方程
1.4 在q(t)=x(t)自由度下的Lagrange方程
根据自由度x给吊车施力:
简化后给出Lagrange第二方程
1.5 操作点附近的线性模型
得到的模型是非线性的,且不同自由度下有不同的方程。如果只考虑在操作点θ0 =0附近只有很小的θ变化,可考虑如下的简化
另外,有
这就给出了如下的线性微分方程
根据x(t)和θ(t)的微分系统给出
2、系统的数学模型
对x(t)和θ(t)的微分系统方程组进行拉氏变换得
将M=10 kg,m=5 kg,l=1 m,g=9.8≈10,F0=1代入上式并进一步变换得
3、利用Simulink对系统进行仿真
3.1 系统开环过程仿真
打开一空白模型编辑窗口,根据该系统的数学模型,创建、设置、连接模块,如图2所示。
图2 仿真模型结构图
由于在模型文件中使用了To file模块,输出结果已经保存到MATLAB工作空间当中,可以使用MATLAB命令来绘制结果,代码如下,结果如图4所示。
●>> load('D:\MATLAB7\out1')
>> plot(out(1,:),out(2,:))
>> grid on
>> title('X(t)-t');
>> xlabel('Time(sec)');
>> ylabel('Distance(m)');
◆>> load('D:\MATLAB7\out2')
>> plot(out(1,:),out(2,:))
>> grid on
>> title('θ(t)-t');
>> xlabel('时间(秒)');
>> ylabel('角度(弧度)');
运行仿真,结果如图3所示。
图3 Simulink窗口Scope显示状态仿真结果图
图4 MATLAB命令窗口绘制状态仿真结果图
比较图3和图4可以看出,结果一模一样。
3.2 吊车停止过程仿真
为让吊车停止,最好在θ(t)经过零的瞬间取消力F(t)。否则,悬挂物将继续振荡。为此,在块振荡的2个周期内在移动高架吊车上施加1N的力,在θ(t)经过零点的时候取消力F(t),避免了残余振荡。
因此,对式进行拉氏反变换得,进一步得T ==1.622,即将模块Step1的step time设置为2T = 3.245。
根据系统的数学模型和以上推导,搭建仿真模型图(如图5所示)。
图5 系统仿真模型图
设定参数,运行仿真,结果如图6所示。
图6 系统仿真结果
二、Maple自主实验—滑块摆
滑块摆由一置于光滑杆上的质量为m的滑块A和一质量为M的小球B和长度为L,质量不计的刚性杆铰接而成,如图1所示。
图1 滑块摆模型
1. 系统的数学模型
为此,使用如下定义的拉格朗日方程:
其中:
q x(t)和θ(t)的自由度
D 由于摩擦而消耗的能量
Fq 由自由度q产生的力
Ec和Ep 系统的动能和势能
不计各处摩擦,系统有两个自由度,以x和为广义坐标,以过A点的水平面为零势能面,系统的动能和势能分别为:
系统的Lagrange方程为:
计算出诸导数
带入Lagrange方程,得到系统的运动微分方程:
设定初始条件为: m=1Kg,M=1Kg,g=9.8,L=2m
φ(0) = 0rad,x(0) = 0m,φ’(0) = -1.3rad/s, x’(0) = 1m/s
2. 利用Maple对系统进行仿真
在交互窗口中输入如下的程序语句,并“运行整个工作表”,即可播放(画)出所需的图像。
> restart;
with (DEtools): #用微分方程求解包
with (plots): #用图形软件包
with (plottools): #用图形工具包
> m:=1:M:=1:g:=9.8:l:=2:
> eq1:=(m+M)*diff(x(t),t$2)+M*l*diff(phi(t),t$2)*cos(phi(t))-M*l*(diff(phi(t),t))^2*sin(
phi(t))=0;
> eq2:=M*(l^2)*diff(phi(t),t$2)+M*l*diff(x(t), `$`(t,2))*cos(phi(t))+M*g*l*sin(phi(t))=0;
> sys:={eq1,eq2};
> Ini:={phi(0)=0,x(0)=0,D(phi)(0)=-1.3,D(x)(0)=1};
var:={phi(t),x(t)}:
> val:=array(1..100):for i to 100 do val[i]:=i/10 end do:
S:=dsolve(`union`(sys,Ini),var,type=numeric,method=rkf45,output=val):
> eval(S):
> for i to 100 do
pos[i]:=S[2,1][i,4];
ang[i]:=S[2,1][i,2];
posY[i]:=-cos(ang[i])*l;
posX[i]:=sin(ang[i])*l;
end do:
> minx:=10000:maxx:=-10000:
for i to 100 do
temmin:=`if`(minx<pos[i],minx,pos[i]):
minx:=temmin:
temmax:=`if`(maxx>pos[i],maxx,pos[i]):
maxx:=temmax:
end do:
> for t to 100 do:
wall:=curve([[maxx,0],[minx,0]]):
pospendx:=posX[t]+pos[t]:
pendulum:=disk([pospendx,posY[t]],0.15,color=tan):
mass:=rectangle([pos[t]-0.18,0.1],[pos[t]+0.18,-0.1],color=violet):
#mass:=disk([pos[t],0],0.15,color=tan):
lineM_P:=curve([[pos[t],0],[pospendx,posY[t]]]):
G1[t]:=display(pendulum,mass,lineM_P,wall):
end do:
> display([seq(G1[t],t=1..100)],insequence=true,scaling=constrained,axes=none,title=`滑块摆的运动动画`);
> oldx:=pos[1]:oldcur:=curve([[pos[1],1],[pos[1],1]]):oldplot:=display(oldcur):
> for i to 100 do
nwcur:=curve([[i-1,oldx],[i,pos[i]]]):
plotcur(i):=display(oldplot,nwcur):
oldplot:=plotcur(i):
oldx:=pos[i]:
end do:
> display([seq(plotcur(t),t=1..100)],insequence=true,title=`Phi-t`);
> oldphi:=ang[1]:oldcur1:=curve([[ang[1],1],[ang[1],1]]):oldplot1:=display(oldcur1):
> for i to 100 do
nwcur1:=curve([[i-1,oldang1],[i,ang[i]]]):
plotcur1(i):=display(oldplot1,nwcur1):
oldplot1:=plotcur1(i):
oldang1:=ang[i]:
end do:
> display([seq(plotcur1(t),t=1..100)],insequence=true,title=`X-t`);
2.1 滑块A的位移x随时间t的变化曲线
2.2 角度φ随时间t的变化曲线
2.3 滑块摆的运动动画
第二篇:北航机电系统仿真实验
机电系统仿真实验实验报告
姓名:苏森
学号:SY1217227
手机:135xxxxxxxx
北京航空航天大学仪器科学与光电工程学院
20xx年6月
Maple滑块摆实验 SY1217227苏森
实验一:Maple滑块摆实验
一、 实验目的
通过对滑块摆进行Maple仿真,掌握Maple软件的使用方法,掌握系统建模方法,更进一步理解仿真对实际系统设计的指导意义。
二、实验要求
滑块摆由一置于光滑杆上的质量为m的滑块A、一质量为M的小球B和长度为L,质量不计的刚性杆铰接而成,不计各处摩擦,以过A点的水平面为零势能面,通过Lagrange方程建立系统的运动方程,利用Maple软件画出:
1. 滑块A的位移x随时间t的变化曲线
2. 角度φ随时间t的变化曲线
3. 滑块摆的运动动画
三、 实验设计
1、 系统的数学模型
系统的运动遵循拉格朗日方程:
L?Ec?Ep?? ?d??L??L?D???Fq?dt??q'??q?q'???
其中:
q: x(t)和θ(t)的自由度
D: 由于摩擦而消耗的能量
2
Maple滑块摆实验 SY1217227苏森
Fq: 自由度q产生的力
Ec和Ep: 系统的动能和势能
系统有两个自由度,以x和?为广义坐标,以过A点的水平面为零势能面,系统的动能和势能分别为
121?2?2lx?cos????M?x?2?l2???mx22 11?2?Mlx?cos??2?Ml2?????m?M?x22Ec?
Ep??Mglcos?
系统的Lagrange方程为
L?Ec?Ep?
计算出诸导数 11?2?Mlx?cos??Mglcos? ?2?Ml2????m?M?x22
d??L???cos??Ml??2sin? ??Ml?x?????m?M??dt??x?
?L?0 ?x
d??L?2???Mlx?x??cos??Ml??sin? ?Ml????dt????
?L?x?sin??Mglsin? ??Ml???
带入Lagrange方程,得到系统的运动微分方程
??cos??Ml??2sin??0?x?Ml???m?M??? ??????xcos??gsin??0??l?
四、 实验结果
1、 滑块A的位移x随时间t的变化曲线
3
Maple滑块摆实验 SY1217227苏森
2、 角度φ随时间t的变化曲线
3、 滑块摆的运动动画
4
Maple滑块摆实验 SY1217227苏森
4、 源程序
restart;
with(DEtools):#调用微分方程工具包
with(plots):#调用图形包
with(plottools):#图形工具包
g := 9.8:
m := 1:
M := 1:
l := 2:
equ1 := (m+M)*(diff(x(t),t$2)+M*l*cos(phi(t))*(diff(phi(t),
t$2)-M*l*sin(phi(t))*(diff(phi(t), t))^2 = 0;
equ2 := l*(diff(phi(t),t$2)+cos(phi(t))*(diff(x(t),t$2)+g*sin(phi(t)) = 0;
val := array(1 .. 100):
fori to 100 do
val[i] := (1/10)*i
end do:
S := dsolve({equ1, equ2, phi(0) = 0, x(0) = 0, (D(phi))(0) = -1.3, (D(x))(0) = 1}, {phi(t), x(t)}, method = rkf45, type = numeric, output = val):
eval(S):
5
Maple滑块摆实验 SY1217227苏森
DEplot([equ1, equ2], [x(t), phi(t)], t = 0 .. 10, [[x(0) = 0, (D(x))(0) = 1, phi(0) = 0, (D(phi))(0) = -1.3]], stepsize = .1, linecolor = t);#画x(t)
DEplot([equ1, equ2], [phi(t), x(t)], t = 0 .. 10, [[x(0) = 0, (D(x))(0) = 1, phi(0) = 0, (D(phi))(0) = -1.3]], stepsize = .1, linecolor = t);#画phi(t)
for t to 100 do # 求摆球圆心位置
x(t) :=S[2,1][t,4]:
x1(t):=l*sin(S[2,1][t,2])+x(t):
y1(t):=-l*cos(S[2,1][t,2]):
end do:
for t to 100 do
wall := curve([[-4, 0], [0.5, 0]]):#画墙壁
slider := rectangle([x(t)-.15, .15], [x(t)+.15, -.15], color = green): #画绿色滑块
pendulum := disk([x1(t), y1(t)], .2, color = red): #画红色小球
lineW_P := curve([[x(t), 0], [x1(t), y1(t)]]):#画摆线
G1[t] := display(pendulum, lineW_P, wall, slider) :
end do:
display([seq(G1[t], t = 1 .. 100)], insequence = true, scaling = constrained, axes = none,
title = `Singled Pendulum`);
6
CVI传感器静态标定实验 SY1217227苏森
实验二: CVI传感器静态标定实验
一、实验目的
掌握用CVI进行图形化界面设计及仿真的方法
二、 实验要求
1读取数据,显示散点图及拟合直线
2计算斜率,截据,均方差,线性度并显示
3生成.TXT报表
三、 实验设计
测试系统的静态特性就是指当被测量x不随时间变化或随时间的变化程度远缓慢于系统固有的最低阶运动模式的变化速度时,测试系统的输出量y与输入量x之间的函数关系,测试系统的静态特性,是通过静态标定的过程获的。
1线性度
一般情况下,要求传感器具有线性特性,但传感器的实际特性却是非线性的曲线,这种实际特性曲线与基准直线间的偏差称为非线性误差。传感器的非线性误差指标通常用线性度表示,线性度的定义为:
eL?
式中:eL——线性度(非线性误差)
?LjmaxyF.S?100% ?Ljmax——在整个测量范围内绝对值最大的非线性误差 yF.S——传感器的满量程输出值
由上面定义可以知道,传感器的线性度是以基准直线为参考的,实际测量中采用的是最小二乘线性度
2 重复性
在相同的工作条件下,在一段短的时间间隔内,输入量从同一方向作满量程变化时,同一输入量值所对应的多次测量所得到的一组输出量值,他们之间相互偏离的程度便称为传感器的重复性。当传感器在全量程范围内多次重复测试时,同是正行程或同时反行程上对应同一输入量,其输出量之间的差值称为重复性偏差。正、反行程的重复性偏差分别为:
?Rj???yjmax???yjmin?ccc?
?Rj?f??yjmax?f??yjmin?f?
在全量程内,重复性偏差的绝对值的最大值与基准直线上满量程输出之比为重复性误差,定义如下:
7
CVI传感器静态标定实验 SY1217227苏森
eR??RjmaxyF.S?100%
虚拟传感器的标定数据存储为a.cld,b.cld两个文件中,其数据定义为结构体CalibrateData,声明如下
typedefstructCalibrateData
{
intinputnum; //输入测量点数
double *input; //输入测量点的值,数据长度为inputnum
char inputunit[10]; //输入物理量的单位
introundnum; //测量的循环数
char outputunit[10]; //测量所得物理量的单位
double *output; //测量的值,其排列顺序为:第一循环正行程, //第一循环反行程,第二循环正行程,
//第二循环反行程,依次类推。数据长度为
// inputnum*2* roundnum
}CALIDATA;
在回调函数中利用LinFit函数计算传感器的基准直线,其函数原型如下:
Int status =LinFit (double arrayX[], double arrayY[], intnumberOfElements, double outputArray[], double *slope, double *intercept, double *meanSquaredError);
数组X, Y为用以计算拟合直线的点的x轴和y轴的坐标值,数组Z为得到的拟合直线值,数组X, Y, Z的长度均为n,slope为基准直线的斜率,intercept为基准直线的截距,meanSquaredError为均方差,Z,X满足如下关系
Zi = slope × Xi + intercept
meanSquaredError计算公式如下
n-1
meanSquaredError=?i=0Zi?Yi
n2
四、 实验结果
8
CVI传感器静态标定实验 SY1217227苏森
图1 图形化界面设计
图2 运行结果
9
CVI传感器静态标定实验 SY1217227苏森
图三生成报表
图4 清空报表
五、 源程序
#include <utility.h>
#include <analysis.h>
#include <ansi_c.h>
#include <cvirte.h>
#include <userint.h>
10
CVI传感器静态标定实验 SY1217227苏森 #include "calibration.h"
staticintcal;
/*----------------定义斜率、截距等全局变量---------------*/
char path[MAX_PATHNAME_LEN];
double *x;
double *y;//保存测量输入如测量输出
double *z;
doubleslope,intercept,square,linear,repeat;
/*---------------------定义数据结构体--------------------*/
typedefstructCalibrateData
{
intinputnum; //输入测量点数
double *input; //输入测量点的值,数据长度为inputnum char inputunit[10]; //输入物理量的单位
introundnum; //测量的循环数
char outputunit[10]; //测量所得物理量的单位
double *output; //测量的值,其排列顺序为:第一循环正行程,
//第一循环反行程,第二循环正行程,
//第二循环反行程,依次类推。数据长度为 // inputnum*2* roundnum
}CALIDATA;
CALIDATA data;//定义指针data为结构体类型
int main (intargc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((cal = LoadPanel (0, "calibration.uir", CAL)) < 0)
return -1;
DisplayPanel (cal);
RunUserInterface ();
DiscardPanel (cal);
return 0;
}
int CVICALLBACK SHOWCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
11
CVI传感器静态标定实验 SY1217227苏森 switch (event)
{
case EVENT_COMMIT:
FILE *file;
file=fopen("report.txt","a");//若不存在,创建文件
fclose(file);
/*------------显示报表--------*/
LaunchExecutable ("notepad.exe report") ;
break;
}
return 0;
}
int CVICALLBACK AQUIRECallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
FILE *file;
double *p;
double *stack1,*stack2,*stack3,*stack4;
doublemax,min;
intmaxindex,minindex;
double a[5];
int flag=0;//加载文件标志
switch (event)
{
case EVENT_COMMIT:
/*-----------读取文件并保存-----------*/
flag = FileSelectPopup ("", "*.cld", "", "载入数据文件",
VAL_LOAD_BUTTON, 0, 0, 1, 1, path);
if(flag>0)
{
file=fopen(path,"rb");
fread (&data.inputnum, sizeof(int), 1, file);//读取测量点数
if(data.input==NULL)
data.input=malloc(sizeof(double)*data.inputnum);
else
data.input=realloc(data.input,sizeof(double)*data.inputnum);
fread(data.input,sizeof(double),data.inputnum,file);//读取输入测量点的值,为double类型
fread(data.inputunit,sizeof(char),10,file); //读取输入物理量的单位
12
CVI传感器静态标定实验 SY1217227苏森 fread(&data.roundnum,sizeof(int),1,file);//读取测量循环数
fread(data.outputunit,sizeof(char),10,file);//读取测量所得物理量单位
if(data.output==NULL)
data.output=malloc(sizeof(double)*2*data.inputnum*data.roundnum);
else
data.output=realloc(data.output,sizeof(double)*2*data.inputnum*data.roundnum);
fread(data.output,sizeof(double),2*data.inputnum*data.roundnum,file);//读取测量的值
fclose(file);
}
DeleteGraphPlot (CAL, CAL_GRAPH, -1, VAL_IMMEDIATE_DRAW);//删除原有曲线
for(inti=0;i<2*data.roundnum;i++)
for(int j=0;j<data.inputnum;j++)
PlotPoint (CAL,CAL_GRAPH, data.input[j],
data.output[i*data.inputnum+j], VAL_EMPTY_SQUARE, VAL_RED);
/*--------------为变量开辟堆栈区-----------*/
stack1 = malloc (sizeof(double)*data.inputnum*2*data.roundnum); stack2 = malloc (sizeof(double)*data.inputnum*2*data.roundnum); stack3 = malloc (sizeof(double)*data.inputnum);
stack4 = malloc (sizeof(double)*data.roundnum*2*data.inputnum); for(inti=0;i<2*data.roundnum;i++)
for(int j=0;j<data.inputnum;j++)
stack1[i*data.inputnum+j]= data.input[j];
/*-------------拟合并显示-------------*/
/*for(inti=0;i<=data.inputnum;i++)
{
;
}*/
LinFit (stack1, data.output,
data.inputnum*2*data.roundnum,stack2,&slope, &intercept, &square);
13
CVI传感器静态标定实验 SY1217227苏森
SetCtrlVal (CAL, CAL_SLOPE, slope);
SetCtrlVal (CAL, CAL_INTERCEPT, intercept);
SetCtrlVal (CAL, CAL_SQUARE, square);
PlotLine (CAL, CAL_GRAPH, stack1[0], stack2[0],
stack1[data.inputnum*2*data.roundnum-1],
stack2[data.inputnum*2*data.roundnum-1], VAL_CYAN);
/*----------计算线性度误差并显示--------------*/
for(inti=0;i<data.inputnum*2*data.roundnum;i++)
stack1[i]=abs(stack2[i]-data.output[i]);
MaxMin1D (stack1, data.inputnum*2*data.roundnum, &max,
&maxindex, &min,
&minindex);
linear=max*100/(stack2[data.inputnum*2*data.roundnum-1]-stack2[0]); SetCtrlVal (CAL, CAL_LINEAR, linear);
/*----------计算重复性误差并显示--------------*/
for(int j=0;j<data.inputnum;j++)
{
max=0;
min=2*stack2[data.inputnum*2*data.roundnum-1];
for(inti=0;i<2*data.roundnum;i++)
{
if(max<data.output[i*data.inputnum+j])
max=data.output[i*data.inputnum+j];
if(min>data.output[i*data.inputnum+j])
min=data.output[i*data.inputnum+j];
}
stack3[j]=max-min;
}
MaxMin1D (stack3, data.roundnum, &max, &maxindex, &min, &minindex);
repeat=max*100/(stack2[data.inputnum*2*data.roundnum-1]-stack2[0]);
SetCtrlVal (CAL, CAL_REPEAT, repeat);
/*------------生成报表-----------*/
file=fopen("report.txt","a");//以写的形式打开,若不存在则创建 fprintf(file,"Slope Intercept MeanSquaredError Linear RepeatingError \n");//标题栏
fprintf(file,"%f %f %f %f %f \n",slope,intercept,square,linear,repeat);//标题栏
fclose(file);
free(stack1);//释放内存
14
CVI传感器静态标定实验 SY1217227苏森 free(stack2);
free(stack3);
free(stack4);
break;
}
return 0;
}
int CVICALLBACK CLEARCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
FILE *file;
file=fopen("report.txt","a");//若不存在,创建文件
fclose(file);
file=fopen("report.txt","w");//以写的形式打开,清除内容
fclose(file);
break;
}
return 0;
}
int CVICALLBACK EXITCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
QuitUserInterface (0);
break;
}
return 0;
}
三、实验总结
通过本次机电系统仿真实验,掌握了利用Maple解决数学问题、图形显示的能力,掌握了利用LabWindows进行图形界面设计及编程的方法,了解了仿真系统对实际工作的指导意义。在实验室的过程中遇到了很多困难,通过查阅相关资料及互联网进行了解决,增强了编程及发现问题、解决问题的能力。在以后的学习和工作中,我会再接再厉。
15