自动控制原理学习笔记(六)—— 使用 MATLAB 求解二阶系统,PID 控制介绍

前几节笔记如下:

自动控制原理学习笔记(一)—— 控制介绍,一阶离散系统-CSDN博客

自动控制原理学习笔记(二)—— 一阶离散系统的通解,稳定性和收敛性-CSDN博客

自动控制原理学习笔记(三)—— 一阶线性定常离散系统与稳态误差-CSDN博客

自动控制原理学习笔记(四)—— 一阶系统的实验表征和 MATLAB 仿真-CSDN博客

自动控制原理学习笔记(五)—— 二阶离散系统,比例控制和 PD 控制-CSDN博客

一、使用 MATLAB 求解二阶系统

在上一节笔记中,我们介绍了二阶控制系统和三阶控制系统,并发现系统的稳定性取决于固有频率的大小,而固有频率则是由控制器参数 Kp 和 Kd 决定的。我们还发现固有频率可能为复数,因此通过人工计算、分析系统将十分麻烦。

我们依然使用上一节笔记中小车巡线的例子,但我们尝试使用 MATLAB 来解决问题。之前,我们计算过小车巡线的系统方程为:

首先,我们想提取出 “分子” 和 “分母” 项(具体原因要等到以后学习 Z 变换,这里我们参考第四节笔记的操作),于是:

num=[0,0,\Delta T^{2}\gamma VK_{p}+K_{d}\Delta TV\gamma,-K_{d}\Delta TV\gamma] 

den=[1,-2,1+\Delta T^{2}V\gamma K_{p}+K_{d}V\gamma\Delta T,-K_{d}V\gamma\Delta T]

情形 1 :比例控制

我们首先设置系统的参数值, 然后定义分子和分母。

% P 控制器
Kd = 0; Kp = 5; gamma = 1; V = 1; dt = 0.01;
num_kp = [0 0 (dT^2*gamma*V*Kp+Kd*dT*V*gamma) -Kd*dT*V*gamma];
den_kp = [1 -2 (1+dT^2*V*gamma*Kp+Kd*V*gamma*dT) -Kd*V*gamma*dT];

然后,我们实现整个控制系统,执行并得到阶跃响应:

% 计算时域解
close all; figure(1); hold on
subplot(1,2,1); hold on
sys_kp = tf(num_kp,den_kp,dT,'variable','z^-1');
step(sys_kp, 25)
title('比例(P)控制器')

MATLAB 绘制的时域解如下图所示:

上述仿真说明了使用 P 控制器,该系统不稳定。

情形 2 :比例-微分(PD)控制

其他初始条件保持不变,我们将 Kd 变成 1 ,于是代码如下:

% PD 控制器
Kd = 1;
subplot(1,2,2); hold on
num_kpd = [0 0 (dT^2*gamma*V*Kp+Kd*dT*V*gamma) -Kd*dT*V*gamma];
den_kpd = [1 -2 (1+dT^2*V*gamma*Kp+Kd*V*gamma*dT) -Kd*V*gamma*dT];
sys_kpd = tf(num_kpd,den_kpd,dT,'variable','z^-1');
step(sys_kpd, 25)
title('比例-微分(PD)控制器')

仿真结果如下图所示:

基于仿真结果,我们发现 PD 控制器能让系统稳定,且没有稳态误差。这意味着小车最终能够完美地沿着直线前进。接下来,我们想继续使用 MATLAB 分析系统的稳定性,并为该控制器选择最优的参数 Kp 和 Kd 。

根轨迹图

为了更好地分析该系统的稳定性,我们创建许多 Kp 和 Kd 的组合,并观察每一个组合对应的固有频率(固有频率为 “分母” 等于零时的根,即特征方程 / 齐次方程的根。具体原因要等到以后学习 Z 变换)。

在情形 1 中,我们令 Kd = 0 并令 Kp 在 1 到 10000 的范围内变化。在在情形 2 中,我们令 Kd = 20 并令 Kp 在 1 到 10000 的范围内变化。代码如下:

