目录

重点函数:

sys = tf(num, den)

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

 gain = dcgain(sys)

 info = stepinfo(sys)

 controller = pid(Kp,Ki,Kd)

 sys_cl = feedback(sys1,sys2)

任务一:求阶跃响应

任务二:比例控制

任务三:比例微分控制

任务四:比例积分控制

任务五:比例积分微分控制

 PID调参技巧

 曲线太多,查看不方便解决办法


重点函数:

sys = tf(num, den)

tf(num, den) 是指用于创建传递函数(transfer function)的函数。这种函数通常用于控制系统分析和设计中,用于描述输入和输出之间的关系。

在 MATLAB 或类似的数学计算环境中,numden 分别是传递函数的分子和分母多项式的系数。具体来说,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%。

曲线太多,查看不方便解决办法

Matlab图窗曲线太多,标签颜色分辨度不高的解决方法_matlab 多条曲线标注不清晰_^存的博客-CSDN博客

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