DDC单回路PID控制实验的matlab实现

博主分享了学习自动控制原理的过程,使用MATLAB进行离散化转换(Tustin变换、一阶向前和向后差分),并绘制了不同参数下的阶跃响应曲线。此外,还探讨了PID控制器的设计,通过调整PID参数观察系统响应,展示了如何通过迭代计算得到响应曲线,并分析了不同参数对系统性能的影响。
摘要由CSDN通过智能技术生成

写在前面,最近在学自动控制原理,正巧我一个朋友遇见了如下问题,起初以为只是把网上搜到的C代码重构一下能跑就行,没想到我的C语言基础不足以支持我修复这个漏洞百出的脚本,索性就在matlab重新写了。

以下是我的完成过程,自动控制菜鸟,欢迎交流
原问题:
DDC单回路PID控制实验要求

原答案出处:https://www.docin.com/p-1079784869.html
完成步骤:
1.将G(s)离散化为G(z)(Z变换)。
2.将G(z)改写出离散差分方程。
3.step阶跃,绘制激励-响应曲线。

在这里插入图片描述

4.改变T,R0,和差分方式观察区别。
5.构造系统PID控制器输出序列。
6.迭代计算得到响应曲线。
7.根据绘图现象修改PID参数。

PID实验附图:
Kp = 10;Ti = 0;Td = 0 无法收敛趋于无穷

Kp = 5;Ti = 5;Td = 0 开始收敛 但是最大超调量偏大 振荡明显且收敛慢
Kp = 5;Ti = 10;Td = 0; 开始收敛 但是最大超调量减小 振荡减弱且收敛变快
Kp = 5;Ti = 15;Td = 0收益已经不大
Kp = 5;Ti = 15;Td = 1 加入Td后 仿佛加入了阻尼 振荡果然有所减小
Kp = 5;Ti = 14.5;Td = 10; 微分Td的副作用显现 收敛变慢

Kp = 3.125;Ti = 14.5;Td = 3.625;

matlab代码如下:

   % tustin变换
% Author:HXF Time:2022.5.5 15:36
syms K1 T1 Ts s z % 定义符号变量
Gs = K1/(T1*s+1)^2
GZ = subs(Gs,s,2*(z-1)/Ts/(z+1)) %离散化  tustin变换
Gz = collect(GZ,z)  % 将表达式G2中的以z为变量合并相同次幂;

% 一阶向前差分

syms K1 T1 Ts s z % 定义符号变量
Gs = K1/(T1*s+1)^2
GZ = subs(Gs,s,(z-1)/Ts) %离散化  一阶向前差分
Gz = collect(GZ,z)  % 将表达式G2中的以z为变量合并相同次幂;

% 一阶向后差分
% 本实验采用一阶向后差分
syms K1 T1 Ts s z Yk Yk_1 Yk_2 Rk% 定义符号变量
Gs = K1/(T1*s+1)^2
GZ = subs(Gs,s,(1-1/z)/Ts) %离散化  一阶向后差分
Gz = collect(GZ,z)  % 将表达式G2中的以z为变量合并相同次幂;
[num,den]=numden(Gz)
a0 = 2*(T1/Ts)*(1+(T1/Ts))/(1+(T1/Ts)) ^2
b0 = -(T1/Ts)^2/(1+(T1/Ts)) ^2
c0 = K1/(1+(T1/Ts))^2
Yk = a0*Yk_1+b0*Yk_2+c0*Rk % 差分方程 

% 对象动态特性实验
clear,clc;
% 通过赋值将符号计算转化为数值计算
K1=1.0;T1=10.0;R0=1;
% 绘制matlab阶跃响应
G1=tf([K1],[T1^2 2*T1 1])
hold on
step(G1) % 连续传递函数阶跃响应曲线 T趋于0(R0=1)
step(2*G1) % 连续传递函数阶跃响应曲线 T趋于0(R0=2)

% G21=c2d(G1,0.5,'zoh') % 零阶保持器离散化 一个脉冲序列变成一个连续的阶梯信号
% G21=c2d(G1,0.5,'foh') % 一阶保持器离散化 讯号重建为分段线性近似原始讯号的函数

G21=c2d(G1,0.5,'foh') % 一阶保持器离散化
step(G21) % 离散传递函数阶跃响应曲线 % T=0.5 R0=1
step(2*G21) % 离散传递函数阶跃响应曲线 % T=0.5 R0=2

G22=c2d(G1,2,'foh') % 一阶保持器离散化
step(G22) % 离散传递函数阶跃响应曲线 % T=2 R0=1
step(2*G22) % 离散传递函数阶跃响应曲线 % T=2 R0=2

