%PID Controller with changing integration rate clear all; close all; %Big time delay Plant ts=20; sys=tf([1],[60,1],'inputdelay',80); dsys=c2d(sys,ts,'zoh'); [num,den]=tfdata(dsys,'v'); u_1=0;u_2=0;u_3=0;u_4=0;u_5=0; y_1=0;y_2=0;y_3=0; error_1=0;error_2=0; ei=0; for k=1:1:200 time(k)=k*ts; yd(k)=1.0; %Step Signal %Linear model y(k)=-den(2)*y_1+num(2)*u_5; error(k)=yd(k)-y(k); kp=0.45;kd=12;ki=0.0048; A=0.4;B=0.6; %T type integration ei=ei+(error(k)+error_1)/2*ts; M=2; if M==1 %Changing integration rate if abs(error(k))<=B f(k)=1; elseif abs(error(k))>B&abs(error(k))<=A+B f(k)=(A-abs(error(k))+B)/A; else f(k)=0; end elseif M==2 %Not changing integration rate f(k)=1; end u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*f(k)*ei; if u(k)>=10 u(k)=10; end if u(k)<=-10 u(k)=-10; end %Return of PID parameters u_5=u_4;u_4=u_3;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_2=error_1; error_1=error(k); end figure(1); plot(time,yd,'r',time,y,'k:','linewidth',2); xlabel('time(s)');ylabel('yd,y'); legend('Ideal position signal','Position tracking'); figure(2); plot(time,f,'r','linewidth',2); xlabel('time(s)');ylabel('Integration rate f');详细注释一下这段代码
时间: 2023-12-07 14:04:57 浏览: 190
这段代码是一个使用PID控制器的闭环控制系统,用于跟踪一个步进信号。接下来对代码进行详细注释:
首先,导入所需的库和清空变量:
```matlab
clear all;
close all;
```
然后,定义系统模型,使用输入延迟80和60的一阶传递函数:
```matlab
ts=20;
sys=tf([1],[60,1],'inputdelay',80);
dsys=c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');
```
接下来,定义初始化变量:
```matlab
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;
y_1=0;y_2=0;y_3=0;
error_1=0;error_2=0;
ei=0;
```
然后,开始进行控制循环:
```matlab
for k=1:1:200
time(k)=k*ts;
yd(k)=1.0; %Step Signal
%Linear model
y(k)=-den(2)*y_1+num(2)*u_5;
error(k)=yd(k)-y(k);
%PID Parameters
kp=0.45;kd=12;ki=0.0048;
A=0.4;B=0.6;
%T type integration
ei=ei+(error(k)+error_1)/2*ts;
%Changing integration rate
M=2;
if M==1
if abs(error(k))<=B
f(k)=1;
elseif abs(error(k))>B&abs(error(k))<=A+B
f(k)=(A-abs(error(k))+B)/A;
else
f(k)=0;
end
%Not changing integration rate
elseif M==2
f(k)=1;
end
%PID Control
u(k)=kp*error(k)+kd*(error(k)-error_1)/ts+ki*f(k)*ei;
%Limit output
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Return of PID parameters
u_5=u_4;u_4=u_3;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_2=error_1; error_1=error(k);
end
```
循环中,首先计算当前的时间和期望输出信号`yd`。然后使用线性模型计算当前的实际输出信号`y`和误差`error`。接下来,定义PID控制器的参数,并使用T型积分计算当前积分误差`ei`。然后根据选择的积分变化模型,计算当前的积分率`f`。最后,使用PID控制计算当前的控制量`u`,并限制在-10到10之间。最后,更新历史参数并进行下一次循环。
最后,使用两个图形窗口绘制输出信号和积分率变化:
```matlab
figure(1);
plot(time,yd,'r',time,y,'k:','linewidth',2);
xlabel('time(s)');ylabel('yd,y');
legend('Ideal position signal','Position tracking');
figure(2);
plot(time,f,'r','linewidth',2);
xlabel('time(s)');ylabel('Integration rate f');
```
第一个图形绘制期望输出信号和实际跟踪信号,第二个图形绘制积分率变化。
阅读全文