计算机控制实验指导书Word格式文档下载.docx
《计算机控制实验指导书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机控制实验指导书Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
1.必做内容
针对具体的被控对象,设计PID控制器,其算法采用位置式或增量式算法。
设计、编制程序进行仿真分析,给出仿真结果,并讨论比例、积分、微分的作用;
2.选做内容
采用一到二种改进型算法设计PID控制器,例如:
积分分离PID算法、不完全微分PID算法和微分先行PID算法,设计、编制程序进行仿真分析,给出仿真结果;
3.被控对象
设被控对象为二阶惯性环节,其传递函数
如下式:
,且采样周期T=0.1s,输入为单位阶跃信号;
4.性能指标要求
调整时间
;
超调量
静态误差
。
四.实验原理图
五.实验步骤:
1.将零阶保持器和给定的控制对象构成广义控制对象,写出其z传递函数,并转化成相应的差分方程;
2.PID控制算法采用位置式算法或者增量式算法
位置式:
增量式:
其中:
为比例系数,
为积分系数,
为微分系数;
3.通过试凑法选择合适的PID参数,使得系统达到给定的性能指标。
并讨论比例、积分和微分对系统产生的作用。
记录选择的PID参数;
记录输出的仿真数据;
记录仿真图形曲线。
提示:
(1)调整PID参数时,先将I、D参数保持不变,改变P参数,通过曲线图的变化得出P与超调量及调整时间的关系,再固定P、D参数,分析I对超调量及调整时间的影响,以此方法,观察D对超调量及调整时间的影响。
P
I
D
不变
分别记录P、I、D三参数对应的仿真曲线
(2)试凑法选择合适的PID参数,使得系统达到给定的性能指标。
记录仿真曲线及参数。
六.预习要求
1.复习数字PID控制算法的基本原理;
2.复习MATLAB和VC、C++的编程、调试方法;
3.用MATLAB或C++设计、编写数字PID控制算法源程序和仿真图形曲线输出的源程序。
七.实验报告
1.写出程序清单并进行注释;
2.分析调试、运行结果。
最小拍控制系统
1.了解数字最小拍控制系统的一般原理;
2.掌握数字最小拍控制系统的编程方法。
三.实验内容
针对具体的被控对象,设计系统存在波纹的最小拍数字控制器,编制程序进行仿真分析,给出仿真结果;
采用阻尼因子法设计最小拍数字控制器,编制程序进行仿真分析,给出仿真结果;
,且采样周期T=1s,输入分别为单位阶跃信号、单位速度信号和单位加速度信号。
五.实验步骤
1.将零阶保持器和给定的控制对象构成广义控制对象,写出其
传递函数
,并化成相应的差分方程;
2.确定希望的数字控制器
:
单位阶跃信号:
单位速度信号:
单位加速度信号:
3.通过MATLAB或C++编程进行仿真,验证系统是否在规定拍数达到稳态。
分别对单位阶跃信号、单位速度信号和单位加速度信号:
记录调整的最小拍控制参数;
记录仿真图形曲线,标明拍数
1.复习数字最小拍控制系统的基本原理;
2.复习MATLAB和C++的编程、调试方法;
3.用MATLAB或C++设计、编写数字最小拍控制算法源程序和仿真图形曲线输出的源程序。
基于Smith预估器的纯滞后控制系统设计
1.了解smith预估控制器算法的一般原理;
2.掌握smith预估控制器算法的编程方法;
3.与PID控制算法进行比较,加深对该控制算法的掌握和理解。
1.根据给定对象特性,设计smith预估控制器算法,利用Matlab(Simulink)软件或C++软件编制程序进行仿真分析,给出仿真结果;
2.设广义被控对象为:
控制系统框图为:
取T=1、τ=2、T1=2.88,经采样(T=1s)保持后,其广义对象z传递函数为
,
转换为2个单位迟延
控制器参数:
Kp=0.5,Ki=0.2,Kd=0。
四.实验步骤
1.设计smith预估控制算法,作给定值扰动和外部扰动响应实验,并绘制控制器输出P和系统输出y响应曲线;
2.被控对象不变,采用理想PID进行给定值扰动和外部扰动响应实验,并绘制控制器输出P和系统输出y响应曲线。
五.预习要求
1.复习smith预估控制算法和PID算法的基本原理;
3.用MATLAB或C++设计、编写smith预估控制算法源程序和仿真图形曲线输出的源程序。
六.思考题
1.分析两类控制算法对带迟延对象的控制效果;
2.根据实验分析Smith预估控制算法的优点是什么,若采用PID算法解决同类问题效果如何?
Matlab辅助设计软件:
具体操作步骤:
1、
启动Matlab;
2、单击工具栏中的Simulink仿真图标,进入Simulink仿真环境
新建
模块库
3、新建仿真结构图,寻找模块,拖动到新建仿真结构图中
所涉及模块的位置:
加法器Sum:
在Simulink/MathOperations子库中。
离散PID控制器:
在SimPowerSystems/ExtraLibrary/DiscreteControlBlocks子库中。
离散传递函数DiscreteTransferFcn:
在Simulink/Discrete子库中。
示波器Scope:
在Simulink/Sinks模型库中。
阶跃信号Step:
在Simulink/Sources模型库中。
4、修改模块参数。
双击模块,在出现的窗口中设置参数。
5、连接模块。
将光标移到一个模块的输出端(>
)按下鼠标左键拖动鼠标到另一个模块的输入端(>
),松开鼠标左键就可以完成两个模块的连接。
6、设置仿真参数,进行仿真。
在Simulation下拉菜单中设置仿真参数,单击工具栏中的StartSimulation图标),计算机开始仿真,示波器可显示出仿真曲线。
7、通过曲线,分析系统性能。
附录
参考程序1
#include"
stdafx.h"
1111.h"
1111Doc.h"
1111View.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
IMPLEMENT_DYNCREATE(CMy1111View,CView)
BEGIN_MESSAGE_MAP(CMy1111View,CView)
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
ON_COMMAND(ID_FILE_PRINT_PREVIEW,
CView:
OnFilePrintPreview)
END_MESSAGE_MAP()
CMy1111View:
CMy1111View()
{
}
~CMy1111View()
BOOLCMy1111View:
PreCreateWindow(CREATESTRUCT&
cs)
returnCView:
PreCreateWindow(cs);
//CMy1111Viewdrawing
voidCMy1111View:
OnDraw(CDC*pDC)//求PID参数
inti=0;
doubleKp=0.5,Ki=0.045,Kd=1;
doubler[100];
doubley[100],u[100],e[100],datau[100];
y[0]=0;
e[0]=0;
u[0]=0;
e[1]=0;
y[1]=0;
u[1]=0;
for(i=0;
i<
100;
i++)
{
r[i]=4.01;
}
for(i=2;
{
e[i]=r[i]-y[i-1];
datau[i]=(Kp+Ki+Kd)*e[i]-(Kp+2*Kd)*e[i-1]+e[i-2];
u[i]=u[i-1]+datau[i];
y[i]=1.724*y[i-1]-0.741*y[i-2]+0.0453*u[i-1]+0.04095*u[i-2];
CPenhPen1(PS_SOLID,1,RGB(0,0,0));
CPenhPen2(PS_SOLID,1,RGB(255,0,0));
CPenhPen3(PS_SOLID,1,RGB(0,255,0));
CPen*pen0;
CRectrect0;
chars[50];
CFontfont;
font.CreateFont(10,6,0,
0,30,FALSE,
FALSE,FALSE,
DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH|FF_ROMAN,"
Arial"
);
CFont*font0;
pen0=pDC->
SelectObject(&
hPen1);
//画X-Y坐标抽
pDC->
MoveTo(50,610);
LineTo(950,610);
LineTo(50,10);
SelectObject(pen0);
MoveTo(950,610);
LineTo(945,605);
LineTo(945,615);
MoveTo(50,10);
LineTo(45,15);
LineTo(55,15);
15;
i++)//画X轴刻度
pen0=pDC->
pDC->
MoveTo(100+i*50,610);
LineTo(100+i*50,605);
rect0.left=90+i*50;
rect0.right=rect0.left+20;
rect0.top=615;
rect0.bottom=630;
sprintf(s,"
%d"
(i+1)*10);
font0=pDC->
font);
pDC->
SetTextColor(RGB(0,0,0));
SetBkMode(TRANSPARENT);
DrawText(s,-1,&
rect0,DT_CENTER);
SelectObject(font0);
5;
i++)//画Y轴刻度
MoveTo(50,510-i*100);
LineTo(55,510-i*100);
rect0.left=30;
rect0.top=510-i*100-5;
rect0.bottom=rect0.top+20;
i+1);
hPen2);
//画曲线r[t]
99;
MoveTo((50+i*5),(610-r[i]*100));
LineTo((50+i*5+5),(610-r[i+1]*100));
hPen3);
//画曲线y[t]
MoveTo((50+i*5),(610-y[i]*100));
LineTo((50+i*5+5),(610-y[i+1]*100));
hPen1.DeleteObject();
hPen2.DeleteObject();
hPen3.DeleteObject();
font.DeleteObject();
//CMy1111Viewprinting
OnPreparePrinting(CPrintInfo*pInfo)
returnDoPreparePrinting(pInfo);
OnBeginPrinting(CDC*,CPrintInfo*)
//TODO:
addextrainitializationbeforeprinting
OnEndPrinting(CDC*,CPrintInfo*)
addcleanupafterprinting
//CMy1111Viewdiagnostics
AssertValid()const
CView:
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
CMy1111Doc*CMy1111View:
GetDocument()//non-debugversionis
//inline
ASSERT(m_pDocument->
IsKindOf(RUNTIME_CLASS
(CMy1111Doc)));
return(CMy1111Doc*)m_pDocument;
#endif//_DEBUG
参考程序2
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
OnDraw(CDC*pDC)
inti;
doubler[1000];
doubley[1000];
doublee[1000];
doubleu[1000];
1000;
r[i]=1;
e[1]=1;
u[1]=1/3.68;
for(i=2;
y[i]=1.368*y[i-1]-0.368*y[i-2]+3.68*u[i-1]+2.64224*u[i-2];
e[i]=r[i]-y[i];
u[i]=-0.718*u[i-1]+(e[i]-0.368*e[i-1])/3.68;
}
CPenhPen1(PS_SOLID,1,RGB(0,0,0));
CPenhPen2(PS_SOLID,1,RGB(255,0,0));
CPenhPen3(PS_SOLID,1,RGB(0,255,0));
CPen*pen0;
CRectrect0;
chars[50];
CFontfont;
font.CreateFont(10,6,0,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,DEFAULT_PITCH|FF_ROMAN,"
//画X-Y坐标抽
//画X轴刻度
9;
//画的刻度线
MoveTo(50+i*100,610);
LineTo(50+i*100,605);
rect0.left=40+i*100;
i);
//画Y轴刻度
2;
//////////////画刻度线
MoveTo(50,410-i*200);
LineTo(55,410-i*200);
SelectObje