G23=c2d(G1,5,'foh')  % 一阶保持器离散化
step(G23) % 离散传递函数阶跃响应曲线 % T=5 R0=1
step(2*G23) % 离散传递函数阶跃响应曲线 % T=5 R0=2
hold off
legend('连续传递函数阶跃响应曲线 T趋于0 (R0=1)','连续传递函数阶跃响应曲线 T趋于0 (R0=2)', ...
    '离散传递函数阶跃响应曲线(T=0.5s R0=1)','离散传递函数阶跃响应曲线(T=0.5s R0=2)', ...
    '离散传递函数阶跃响应曲线(T=2s R0=1)','离散传递函数阶跃响应曲线(T=2s R0=2)', ...
    '离散传递函数阶跃响应曲线(T=5s R0=1)','离散传递函数阶跃响应曲线(T=5s R0=2)');
title('对象动态特性曲线');
xlabel('t/s');
ylabel('响应Y');

% 单回路PID控制实验
clear,clc;
% 可调整参数
L = 1; % 积分分离逻辑系数
T = 2; % 周期
% 逐步修改PID参数,观察各个参数对图像的影响

% % 只加入比例项 Kp
% Kp = 5;Ti = 0;Td = 0; % PID参数
% Kp = 10;Ti = 0;Td = 0; % PID参数
% Kp = 100;Ti = 0;Td = 0; % PID参数
% Kp = 1000;Ti = 0;Td = 0; % PID参数
% 无法收敛趋于无穷

% % 加入积分项 Ti
% Kp = 5;Ti = 0.1;Td = 0; % PID参数 
% Kp = 5;Ti = 1;Td = 0; % PID参数 
% Kp = 5;Ti = 5;Td = 0; % PID参数 
% % 开始收敛 但是最大超调量偏大 振荡明显且收敛慢
% Kp = 5;Ti = 10;Td = 0; % PID参数 
% % 开始收敛 但是最大超调量减小 振荡减弱且收敛变快
% Kp = 5;Ti = 15;Td = 0; % PID参数 
% % 收益已经不大

% % 加入微分项 Td 
% Kp = 5;Ti = 15;Td = 0.1; 
% Kp = 5;Ti = 15;Td = 1; % PID参数 加入Td后 仿佛加入了阻尼 振荡果然有所减小
% Kp = 5;Ti = 14.5;Td = 5; % PID参数 振荡继续减小
% Kp = 5;Ti = 14.5;Td = 10; % PID参数 微分Td的副作用显现 收敛变慢
% Kp = 10;Ti = 14.5;Td = 5; % PID参数 
Kp = 3.125;Ti = 14.5;Td = 3.625;
K1=1.0;T1=10.0;R0=1;
% PID控制器参数
a = Kp*(1+(T/Ti)*L+(Td/T))
b = -Kp*(1+2*(Td/T))
c = Kp*(Td/T)
% 差分方程参数
a0 = 2*(T1/T)*(1+(T1/T))/(1+(T1/T)) ^2
b0 = -(T1/T)^2/(1+(T1/T)) ^2
c0 = K1/(1+(T1/T))^2

G1=tf([K1],[T1^2 2*T1 1])
G2=c2d(G1,T,'foh')
[num,den]=tfdata(G2,'v')

e=zeros(1,1000);      %前一时刻的偏差      
Ee=zeros(1,1000);       %累积偏差
u=zeros(1,1000);    %前一时刻的控制量
y=zeros(1,1000);      %前一时刻的输出
r=ones(1,1000);        %期望值
u=zeros(1,1000);%预先分配内存
time=zeros(1,1000);%时刻点(设定1000个)
for k=1:1:1000
    
%     time(k)=(k)*T;   %时间参数
    if k==1
        e(k)=r(1)-y(1);
    else    
        e(k)=r(k)-y(k-1);  %误差信号
    end
    
    if k==1
        delta_u(k)=a*e(k);
    elseif k==2
        delta_u(k)=a*e(k)+b*e(k-1);
    else
        delta_u(k)=a*e(k)+b*e(k-1)+c*e(k-2); %系统PID控制器输出序列
    end
    
    if k==1
        Ee(k)=e(k);
    else       
        Ee(k)=Ee(k-1)+e(k);    %误差的累加和
    end

    if k==1
        u(k)=delta_u(k);
    else       
        u(k)=u(k-1)+delta_u(k);    	%前一个的控制器输入值
    end

    if k==1
        y(k)=c0*u(k);
    elseif k==2
        y(k)=a0*y(k-1)+c0*u(k);
    else
        y(k)=a0*y(k-1)+b0*y(k-2)+c0*u(k);%系统响应输出序列
    end
    
end
figure;
subplot 211
hold on
plot(u);plot(r);
hold off
legend('u(t)阶跃响应曲线','期望值');
title('PID控制u(t)阶跃响应曲线');
xlabel('t/s');
ylabel('响应u');

subplot 212
hold on
plot(y);plot(r);
hold off
legend('y(t)阶跃响应曲线','期望值');
title('PID控制y(t)阶跃响应曲线');
xlabel('t/s');
ylabel('响应Y');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值