资源描述
.\
大 连 海 事 大 学
课 程 设 计
课 程 控制工程软件课程设计
题 目 离散系统的数字PID控制仿真
院 系 信息科学技术学院
专业班级 自动化一班
学生姓名 张亚婷
学生学号 2220142511
指导教师 徐慧朴
2016年 1月 13日
大连海事大学课程设计任务书
课程 控制工程软件课程设计
题目 离散系统的数字PID控制仿真
专业 自动化一班 姓名 张亚婷 学号 2220142511
主要内容:
控制对象为采样时间为1ms,针对离散系
统的阶跃信号、正弦信号和方波信号的位置响应,设计离散的位置式PID控制器。其中S为信号选择变量,并对控制器的输出进行进行限幅:[-10,-10]。
基本要求:
(1) 设计可视化窗口实现;
(2)系统输入信号可选择,完成对PID参数,系统阶次的调节;
(3)显示误差大小;
(4)完成全系统的详细分析设计报告。
参考资料:
[1] 郑阿奇,曹戈.MATLAB实用教程(第三版)[M].北京:电子工业出版社
[2] 网上查找离散系统的PID参数调节相关资料
完成时间 2016.1.3—2016.1.13
学生 (签名) 指导教师 (签名)
专业负责人 (签名)
2016年1月 13 日
目录
1设计要求 1
2方案设计 1
2.1设计思路 1
2.2总体方案方框图 1
2.3基本原理 2
3位置式PID算法及其仿真 3
3.1位置式PID算法原理 3
3.2不同输入下的仿真界面结果显示 6
4增量式PID算法及其仿真 7
4.1增量式PID算法原理 7
4.2 不同输入下的仿真界面结果显示 8
5调节PID参数得到最优解 10
6位置式PID和增量式PID比较 12
7 总结 13
参考文献 14
附录 15
.\
1设计要求
控制对象为采样时间为1ms,针对离散系统的阶跃信号、正弦信号和方波信号的位置响应,设计离散的位置式PID控制器。其中S为信号选择变量,S=1时为阶跃跟踪,S=2时为方波跟踪,S=3为正弦跟踪。对控制器的输出进行限幅:[-10,10]。
要求:(1)系统的阶次和系数可调;
(2)PID参数可调;
(3)用两种方式显示离散系统的数字PID控制仿真,并显示误差;
(4)用MATLAB编写成为可视化窗口实现上述功能;
2方案设计
2.1设计思路
(1) 根据设计要求,理解PID控制的原理,确定控制仿真的方式为位置式和增量式两种典型形式。
(2) 建立可视化窗口界面,设计显示界面,产生对应的脚本,编辑回调函数,首先获得可变的PID参数,再获得可变的分子分母系数。
(3) 最后编辑显示误差值。优化显示界面,并调节拟合程度最好的PID参数。
2.2总体方案方框图
比例
yout(k)
被控对象
ran(k)
Y(k)ff
积分
微分
图1 基本原理框图
2.3基本原理
总体基本原理框图如图1所示。
PID控制器是一种线性控制器,它根据给定值rin(t)与实际的输出值yout(t)构成偏差
PID的控制规律为
或写成传递函数的形式为
式中,——比例系数;——积分时间常数;微分时间常数。
PID控制器各个校正环节的作用如下:
(1) 比例环节:成比例的反应控制系统的偏差信号。偏差一旦产生,控制器立即产生控制作用,以减少偏差。
(2) 积分环节:主要用于消除静差,提高系统的无差度。积分作用的强弱主要取决于积分时间常数,越大,积分作用越弱,反之则越强。
(3) 微分环节:反应偏差信号的变化趋势(变化速率),并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号。从而加快系统的动作速率,减少调节时间。
3 位置式PID控制算法及其仿真
3.1位置式PID算法原理
y
u
e
r
受控对象
PID位置算法
+
位置式PID控制算法的简化示意图
d
dt
e
u
上图传递函数为:
在时域的传递函数表达式
对上式中的微分和积分进行近似:
式中n是离散点的个数
于是传递函数可以简化为:
其中
u(n)——第k个采样时刻的控制:
——比例放大系数;
——积分放大系数;
——微分放大系数;
T ——采样周期。
如果采样周期足够小,则近似计算可以得到足够精确的结果,离散控制结果和连续系统十分接近。
它表示的控制算法直接按所给的PID控制规律定义进行计算的,所以它给出了全部控制量的大小,因此被称为位置式PID控制算法。
控制对象为
采样时间为1ms,采用z变换进行离散化,经过z变换后的离散化对象为
控制算法程序框图可如下所示:
开始
参数初始化
采入rin(k)和yout(k)
计算偏差值
计算控制器输出
参数更新
返回
程序及其批注见附录所示。
3.2不同输入下的仿真界面结果显示
S=1时输入为阶跃的结果
S=2时输入为方波的结果
S=3时输入为正弦的结果
4增量式PID算法及其仿真
4.1增量式PID算法原理
当我们把离散系统看做相等的增量值时间增加时,可以用增量式PID控制算法
根据递推原理可得
增量式PID控制算法
我们可以看出,如果我们采用恒定的采样周期T,只要只用前后三次测量的偏差,就可以得到控制量。
PID算法的流程图如下所示
开始
读取给定值r(k)
计算偏差e(k)=r(k)-y(k)
计算
存以备输出
参数传递
返回
程序以及注释见附录
4.2不同输入下的界面仿真显示
S=1时阶跃输入
S=2方波输入时
S=3正弦输入时
5. 调节PID控制器参数得到最优解
比例控制:就是对偏差进行控制,偏差一旦产生,控制器立即就发生作用即调节控制输出,使被控量朝着减小偏差的方向变化,偏差减小的速度取决于比例系数Kp, Kp越大偏差减小的越快,但是很容易引起振荡,尤其是在迟滞环节比较大的情况下,Kp减小,发生振荡的可能性减小但是调节速度变慢。但单纯的比例控制存在静差不能消除的缺点。这里就需要积分控制。
积分控制:实质上就是对偏差累积进行控制,直至偏差为零。积分控制作用始终施加指向给定值的作用力,有利于消除静差,其效果不仅与偏差大小有关,而且还与偏差持续的时间有关。简单来说就是把偏差积累起来,一起来运算。
微分控制:它能敏感出误差的变化趋势,可在误差信号出现之前就起到修正误差的作用,有利于提高输出响应的快速性,减小被控量的超调和增加系统的稳定性。但微分作用很容易放大高频噪声,降低系统的信噪比,从而使系统抑制干扰的能力下降。因此,在实际应用中,应慎用微分控制。
调节的过程中首先使得积分和微分系数为0,首先调节比例系数,得到临界震荡的Kp,再调节Ki由大到小调节,消除静差,最后调节Kd,减小调节时间,最后得到最优的控制器参数,其误差不一定最小。
以下为阶跃输入下调节的最优参数
位置式
增量式
6. 位置式PID和增量式PID的比较
整体图形用户界面如下所示:
位置式PID控制算法的缺点:当前采样时刻的输出与过去的各个状态有关,计算时要对e(k)即误差进行累加,运算量大;而且控制器的输出u(k)对应的是执行机构的实际位置,如果计算机出现故 障,u(k)的大幅度变化会引起执行机构位置的大幅度变化。
增量式PID是数字控制器的输出只是控制量的增量Δu(k)。采用增量式算法时,计算机输出的控制量Δu(k)对应的是本次执行机构位置的增量,而不是对应执行机构的实际位置,因此要求执行机构必须具有对控制量增量的累积功能,才能完成对被控对象的控制操作。
增量式算法优点:①算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果;②计算机每次只输出控制增量,即对应执行机构位置的变化量,故机器发生故障时影响范围小、不会严重影响生产过程;③手动—自动切换时冲击小。当控制从手动向自动切换时,可以作到无扰动切换。
7 总结
1. 就实现要求的用户图形界面来说,设计整体布局,以及实现需要的功能需要的图形对象面板工具常用控件的选择,虽然选择是比较自由的,方式也是多样的,第一次做位置式时我选择了一组按钮,来切换输入信号。在做第二种增量式时,希望得到更多的方式或者学到不同常用控件的实用方法,我选择了设定一组单选按钮,用了两种语句来实现,一种是if……else……语句,一种是switch语句,两种方法都可以实现单选按钮的功能。
2. 就PID控制系统而言,除了自动控制原理课堂上的,通过这次课程设计对于PID有了更加深刻的认识,对于其在矫正系统功能方面有了更加系统的认知,也进一步揭开了其常被应用的面纱。
3. 离散系统的分析源自于连续系统的离散,首先进行离散化z变换,知道了位置式和增量式的区别最重要的在于位置式的变化和之前的每一个时刻都有关系,而增量式的只和最近三次的增量有关系。
4. 这个课程设计锻炼了我的思考和查阅资料的能力。
参考文献
[1] 郑阿奇,曹戈.MATLAB实用教程(第三版)[M].北京:电子工业出版社
附录
主程序:
function varargout = PID(varargin)
gui_Singleton = 1;
gui_State = struct(gui_Name, mfilename, ...
gui_Singleton, gui_Singleton, ...
gui_OpeningFcn, @PID_OpeningFcn, ...
gui_OutputFcn, @PID_OutputFcn, ...
gui_LayoutFcn, [] , ...
gui_Callback, []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function PID_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = PID_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function jieyue_Callback(hObject, eventdata, handles)
kp=str2double(get(handles.Kp,String));
ki=str2double(get(handles.Ki,String));
kd=str2double(get(handles.Kd,String));
axes(handles.tu1); %选坐标轴1作图
nums=str2num(get(handles.num,String));
dens=str2num(get(handles.den,String));
out=PIDcontrol(1,kp,ki,kd,nums,dens);
set(handles.error,String,num2str(out));
function fangbo_Callback(hObject, eventdata, handles)
kp=str2double(get(handles.Kp,String));
ki=str2double(get(handles.Ki,String));
kd=str2double(get(handles.Kd,String));
axes(handles.tu1);%选坐标轴1作图
nums=str2num(get(handles.num,String));
dens=str2num(get(handles.den,String));
out=PIDcontrol(2,kp,ki,kd,nums,dens);
set(handles.error,String,num2str(out));
function zhengxian_Callback(hObject, eventdata, handles)
kp=str2double(get(handles.Kp,String));
ki=str2double(get(handles.Ki,String));
kd=str2double(get(handles.Kd,String));
axes(handles.tu1);%选坐标轴1作图
nums=str2num(get(handles.num,String));
dens=str2num(get(handles.den,String));
out=PIDcontrol(3,kp,ki,kd,nums,dens);
set(handles.error,String,num2str(out));
function Kp_Callback(hObject, eventdata, handles)
function Kp_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function Ki_Callback(hObject, eventdata, handles)
function Ki_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function Kd_Callback(hObject, eventdata, handles)
function Kd_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function error_Callback(hObject, eventdata, handles)
function error_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function den_Callback(hObject, eventdata, handles)
function den_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function num_Callback(hObject, eventdata, handles)
function num_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function tuichu_Callback(hObject, eventdata, handles)
ss=questdlg(你真的要退出吗?,退出窗口,不,我还想看看!,是的,我要退出!,是的,我要退出!);
switch ss
case 是的,我要退出!
delete(handles.figure1);
end
function Kp1_Callback(hObject, eventdata, handles)
function Kp1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function Ki1_Callback(hObject, eventdata, handles)
function Ki1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function Kd1_Callback(hObject, eventdata, handles)
function Kd1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function error1_Callback(hObject, eventdata, handles)
function error1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor))
set(hObject,BackgroundColor,white);
end
function jieyue1_Callback(hObject, eventdata, handles)
function fangbo1_Callback(hObject, eventdata, handles)
function zhengxian1_Callback(hObject, eventdata, handles)
function uibuttongroup2_SelectionChangedFcn(hObject, eventdata, handles)
kp1=str2double(get(handles.Kp1,String));
ki1=str2double(get(handles.Ki1,String));
kd1=str2double(get(handles.Kd1,String));
nums=str2num(get(handles.num,String));
dens=str2num(get(handles.den,String));
S_3=get(handles.zhengxian1,Value);
S_2=get(handles.fangbo1,Value);
S_1=get(handles.jieyue1,Value);
axes(handles.tu2); %选坐标轴2作图
if S_3==1
out1=PIDcontrol1(3,kp1,ki1,kd1,nums,dens);
elseif S_2==1
out1=PIDcontrol1(2,kp1,ki1,kd1,nums,dens);
elseif S_1==1
out1=PIDcontrol1(1,kp1,ki1,kd1,nums,dens);
end
set(handles.error1,String,num2str(out1));
% axes(handles.tu2); %选坐标轴2作图
% kp1=str2double(get(handles.Kp1,String));
% ki1=str2double(get(handles.Ki1,String));
% kd1=str2double(get(handles.Kd1,String));
% nums=str2num(get(handles.num,String));
% dens=str2num(get(handles.den,String));
% n = get(handles,Tag);
% switch n
% case jieyue1
% out1=PIDcontrol1(1,kp1,ki1,kd1,nums,dens);
% case fangbo1
% out1=PIDcontrol1(2,kp1,ki1,kd1,nums,dens);
% case zhengxian1
% out1=PIDcontrol1(3,kp1,ki1,kd1,nums,dens);
% end
% set(handles.error1,String,num2str(out1));
位置式调用程序:
function out=PIDcontrol(S,kp,ki,kd,nums,dens)
ts=0.001; %采样时间
sys=tf(nums,dens);
dsys=c2d(sys,ts,z); %将系统离散化
[num,den]=tfdata(dsys,v); %获取离散后的分子分母系数
n=length(den);
for i=1:(n-1)
u_(i)=0;y_(i)=0;
end
x=[0,0,0];
error_1=0; %初始偏差设置为0
out=0; %初始误差和为0
for k=1:1000;
time(k)=k*ts; %采样时刻
if S==1 %阶跃信号
rin(k)=1;
elseif S==2 %方波信号
rin(k)=sign(sin(2*2*pi*k*ts));
elseif S==3 %正弦波信号
rin(k)=0.5*sin(2*2*pi*k*ts);
end
u_(k)=kp*x(1)+kd*x(2)+ki*x(3); %控制器输出,根据离散PID表达式
if u_(k)>=10 %限幅
u_(k)=10;
end
if u_(k)<=-10
u_(k)=-10;
end
yout(k)=0;
for j=2:n
yout(k)=yout(k)-den(j)*y_(j-1)+num(j)*u_(j-1);%阶次变化时的输出关系式
end
error(k)=rin(k)-yout(k); %此刻误差
for i=n-1:-1:2
u_(i)=u_(i-1);
y_(i)=y_(i-1); %此刻和上一刻输出的传递
end
u_(1)=u_(k);
y_(1)=yout(k);
x(1)=error(k); %计算P
x(2)=(error(k)-error_1)/ts; %计算D
x(3)=x(3)+error(k)*ts; %计算I
error_1=error(k); %误差的传递
out=out+error(k)^2;
end
out=out/1000;
plot(time,rin,b,time,yout,r);
xlabel(time(s)),ylabel(rin,yout) %横轴为时间,纵轴为输入输出
增量式调用程序:
function out1=PIDcontrol1(S,kp1,ki1,kd1,nums,dens)
ts=0.001;
sys=tf(nums,dens);
dsys=c2d(sys,ts,z); %将采样系统z变换进行离散化
[num,den]=tfdata(dsys,v); %获取离散后的分子分母系数矩阵
x=[0,0,0]; %将初始的P I D参数相乘的系数设置为0
m=length(den); %获得输入的系统的阶次
out1=0; %原始误差为0
for i=1:m-1
u_(i)=0;y(i)=0;
end
error_(1)=0;
error_(2)=0;
for k=1:1:1000;
time(k)=k*ts; %采样时刻
if S==1 %阶跃信号
rin(k)=1;
elseif S==2 %方波信号
rin(k)=sign(sin(2*2*pi*k*ts));
elseif S==3 %正弦波信号
rin(k)=0.5*sin(2*2*pi*k*ts);
end
du(k)=kp1*x(1)+ki1*x(2)+kd1*x(3); %控制器输出,根据离散PID表达式
u(k)=u_(1)+du(k);
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
yout(k)=0;
for j=2:1:m
yout(k)=yout(k)-den(j)*y(j-1)+num(j)*u_(j-1);
end
error(k)=rin(k)-yout(k); %误差等于期望减去实际
for i=m-1:-1:2
u_(i)=u_(i-1);
y(i)=y(i-1);
end
u_(1)=u(k);
y(1)=yout(k);
x(1)=error(k)-error_(1); %此刻误差减去上一刻的误差
x(2)=error(k);
x(3)=error(k)-2*error_(1)+error_(2); %下一个位置控制器输出P I D系数和此刻误差和上一个位置误差的关系
error_(2)=error_(1);
error_(1)=error(k); %误差在参数之间的传递
out1=out1+error(k)^2; %误差的积累
end
out1=out1/1000;
plot(time,rin,b,time,yout,r);
xlabel(time(s));ylabel(rin,yout);
大连海事大学课程设计成绩评价表
课程名称
控制工程软件课程设计
题目名称
离散系统的数字PID控制仿真
学生姓名
张亚婷
学号
2220142511
指导教
师姓名
徐慧朴
职称
序号
评价项目
指 标
满分
评分
1
工作量、工作态度和出勤率
按期圆满的完成了规定的任务,难易程度和工作量符合教学要求,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
20
2
课程设计质量与总结报告
课程设计选题合理,计算过程简练准确,分析问题思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
40
3
创新
工作中有创新意识,对前人工作有一些改进或有一定应用价值。
5
4
实践与答辩
实验方法、结果正确,能正确回答指导教师所提出的问题。
35
总分
评语:
指导教师: (签名) 年 月 日
展开阅读全文
相关搜索