figure(2)
subplot(1,2,1); hold on; axis equal; axis([-1.2 1.2 -1.2 1.2])
th = linspace(0, 2*pi, 100)';
plot(cos(th)+sqrt(-1)*sin(th), '*r'); % 绘制一个单位圆
hold on

N_roots = 1000;
Kp_vec = linspace(0,10000,N_roots);
roots_mat = zeros(N_roots,3);
Kd = 0.0;
for i = 1:length(Kp_vec)
    polvc = [1 -2 (1+dT^2*V*gamma*Kp_vec(i)+Kd*V*gamma*dT) -Kd*V*gamma*dT];
    roots_mat(i,:) = roots(polvc);
end
plot(roots_mat,'.');
title('P 控制')

subplot(1,2,2); hold on; axis equal; axis([-1.2 1.2 -1.2 1.2])
th = linspace(0, 2*pi, 100)';
plot(cos(th)+sqrt(-1)*sin(th), '*r'); % 绘制一个单位圆
hold on

Kp_vec = linspace(0,10000,N_roots);
roots_mat = zeros(N_roots,3);
Kd = 20;
for i = 1:length(Kp_vec)
    polvc = [1 -2 (1+dT^2*V*gamma*Kp_vec(i)+Kd*V*gamma*dT) -Kd*V*gamma*dT];
    roots_mat(i,:) = roots(polvc);
end
plot(roots_mat,'.');
title('PD 控制')

仿真结果如下图所示:

 

在图像中,红色的圆表示复平面内的单位圆。在 P 控制中,无论我们如何选择 Kp,所有的固有频率全在单位圆外,因此该控制不稳定。在 PD 控制中,存在某些 Kp 使得所有固有频率都能够在单位圆内,因此该控制稳定。

给定 Kp 的范围,我们该如何选择最优值呢?我们选择令三个固有频率中的最大值取最小的 Kp 即可,该 Kp 能使系统收敛最快。

代码如下:

% 计算三个固有频率的模
mag_vec_1 = abs(roots_mat(:,1));
mag_vec_2 = abs(roots_mat(:,2));
mag_vec_3 = abs(roots_mat(:,3));

% 找到其中的最大值
cum_mag_vec = max([mag_vec_1, mag_vec_2, mag_vec_3],[],2);

% 找到其中的最小值
[~,ind] = min(cum_mag_vec);
Kp_min = Kp_vec(ind);

仿真结果如下图所示:

二、PID 控制介绍

虽然 PD 控制器可以让二阶系统甚至三阶系统稳定,但我们也要考虑一些问题。比如,该系统的稳态误差为多少?在本例中,稳态误差为 0 。然而,如果系统存在扰动 \beta (在现实生活中非常常见),则系统的稳态误差不为 0 。

我们该如何移除稳态误差呢?首先,我们考虑一下 PD 控制器是如何产生稳态误差的。该控制器的输出不能反映偏差的大小,假如偏差固定,即使数值很大,微分作用也没有输出,因而控制结果不能消除余差,如下图所示。

我们可以在控制器方程加入一项,来积攒控制过程中产生的全部误差。如果存在稳态误差,则该项非零,则控制器会朝着消除稳态误差的方向对系统控制。这一项也叫做 “积分” 。故 “PID”(比例-积分-微分)控制器的方程定义为:

c[n]=k_{p}e[n]+k_{d}\frac{e[n]-e[n-1]}{\Delta T}+k_{i}\Delta T\sum_{m=0}^{m=n}e[m]

其中误差方程定义为:

e[n]=d_{d}[n]-d[n]

现在我们要选择三个参数:kp ,kd 和 ki 。由于我们的控制器方程中多了 k_{i}\Delta T\sum_{m=0}^{m=n}e[m] 一项,求解系统方程将十分困难,我们暂时先告一段落。

迄今为止,我们都是通过各种时间平移和代换来直接求解系统方程。然而,当控制系统变得很复杂时我们依旧不能求解。此外,我们一直在分析系统的阶跃响应,系统在其它输入信号(斜坡,脉冲等等)下的响应又是什么样的呢?因此我们需要一个新工具 —— Z 变换。关于 Z 变换及相关知识,详见下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值