当前位置:文档之家› 基于MATLAB的倒立摆系

基于MATLAB的倒立摆系


运行结果及响应曲线如下:
num = 2.3566 0 0 den = 1.0000 0.0883 -27.8285 -2.3094 0 kd = 1 k= 1 ki = 1 numc = 2.3566 0 0 0 denc = 1.0000 2.4449 -25.4720 0.0471 0 0 初始PID参数摆角状态图 参数摆角状态图 初始
其中,num1,deni,num2.den2分别代表被控对象1和
被控对象2传递函数的分子和分母。
4 3
ml2 q
G2 (s) =
可以推出小车位置的传递函数为
X (s) = U(s)
s2 −
mgl q
s +
3
4 3
bml2 q
s2 −
(M + m)mgl bmgl s− q q
其中
q = [( M + m )( I + ml
2.小车位置变化仿真 仿真结果如下:
M = 1.096; m = 0.109; b = 0.1; I = 0.0034; g = 9.8; l = 0.25; q =(M+m)*(I+m*l^2) -(m*l)^2; %simplifies input num1 = [m*l/q 0 0] den1 = [1 b*(I+m*l^2)/q -(M+m)*m*g*l/q b*m*g*l/q 0] num2 = [-(I+m*l^2)/q 0 m*g*l/q] den2 = den1 kd = 20 k = 100 ki = 1 numPID = [kd k ki]; denPID = [1 0]; numc = conv(num2,denPID) denc = polyadd(conv(denPID,den2),conv(numPID,num 1)) t=0:0.05:5; impulse(numc,denc,t)
1.参照上例的处理方法,把实际系统参数代入,进行PID控制仿真,并找到合适的参数 2. 将小车推到导轨正中间位置,并且使摆杆处于自由下垂的静止状态;3.给计算机和 电控箱通电; 4.打开计算机,在DOS操作系统下,键入“Pend” 启动程序,并按“s”使系统处于准备状态; 5.按 “↑”键起摆,等摆杆立起来并稳定下来之后(此时为LQR控制),选择”控制器”菜单中的 “PID”,输入参数,观察小车和摆杆的运动;(注意由于控制器只对摆杆进行了控制,所以在PID中输入 参数后小车可能向一个方向运动,此时需用手轻轻扶一下摆杆) 6.按“T”停止摆杆,当摆杆处于自由下垂的静止状态,并在”控制器”菜单中选择“PID”,并参照仿真 结果,输入PID控制器参数, 观察小车和摆杆的运动;(通过调整参数可以控制摆杆摆起并能够竖直向上, 此时可能需用手轻轻扶一下摆杆,以避免小车“撞墙”)。 7.如果控制效果不理想,调整控制器参数,直到获得较好的控制效果; 8.运动曲线文件保存在当前路径下,其中pos_x.dat为小车位置,pos_t.dat为摆杆角度con_u.dat为控制量; 9.到MatLab中运行如下指令,MatLab会将保存的曲线重新绘制出来。 9 MatLab MatLab
单级倒立摆数学模型的建立
• 在忽略了空气流动,各种摩擦之后, 可将倒立摆系统抽象成小车和匀质 杆组成的系统
• • • • • • • • • •
那我们在本实验中定义如下变量: M 小车质量 m 摆杆质量 b 小车摩擦系数 l 摆杆转动轴心到杆质心的长度 I 摆杆惯量 F 加在小车上的力 x 小车位置 φ 摆杆与垂直向上方向的夹角 θ 摆杆与垂直向下方向的夹角 (考虑到摆杆初始位置为竖直向 下)
0
图20小车位置曲线 小车位置曲线
实验总结: 实验总结:
经过这次实验,让我更加了解matlab软件的操作,并加深认识信号之间 的处理和图像的处理,matlab的功能很强大,很多实验实不能做的实验 都可以用matlab仿真,表现了matlab强大的仿真及数据分析处理能力。 matlab作为当前空寂控制技术界最流行的面向工程与科学计算的高级语 言,他可以轻易地再现C语言几乎全部的功能。从本次的实验看来,在 线性控制系统的分析和仿真中, matlab拥有非常方便快捷的数据处理能 力。其实我了解matlab只是一小部分,在今后的日子我会继续学习 matlab,经过这次论文的写作,我对matlab的认识和应用有了更加深刻 的理解。从以往的仿照例证,开始观察某个问题,然后根据学过的一些 语句和模块的知识来处理一些较为简单的问题,并加以分析。因为这个 软件对我们这个专业来说很重要,而且matlab能帮助我们仿真很多实验, 通过这次实践我收获很大。
其中,G(1)S是摆杆 传递函数 ,G(2)S是 小车传递函数。
由于输入信号r(s) =0, 所以可以把结构图转换成:
从此框图我们可以看出此处只对摆杆角度进行了控制,并没有对小车位置进行控制。小车位置输出为
num 2 G2 (s) den 2 X (s) = F ( s) = F (s) ( numPID )( num1 ) 1 + KD ( s )G1 ( s ) 1+ ( denPID )( den1 ) = ( num 2 )( denPID )( den1 ) F (s) ( denPID )( den1 )( den 2 ) + ( numPID )( num1 )( den 2 )
目的: 目的: 设计PID控制器,使得当在小车上施加1N的脉冲信号时,闭环系统的响应指标为: 1、稳定时间小于5秒 2、稳态时摆杆与垂直方向的夹角变化小于0.1 弧度 分析: 分析: 系统输出量为摆杆的位置,它的初始位置为垂直向上,我们给系统施加一个扰动, 观察摆杆的响应。系统框图如下: 考虑到输入
num1 = 2.3566 0 0 den1 = 1.0000 0.0883 -27.8285 -2.3094 0 num2 = -0.8832 0 23.0942 den2 = 1.0000 0.0883 -27.8285 -2.3094 0 kd = 20 k= 100 ki = 1 numc = -0.8832 0 23.0942 0 denc = 1.0000 47.2194 207.8268 0.0471 0
倒立摆系统的构成
• 系统包括计算机、运动控制卡、伺服机构、倒立摆本体 和光电码盘几大部分,组成了一个闭环系统。光电码盘 1将小车的位移、速度信号反馈给伺服驱动器和运动控 制卡,摆杆的位置、速度信号由光电码盘2反馈回控制 卡。计算机从运动控制卡中读取实时数据,确定控制决 策(小车向哪个方向移动、移动速度、加速度等),并 由运动控制卡来实现该控制决策,产生相应的控制量, 使电机转动,带动小车运动,保持摆杆平衡。
2
) − ( ml ) 2 ]
可以看出,den1=den2=den , 小车的算式可以简化成: X (s) = Matlab 仿真 实际系统参数如下:
( num2 )(denPID) F (s) (denPID)(den ) + k ( numPID)(num1 )
M 小车质量 1.096 Kg m 摆杆质量 0.109 Kg b 小车摩擦系数 0 .1N/m/sec l 摆杆转动轴心到杆质心的长度 0.2 5m I 摆杆惯量 0.0034 kg*m*m F 加在小车上的力 x 小车位置 θ 摆杆与垂直方向的夹角 T 采样频率 0.005秒
调节PID参数后摆角输出图 参数后摆角输出图 调节
系统稳定时间约为4秒,满足要求。由于此时稳态误差为0, 所以不需要改变积分环节(你可以改变积分系数,观察系统响应如何变化); 系统响应的超调量比较大,为了减小超调,增加微分系数KD,取KD=20,响应结果和响应曲线如下:
num = 2.3566 0 0 den = 1.0000 0.0883 27.8285 -2.3094 0 kd = 20 k= 100 ki = 1 numc = 2.3566 0 0 0 denc = 微调PID参数后摆角状态曲线 微调 参数后摆角状态曲线 1.0000 47.2194 207.8268 0.0471 0 0 系统稳定时间约为1秒,超调约为0.04,响应满足指标要求。
=
num den
其中
q = [( M + m)( I + ml 2 ) − (ml ) 2 ]
PID控制器的传递函数为
K I K D s 2 + K P s + K I numPID KD ( s ) = K D s + K P + = = s s denPID
调节PID控制器的各个参数,以得到满意的控制效果调。 考虑小车位置,得到改进的系统框图如下:
系统响应是不稳定的,不能满足要求,需要调整参数 Kp,Kd,和K1,直到获得满意的控制结果。 首先增加比例系数Kp,观察它对响应的影响,取Kp=100,Kd=1,系统响应如 :
num = 2.3566 0 0 den = 1.0000 0.0883 27.8285 -2.3094 0 kd = 1 k= 100 ki = 1 numc = 2.3566 0 0 0 denc = 1.0000 2.4449 207.8268 0.0471 0 0
1.摆杆角度控制 首先,需要把输出为摆杆角度
φ
时系统的传递函数用Matlab表示出来, 建立一个m-文件,将下面几行表示传递函数的语句拷贝进去
M = 1.096; m = 0.109; b = 0.1; 其中函数polyadd 是求两个多项式之和的函数 I = 0.0034; 它不是Matlab 工具,因此必须把它拷贝到polyadd.m文件中, 并把该文件的目录用addpath 命令加到路径中。Polyadd函数内容如下: g = 9.8; l = 0.25; function[poly]=polyadd(poly1,poly2) q =(M+m)*(I+m*l^2) -(m*l)^2; %simplifies if length(poly1)<length(poly2) input short=poly1; num = [m*l/q 0 0] long=poly2; den = [1 b*(I+m*l^2)/q -(M+m)*m*g*l/q else b*m*g*l/q 0] short=poly2; kd=1 long=poly1; k=1 end ki=1 mz=length(long)-length(short); numPID= [ kd k ki ]; if mz>0 denPID= [ 1 0 ]; poly=[zeros(1,mz),short]+long; numc= conv ( num, denPID ) else denc= polyadd ( conv(denPID, den ), poly=long+short; conv( numPID, num ) ) end t = 0 : 0.05 : 5; impulse ( numc , denc , t )
相关主题