找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5435|回复: 0
打印 上一主题 下一主题
收起左侧

MATLAB Pid仿真实验

[复制链接]
跳转到指定楼层
楼主
ID:111475 发表于 2016-3-30 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      
一实验要求:
学习PID控制器的基本原理,掌握PID参数的物理调节规律,通过仿真验证PID调节过程。选择例题中的任意两个实验进行仿真研究,改变参数后观察系统的动态性能和稳态性能的变化,确认是否和理论分析一致。
二实验内容
实验一:选择chap-9.m作为pid调节。
1代码:
%PID Controller with changing integration rate
clear all;
close all;
%Big time delay Plant
ts=20;
sys=tf([1],[60,1],'inputdelay',80);
dsys=c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');

u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
error_1=0;error_2=0;
ei=0;

for k=1:1:200
time(k)=k*ts;
rin(k)=1.0;  %Step Signal
%Linear model
yout(k)=-den(2)*y_1+num(2)*u_5;
error(k)=rin(k)-yout(k);
kp=0.45;kd=12;ki=0.0048;
A=0.4;B=0.6;
%T type integration
ei=ei+(error(k)+error_1)/2*ts;
M=1;
if M==1     %Changing integration rate
if abs(error(k))<=B
   f(k)=1;
elseif abs(error(k))>B&abs(error(k))<=A+B
   f(k)=(A-abs(error(k))+B)/A;
else
   f(k)=0;
end
elseif M==2  %Not changing integration rate
    f(k)=1;
end
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*f(k)*ei;
if u(k)>=10
   u(k)=10;
end
if u(k)<=-10
   u(k)=-10;
end
%Return of PID parameters
u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);   
y_3=y_2;y_2=y_1;y_1=yout(k);  
error_2=error_1;
error_1=error(k);
end
figure(1);
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('rin,yout');
figure(2);
plot(time,f,'r');
xlabel('time(s)');ylabel('Integration rate f');
2实验结果
在没有更改代码的情况下,实验的效果如图一所示。
图一
改变kp
(1)增大kp,理论上可以看到pid调节的更快更陡。实际效果如图2。Kp=3.
图2
实际上产生了自激震荡,说明kp不能调的过大,否则系统会不稳定。
(2)减小kp,理论上系统调节缓慢,会产生超调量,调节曲线不平滑,有毛刺。Kp=0.1
                              图3
实际上也证明比例系数太小,系统变化时调节相对缓慢。
改变kd
(1)增大kd,理论上系统稳定时波动很大,精度不高,且有很多毛刺与抖动。Kd=30.
                     图4
实际上系统开始调节时会有些尖峰,调节曲线不平滑。
(2)减小kd,理论上系统调节稳定时变化缓慢,会有些超调量。Kd=3.
                      图5
实际上也可以看出减小kd对系统影响不大,只是在系统刚进入稳定状态时有一个小小的超调量。
改变ki
(1)增大ki,积分变大,系统系统变得不稳定,抖动波动很厉害。
                         图6
实际上可以其变化幅度大,超调量很高,系统很不稳定。
(2)减小ki,系统调节变慢,系统可能无法调节。
                           图7
系统无法达到设定的稳态值,无法调节。
实验二:选择char2_1.m作为实验
1代码:
%Series System Control
clear all;
close all;
ts=2;
sys1=tf(1,[10,1]);
dsys1=c2d(sys1,ts,'z');
[num1,den1]=tfdata(dsys1,'v');
sys2=tf(1,[10,1]);
dsys2=c2d(sys2,ts,'z');
[num2,den2]=tfdata(dsys2,'v');
dph=1/zpk('z',ts);
Gc2=dph/(dsys2*(1-dph));
[nump,denp]=tfdata(Gc2,'v');
u1_1=0.0;u2_1=0.0;
y1_1=0;y2_1=0;
e2_1=0;ei=0;
for k=1:1:2000
time(k)=k*ts;
r1(k)=1;                           
%Linear model
y1(k)=-den1(2)*y1_1+num1(2)*y2_1;  %Main plant
y2(k)=-den2(2)*y2_1+num2(2)*u2_1;  %Assistant plant
error(k)=r1(k)-y1(k);
ei=ei+error(k);
u1(k)=1.2*error(k)+0.02*ei;   %Main Controller
e2(k)=u1(k)-y2(k);            %Assistant Controller
u2(k)=-denp(2)*u2_1+nump(1)*e2(k)+nump(2)*e2_1;
d2(k)=0.01*rands(1);
u2(k)=u2(k)+d2(k);
%----------Return of PID parameters------------
u1_1=u1(k);
u2_1=u2(k);
e2_1=e2(k);
y1_1=y1(k);
y2_1=y2(k);
end
figure(1);     %Assistant Control
plot(time,u1,'b',time,y2,'r');
xlabel('time(s)');ylabel('u1,y2');
figure(2);     %Main Control
plot(time,r1,'b',time,y1,'r');
xlabel('time(s)');ylabel('r1,y1');
figure(3);
plot(time,d2,'r');
xlabel('time(s)');ylabel('disturbance');
2实验效果
在没有更改远代码的情况下,实验的结果如下所示
                       图8
第3个图是随机数的随时间的分布。
同理,改变kp,ki的值,系统会发生改变。
改变kp
(1)增大kp,系统变化会更快,会有超调量。Kp=3.
                            图9
实际没有发现系统有超调量,但在系统开始调节得时候会会产生尖峰脉冲,系统调节很快。
(2)减小kp,系统调节缓慢,但系统稳定。
                    图10
结果可以看出系统调节很稳定,但调节时间有点长。
该变kd
(1)增大ki,系统很快达到稳定,调节速度快.ki=0.2
                      图11
结果显示系统在转换开始时系统产生了尖峰脉冲,然后很快地达到稳定。
(2)减小ki,系统会很慢的达到稳定.ki=0.005。
                      如图12
结果显示系统经过相当漫长的时间达到了稳定状态。
三实验感想
通过此在MATLAB上运用pid,对pidd的实际作用有了基本了解。对于kp,要选取的合适,不能过大,否则会产生震荡,过小可能会产生超常量,调节缓慢。对于kd,太大了产生毛刺抖动,太小了会有些超常量。对于ki,太大了调节很快,但会产生过冲,尖峰脉冲,太小了调节很慢,可能无法调试达到稳定状态。
总结这三点,在调试pid时,kp应从小到大调试,kd从小到大调试,ki从小到大调试。每次只调一个参数,直到最满意的时候,再调下个参数。

   


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表