200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 基于Matlab的控制系统仿真(质量块弹簧阻尼器系统PID控制器设计)

基于Matlab的控制系统仿真(质量块弹簧阻尼器系统PID控制器设计)

时间:2019-07-03 12:21:57

相关推荐

基于Matlab的控制系统仿真(质量块弹簧阻尼器系统PID控制器设计)

目录

重点函数:

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)

其中参数含义:

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 = [];%设置KpKp = 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博客

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。