%PID Controler with intergration sturation clear all; close all; ts=0.001; sys=tf(5.235e005,[1,87.35,1.047e004,0]); dsys=c2d(sys,ts,'z'); [num,den]=tfdata(dsys,'v'); u_1=0.0;u_2=0.0;u_3=0.0; y_1=0;y_2=0;y_3=0; x=[0,0,0]'; error_1=0; um=6; kp=0.85;ki=9.0;kd=0.0; for k=1:1:800 time(k)=k*ts; yd(k)=30; %Step Signal u(k)=kp*x(1)+kd*x(2)+ki*x(3); % PID Controller if u(k)>=um u(k)=um; end if u(k)<=-um u(k)=-um; end %Linear model y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3; error(k)=yd(k)-y(k); M=2; if M==1 %Using intergration sturation if u(k)>=um if error(k)>0 alpha=0; else alpha=1; end elseif u(k)<=-um if error(k)>0 alpha=1; else alpha=0; end else alpha=1; end elseif M==2 %Not using intergration sturation alpha=1; end %Return of PID parameters u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=y(k); error_1=error(k); x(1)=error(k); % Calculating P x(2)=(error(k)-error_1)/ts; % Calculating D x(3)=x(3)+alpha*error(k)*ts; % Calculating I xi(k)=x(3); end figure(1); subplot(311); plot(time,yd,'r',time,y,'k:','linewidth',2); xlabel('time(s)');ylabel('yd,y'); legend('Ideal position signal','Position tracking'); subplot(312); plot(time,u,'r','linewidth',2); xlabel('time(s)');ylabel('Control input'); subplot(313); plot(time,xi,'r','linewidth',2); xlabel('time(s)');ylabel('Integration');详细注释一下这段代码
时间: 2023-12-07 11:04:57 浏览: 147
PID控制算法的理论教程,有例题
这段代码实现了一个带有积分饱和的PID控制器,用于将系统输出跟踪给定的步变信号。下面是每个变量和代码块的注释:
```matlab
clear all; close all; % 清空工作空间和关闭所有图形窗口
ts=0.001; % 采样时间
sys=tf(5.235e005,[1,87.35,1.047e004,0]); % 定义系统传递函数
dsys=c2d(sys,ts,'z'); % 将系统离散化
[num,den]=tfdata(dsys,'v'); % 提取系统离散化后的分子分母多项式系数
u_1=0.0; u_2=0.0; u_3=0.0; % 控制器输出的历史值
y_1=0; y_2=0; y_3=0; % 系统输出的历史值
x=[0,0,0]'; % PID控制器状态变量, x(1)为P项, x(2)为D项, x(3)为I项
error_1=0; % 前一时刻的误差值
um=6; % 控制器输出幅值限制
kp=0.85; % 比例系数
ki=9.0; % 积分系数
kd=0.0; % 微分系数
for k=1:1:800
time(k)=k*ts; % 时间向量
yd(k)=30; % 设定系统输出的目标值为一个步变信号
u(k)=kp*x(1)+kd*x(2)+ki*x(3); % 计算PID控制器的输出
if u(k)>=um
u(k)=um; % 控制器输出幅值限制
end
if u(k)<=-um
u(k)=-um; % 控制器输出幅值限制
end
y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3; % 计算系统的输出
error(k)=yd(k)-y(k); % 计算当前时刻的误差值
M=2; % 控制器类型,1为带有积分饱和的PID控制器,2为普通PID控制器
if M==1 % 使用积分饱和
if u(k)>=um
if error(k)>0
alpha=0;
else
alpha=1;
end
elseif u(k)<=-um
if error(k)>0
alpha=1;
else
alpha=0;
end
else
alpha=1;
end
elseif M==2 % 不使用积分饱和
alpha=1;
end
u_3=u_2; u_2=u_1; u_1=u(k); % 更新历史输出
y_3=y_2; y_2=y_1; y_1=y(k); % 更新历史输出
error_1=error(k); % 更新历史误差值
x(1)=error(k); % 计算P项
x(2)=(error(k)-error_1)/ts; % 计算D项
x(3)=x(3)+alpha*error(k)*ts; % 计算I项
xi(k)=x(3); % 将I项的值保存到xi向量中
end
% 绘制输出图形
figure(1);
subplot(311); plot(time,yd,'r',time,y,'k:','linewidth',2); xlabel('time(s)');ylabel('yd,y'); legend('Ideal position signal','Position tracking');
subplot(312); plot(time,u,'r','linewidth',2); xlabel('time(s)');ylabel('Control input');
subplot(313); plot(time,xi,'r','linewidth',2); xlabel('time(s)');ylabel('Integration');
```
阅读全文