MATLAB 中的各种函数用法——PID控制器(持续加更)

                                     厚积才能薄发,写给Jocker也献给各位!

 

step()函数:动态系统的阶跃响应绘图。  

具体描述:

 1.step:计算一个动态系统的阶跃响应。在状态空间的情况下,假定初始状态为零。当它没有输出参数时,调用这个函数在屏幕上的画出阶跃响应。 

2.step(sys):画出任意一个动态系统模型sys的阶跃响应。这个模型可以是连续的或离散的,和单输入单输出或多输入多输出。多端输入系统的阶跃响应对于每一个输入方式来说都是阶跃响应的集合。模拟持续的时间根据系统的极点和零点自动地被确定。 

3.step(sys,Tfinal):模拟了系统sys从时间t=0到t=Tfinal的阶跃响应。在系统时间单位中,表达式Tfinal在sys的时间单位属性中是被指定的。对于未指定采样时间(Ts=1)的离散时间系统, 阶跃将Tfinal作为采样周期的数量来模拟。 

4.step(sys,t):使用用户提供的时间矢量t来模拟。在系统时间单位中,表达式t在sys的时间单位属性中是指定的。对于离散时间模型,t应该是Ti:Ts:Tf,这里Ts是采样时间。对于持续的时间模型,t应该是Ti:dt:Tf,这里dt变成近似于持续系统的一个离散采样。阶跃命令总是适用于在t=0时的阶跃输入,而忽视Ti。

 5.在一个图上画出一系列模型sys1,sys2,...sysN的阶跃响应:

 step(sys1,sys2,...,sysN); 

step(sys1,sys2,...,sysN,Tfinal); 

step(sys1,sys2,...,sysN,t); 

所有将被画在一个图上的系统必须有相同数量的输入和输出。当然也可以在一个单一的图上画连续时间系统和离散时间系统的混合。这个语法对于比较多个系统的阶跃响应是有用的。 

6.你也可以给每个系统指定一个独特的颜色,线型,标记,或者三者都有。例如: step(sys1,'y:',sys2,'g--'); 当调用输出参数时: 

y = step(sys,t); 

[y,t] = step(sys); 

[y,t] = step(sys,Tfinal);  

[y,t,x] = step(sys); 

step返回输出响应y,模拟时间向量t(如果没有作为一个输入参数被提供)和状态轨迹x(仅为状态空间模型)。在屏幕上没有绘图生成。对于单输入系统来说,y有和采样时间一样多的行,和输出一样多的列。在多端输入的情况下,每个输入方式的阶跃响应沿着输出y的第三个维度被累积起来。这时y的维度是: 

(length of t)*(number of outputs)*(number of inputs);

 y(:,:,j)在第j个输入方式对于加入的单位阶跃命令给出了响应。同样的,x的维度是: 

(length of t)*(number of outputs)*(number of inputs)。 

7.对于识别模型[y,t,x,ysd]=step(sys)也可以计算响应y的标准偏差ysd(如果sys没有包含协方差参数信息,ysd将是空的)。

 8.[y,...] = step(sys,...,options):计算指定的附加选项的阶跃响应,如阶跃振幅或输入偏移量。

 

feedback()函数:

feedback(G,H),(G,H需事先设定)。其中G是传递函数,H为反馈函数,表示一个控制系统G,对其进行负反馈H(要求正反馈用-H)。这是基本命令格式,如果求响应,可以用形如step(feedback(G,H))的命令。

 

matlab的函数用法会持续更新的,下面附上PID控制器代码和响应曲线

 

 


% 原系统
n =[1 3 2];
t = [0:0.01:10];
d1 =2;
G = tf(d1,n);
g = feedback(G, 1);
y =step(g, t);
plot(t, y);
if ishold~=1,hold on ,end

% KP
d = [2];
n = [1 3 2];
t = [0:0.01:10];
Kp = 10;
d1 = Kp*d;
G = tf(d1, n);
g = feedback(G, 1);
y = step(g, t);
plot(t,y);
if ishold~=1,hold on ,end

% PD
t = [0:0.01:10];
n =[1 3 2];
Kd = 0.1;
Kp = 10;
d=[2*Kd*Kp, 2*Kp];
g0=tf(d,n);
g=feedback(g0,1);
y=step(g,t);
plot(t,y);
if ishold~=1,hold on ,end

% PI
t = [0:0.01:10];
n =[1 3 2 0];
Ki = 0.8;
Kp = 10;
d = [2*Kp, 2*Ki*Kp];
g0 = tf(d,n);
g = feedback(g0,1);
y = step(g,t);
plot(t,y);
if ishold~=1,hold on ,end

% PID
t = [0:0.01:10];
n =[1 3 2 0];
Ki = 0.8;
Kd = 0.4;
Kp = 10;
d = [2*Kp*Kd, 2*Kp, 2*Ki*Kp];
g0 = tf(d,n);
g = feedback(g0,1);
y = step(g,t);
plot(t,y);
if ishold~=1,hold on ,end

grid on

 

 

分析:

        1.单独的KP控制会使系统震荡,达到稳态的时候会有一定的稳态误差。

        2.PD控制会减少超调量,并且也会减少一定的稳态误差,但是不能消除误差。

        3.PI控制会增大超调量,可以完全消除稳态误差(积分环节,提高型别),但是调节时间会加长。

        4.PID控制结果比较令人满意,但是需要不断地调KP,KD,KI的参数。

 

 

 

 

 

 

 

 

 

 

 

                            厚积才能薄发,Jocker愿和大家共同进步!

参考文章:

blog.sina.com.cn/s/blog_13dd6d82a0102vgz6.html

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值