目录
重点函数:
sys = tf(num, den)
tf(num, den)
是指用于创建传递函数(transfer function)的函数。这种函数通常用于控制系统分析和设计中,用于描述输入和输出之间的关系。
在 MATLAB 或类似的数学计算环境中,num
和 den
分别是传递函数的分子和分母多项式的系数。具体来说,num
是分子多项式的系数,den
是分母多项式的系数。这些系数用于描述传递函数的特性,从而分析和设计控制系统。例子如下:
num = [1]; % 分子多项式的系数,例如 1 的系数为 [1]
den = [1, 10, 20]; % 分母多项式的系数,例如 s^2 + 10s + 20 的系数为 [1 10 20]
sys = tf(num, den); % 创建传递函数对象
[y, t] = step(sys, t)
step(sys, t)
是用于计算传递函数 sys
对于给定时间向量 t
的阶跃响应。阶跃响应是在系统输入发生单位阶跃变化时系统的输出响应。
sys
是之前通过 tf(num, den)
创建的传递函数对象,而 t
是一个时间向量,表示您要模拟的时间范围。step(sys, t)
函数将返回在时间向量 t
上的系统的输出响应,也就是阶跃响应。例子如下:
num = [1]; % 分子多项式的系数,例如 1 的系数为 [1]
den = [1, 10, 20]; % 分母多项式的系数,例如 s^2 + 10s + 20 的系数为 [1 10 20]
sys = tf(num, den); % 创建传递函数对象
t = 0:0.1:5; % 时间范围从 0 到 5,步长为 0.1
[y, t] = step(sys, t); % 计算阶跃响应
% 绘制阶跃响应曲线
plot(t, y);
xlabel('时间');
ylabel('响应');
title('传递函数的阶跃响应');
gain = dcgain(sys)
dcgain(sys)
是用于计算传递函数 sys
的直流增益(DC gain)的函数。
直流增益是指在频率为零时,传递函数的增益值。它反映了系统在稳态下对于恒定输入的放大倍数。直流增益对于分析系统的稳定性和性能非常重要。
info = stepinfo(sys)
stepinfo(sys)
是用于计算传递函数 sys
的阶跃响应的一些性能指标的函数。这些性能指标包括上升时间、峰值时间、超调量、稳态误差等,这些指标可以帮助您评估系统的响应特性。例子如下:
num = [1]; % 分子多项式的系数,例如 1 的系数为 [1]
den = [1, 10, 20]; % 分母多项式的系数,例如 s^2 + 10s + 20 的系数为 [1 10 20]
sys = tf(num, den); % 创建传递函数对象
info = stepinfo(sys); % 计算阶跃响应性能指标
disp(info)
其中参数含义:
参数 | 含义 | 注释 |
RiseTime | 上升时间 | 上升到 90% 的时间,单位为秒 |
TransientTime | 过渡时间 | |
SettlingTime | 稳态时间 | 系统在某个误差范围内首次进入并保持的时间,单位为秒 |
SettlingMin | 稳定最小值 | 系统稳定后的最小值 |
SettlingMax | 稳定最大值 | 系统稳定后的最大值 |
Overshoot | 超调量 | 系统响应相对于最终值的最大超过量,以百分比表示 |
Undershoot | 欠冲量 | 系统响应低于最终值的最大量,以百分比表示 |
Peak | 峰值 | 表示系统响应的最大值 |
PeakTime | 峰值时间 | 系统响应的最大峰值出现的时间,单位为秒 |
controller = pid(Kp,Ki,Kd)
pid(Kp,Ki,Kd)
函数是MATLAB中用于创建PID(比例-积分-微分)控制器对象的函数。PID控制器是一种常见的控制器类型,用于调节系统的性能,以使其达到期望的响应。
调用pid(Kp, Ki, Kd)
函数会返回一个PID控制器对象,该对象可以用于构建闭环控制系统。通过将PID控制器对象与系统传递函数相乘,可以创建一个带有PID控制的闭环系统。例子如下:
% 创建PID控制器对象
Kp = 1.0;
Ki = 0.5;
Kd = 0.2;
controller = pid(Kp, Ki, Kd);
% 打印PID控制器对象的详细信息
disp(controller);
sys_cl = feedback(sys1,sys2)
sys_cl = feedback(sys1,sys2)
函数是用于创建闭环系统的MATLAB函数。在控制系统中,闭环反馈是一种常见的控制策略,用于调节系统的性能和稳定性。
任务一:求阶跃响应
用MATLAB编程求开环阶跃响应,并可视化其响应曲线,写出被控对象的传递函数的直流增益、单位阶跃输入的最终值上升时间和稳定时间。
clear;
close all;
m = 1;
b = 10;
k = 20;
F = 1;
num = [1]; % 分子多项式系数
den = [m b k]; % 分母多项式系数
sys = tf(num, den); % 创建传递函数模型
% 计算开环阶跃响应
t = 0:0.01:5;
[y, t] = step(sys, t);
% 可视化开环阶跃响应
figure;
plot(t, y);
title('开环阶跃响应');
xlabel('Time');
ylabel('Output');
grid on;
% 计算传递函数的直流增益
gain = dcgain(sys);
% 计算单位阶跃输入的最终值
final_value = y(end);
% 计算单位阶跃性能指标
info = stepinfo(sys);
% 显示结果
disp(['直流增益: ', num2str(gain)]);
disp(['最终值: ', num2str(final_value)]);
disp(['上升时间: ', num2str(info.RiseTime)]);
disp(['稳定时间: ', num2str(info.SettlingTime)]);
任务二:比例控制
用MATLAB编程,调节的 值,减小原系统上升时间,稳定时间和稳态误差,将阶跃响应曲线可视化,写出 的最佳范围。
clear;
close all;
m = 1;
b = 10;
k = 20;
F = 1;
num = [1]; % 分子多项式系数
den = [m b k]; % 分母多项式系数
sys = tf(num, den); % 创建被控对象传递函数模型
% 显示被控对象传递函数模型参数
disp('sys Controller Parameters:');
disp(sys);
% 初始化阶跃响应数据
t = 0:0.01:5;
y_data = [];
% 设置Kp值范围
Kp_range = 10: 5: 100;
% 初始化存储变量
rise_time = zeros(size(Kp_range));
settling_time = zeros(size(Kp_range));
steady_state_error = zeros(size(Kp_range));
% 循环遍历不同的Kp值
for i = 1:length(Kp_range)
Kp = Kp_range(i);
% 设计控制器
controller = pid(Kp);
% 创建闭环系统
sys_cl = feedback(controller * sys, 1);
% 获取阶跃响应数据
[y, ~] = step(sys_cl, t);
y_data = [y_data, y];
% 计算阶跃响应特性
step_info = stepinfo(sys_cl);
% 存储阶跃响应特性
rise_time(i) = step_info.RiseTime;
settling_time(i) = step_info.SettlingTime;
% 计算稳态误差
steady_state_error(i) = 1 - dcgain(sys_cl);
end
% 可视化阶跃响应曲线
figure;
plot(t, y_data);
xlabel('Time');
ylabel('Output');
title('Step Response for Different Kp Values');
legend(cellstr(num2str(Kp_range', 'Kp = %0.1f')));
grid on;
% 绘制阶跃响应特性
figure;
subplot(3, 1, 1);
plot(Kp_range, rise_time, 'b');
xlabel('Kp');
ylabel('Rise Time');
title('Rise Time');
subplot(3, 1, 2);
plot(Kp_range, settling_time, 'r');
xlabel('Kp');
ylabel('Settling Time');
title('Settling Time');
subplot(3, 1, 3);
plot(Kp_range, steady_state_error, 'g');
xlabel('Kp');
ylabel('Steady State Error');
title('Steady State Error');
任务三:比例微分控制
用MATLAB编程,调节的 值,减少超调和稳定时间,将阶跃响应曲线可视化。
clear;
close all;
m = 1;
b = 10;
k = 20;
F = 1;
num = [1]; % 分子多项式系数
den = [m b k]; % 分母多项式系数
sys = tf(num, den); % 创建被控对象传递函数模型
% 显示被控对象传递函数模型参数
disp('sys Controller Parameters:');
disp(sys);
% 初始化阶跃响应数据
t = 0:0.01:5;
y_data = [];
%设置Kp
Kp = 21;
% 设置Kd值范围
Kd_range = 0: 1: 10;
% 初始化存储变量
rise_time = zeros(size(Kd_range));
settling_time = zeros(size(Kd_range));
steady_state_error = zeros(size(Kd_range));
Overshoot = zeros(size(Kd_range));
% 循环遍历不同的Kd值
for i = 1:length(Kd_range)
Kd = Kd_range(i);
% 设计控制器
controller = pid(Kp,0,Kd);
% 创建闭环系统
sys_cl = feedback(controller * sys, 1);
% 获取阶跃响应数据
[y, ~] = step(sys_cl, t);
y_data = [y_data, y];
% 计算阶跃响应特性
step_info = stepinfo(sys_cl);
% 存储阶跃响应特性
rise_time(i) = step_info.RiseTime;
settling_time(i) = step_info.SettlingTime;
Overshoot(i) = step_info.Overshoot;
% 计算稳态误差
steady_state_error(i) = 1 - dcgain(sys_cl);
end
% 可视化阶跃响应曲线
figure;
plot(t, y_data);
xlabel('Time');
ylabel('Output');
title('Step Response for Different Kp Values');
legend(cellstr(num2str(Kd_range', 'Kp = %0.1f')));
grid on;
% 绘制阶跃响应特性
figure;
subplot(4, 1, 1);
plot(Kd_range, rise_time, 'b');
xlabel('Kp');
ylabel('Rise Time');
title('Rise Time');
subplot(4, 1, 2);
plot(Kd_range, settling_time, 'r');
xlabel('Kp');
ylabel('Settling Time');
title('Settling Time');
subplot(4, 1, 3);
plot(Kd_range, steady_state_error, 'g');
xlabel('Kp');
ylabel('Steady State Error');
title('Steady State Error');
subplot(4, 1, 4);
plot(Kd_range, Overshoot, 'g');
xlabel('Kp');
ylabel('Overshoot');
title('Overshoot');
任务四:比例积分控制
用MATLAB编程,调节 和 参数,消除稳态误差,并可视化其阶跃响应曲线。
clear;
close all;
m = 1;
b = 10;
k = 20;
F = 1;
num = [1]; % 分子多项式系数
den = [m b k]; % 分母多项式系数
sys = tf(num, den); % 创建被控对象传递函数模型
% 显示被控对象传递函数模型参数
disp('sys Controller Parameters:');
disp(sys);
% 初始化阶跃响应数据
t = 0:0.01:5;
y_data = [];
Kp = 80;
% 设置Ki值范围
Ki_range = 100: 10: 250;
% 初始化存储变量
rise_time = zeros(size(Ki_range));
settling_time = zeros(size(Ki_range));
steady_state_error = zeros(size(Ki_range));
Overshoot = zeros(size(Ki_range));
% 循环遍历不同的Kd值
for i = 1:length(Ki_range)
Ki = Ki_range(i);
% 设计控制器
controller = pid(Kp,Ki,0);
% 创建闭环系统
sys_cl = feedback(controller * sys, 1);
% 获取阶跃响应数据
[y, ~] = step(sys_cl, t);
y_data = [y_data, y];
% 计算阶跃响应特性
step_info = stepinfo(sys_cl);
% 存储阶跃响应特性
rise_time(i) = step_info.RiseTime;
settling_time(i) = step_info.SettlingTime;
Overshoot(i) = step_info.Overshoot;
% 计算稳态误差
steady_state_error(i) = 1 - dcgain(sys_cl);
end
% 可视化阶跃响应曲线
figure;
plot(t, y_data);
xlabel('Time');
ylabel('Output');
title('Step Response for Different Ki Values');
legend(cellstr(num2str(Ki_range', 'Ki = %0.1f')));
grid on;
% 绘制阶跃响应特性
figure;
subplot(4, 1, 1);
plot(Ki_range, rise_time, 'b');
xlabel('Kp');
ylabel('Rise Time');
title('Rise Time');
subplot(4, 1, 2);
plot(Ki_range, settling_time, 'r');
xlabel('Kp');
ylabel('Settling Time');
title('Settling Time');
subplot(4, 1, 3);
plot(Ki_range, steady_state_error, 'g');
xlabel('Kp');
ylabel('Steady State Error');
title('Steady State Error');
subplot(4, 1, 4);
plot(Ki_range, Overshoot, 'g');
xlabel('Kp');
ylabel('Overshoot');
title('Overshoot');
任务五:比例积分微分控制
用MATLAB编程,调节 、 和 参数,使设计的系统没有超调,上升时间快且没有稳态误差,并可视化其阶跃响应曲线。
clear;
close all;
m = 1;
b = 10;
k = 20;
F = 1;
num = [1]; % 分子多项式系数
den = [m b k]; % 分母多项式系数
sys = tf(num, den); % 创建被控对象传递函数模型
% 显示被控对象传递函数模型参数
disp('sys Controller Parameters:');
disp(sys);
% 初始化阶跃响应数据
t = 0:0.01:5;
y_data = [];
Kp = 80;
ki = 160;
% 设置Kd值范围
Kd_range = 1: 0.5: 8; %6.5
% 初始化存储变量
rise_time = zeros(size(Kd_range));
settling_time = zeros(size(Kd_range));
steady_state_error = zeros(size(Kd_range));
Overshoot = zeros(size(Kd_range));
% 循环遍历不同的Kd值
for i = 1:length(Kd_range)
Kd = Kd_range(i);
% 设计控制器
controller = pid(Kp,ki,Kd);
% 创建闭环系统
sys_cl = feedback(controller * sys, 1);
% 获取阶跃响应数据
[y, ~] = step(sys_cl, t);
y_data = [y_data, y];
% 计算阶跃响应特性
step_info = stepinfo(sys_cl);
% 存储阶跃响应特性
rise_time(i) = step_info.RiseTime;
settling_time(i) = step_info.SettlingTime;
Overshoot(i) = step_info.Overshoot;
% 计算稳态误差
steady_state_error(i) = 1 - dcgain(sys_cl);
end
% 可视化阶跃响应曲线
figure;
plot(t, y_data);
xlabel('Time');
ylabel('Output');
title('Step Response for Different Kd Values');
legend(cellstr(num2str(Kd_range', 'Kd = %0.1f')));
grid on;
% 绘制阶跃响应特性
figure;
subplot(4, 1, 1);
plot(Kd_range, rise_time, 'b');
xlabel('Kp');
ylabel('Rise Time');
title('Rise Time');
subplot(4, 1, 2);
plot(Kd_range, settling_time, 'r');
xlabel('Kp');
ylabel('Settling Time');
title('Settling Time');
subplot(4, 1, 3);
plot(Kd_range, steady_state_error, 'g');
xlabel('Kp');
ylabel('Steady State Error');
title('Steady State Error');
subplot(4, 1, 4);
plot(Kd_range, Overshoot, 'g');
xlabel('Kp');
ylabel('Overshoot');
title('Overshoot');
PID调参技巧
先内环再外环;先空载再带载。
比例积分PID控制可解决大多数系统。
1、确定比例系数Kp:
确定比例增益Kp时,首先去掉PID的积分项和微分项。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益Kp,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益Kp,设定PID的比例增益Kp为当前值的60%~70%。比例增益Kp调试完成。
2、确定积分系数Ki:
比例增益Kp确定后,设定一个较小的积分时间常数Ki的初值,然后逐渐加大Ki ,直至系统出现振荡,之后在反过来,逐渐减小Ki,直至系统振荡消失。记录此时的Ki,设定PID的积分系数Ki为当前值的50%~66%。积分时间常数Ki调试完成。
3、确定微分系数Kd:
微分时间常数Kd一般不用设定,为0即可。若要设定,与确定Kp和Ki的方法相同,取不振荡时的30%。