自动控制原理学习自动控制原理学习自动控制原理学习
立即下载
资源介绍:
自动控制原理学习自动控制原理学习自动控制原理学习
% 位置式pid,增加了积分分离的机制(积分分离单独的函数参考intergral_separation_PID.m函数)。重点在于积分分离最大误差数值确定、输出限制的最大误差确定
% 设一被控对象G(s)=523500/(s^3+87.35s^2+10470S)
%采样时间为1ms,采用z变换进行离散化
clc
clear
ts=0.001; %采样时间
sys=tf(523500,[1 87.35 10470 0]); %tf是传递函数 即被控对象函数G;
dsys=c2d(sys,ts,'z'); %把控制函数离散化取Z变换n阶定常离散系统差分方程
%在零初始条件下取Z变换:
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');% 离散化后提取分子、分母,‘v'的作用是输出向量的形式,若没有v的话则输出类型为cell形式
[num1,den1] = tfdata(dsys);% 离散化后提取分子、分母
u_1=0.0; u_2=0.0; u_3=0.0; %z变换之后的系数
y_1=0.0; y_2=0.0; y_3=0.0;
x=[0,0,0]'; %分别误差e,误差e的差分,误差e的积分
error_1=0; %上一时刻误差
time=zeros(1,1000); %预分配内存
yd=zeros(1,1000);
u=zeros(1,1000);
y=zeros(1,1000);
error=zeros(1,1000);
gain_output = zeros(1, 1000);
diffiential_output = zeros(1, 1000);
intergral_output = zeros(1, 1000);
test_variable = zeros(1, 1000);
index = 1;
errorsum = 0;
errorsumMax = 1;
errorSingle = 0;
errorsingle_max = 0.5;
for k=1:1:1000
time(k)=k*ts;%离散化的时间代表连续时间
yd(k)=1.0; %目标量
kp=0.6;
ki=0.006;
kd=0.0;
u(k)=kp*x(1)+kd*x(2)+index * ki*errorsum; %PID输出
gain_output(k) = kp*x(1);
diffiential_output(k) = kd*x(2);
intergral_output(k) = index * ki * errorsum;
% 控制器输出限幅
if u(k)>=10
u(k)=10;
end
if u(k)<=-10
u(k)=-10;
end
%Linear model 难点就是把传递函数转化为差分方程,以实现PID控制。
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;
%实际输出 num为dsys分子多项式系数,den为dsys分母多项式系数,从n阶定常离散系统差分方程变化来的。
error(k)=yd(k)-y(k); % 误差=输入-输出
u_3=u_2;
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_3=y_2;
y_2=y_1; %保存上上次次输出 为下次计算
y_1=y(k); %保存上一次输出 为下次计算
x(1)=error(k); %KP的系数
errorSingle = error(k);
x(2)=(error(k)-error_1)/ts; %KD的系数
% x(3)=x(3)+error(k)*ts; %KI的系数,总的误差累积
error_1=error(k);
% errorsum = x(3);
if errorsum > errorsumMax
if errorSingle > errorsingle_max
index = 0;
elseif errorSingle < 0
errorsum = errorsum + errorSingle*ts;
end
elseif errorsum < (-1*errorsumMax)
if errorSingle < (-1*errorsingle_max)
index = 0;
elseif errorSingle > 0
errorsum = errorsum + errorSingle*ts;
end
else
errorsum = errorsum + errorSingle*ts;
end
test_variable(k) = errorsum;
end
figure(1);
plot(time,yd,'b',time,y,'r'); %输入和实际控制输出
xlabel('time(s)'),ylabel('y,yd');
title('输入/输出图像对比')
figure(2);
plot(time,error,'r') %时间误差输出曲线
xlabel('time(s)');ylabel('error');
title('误差变化')
figure(3);
plot(time, test_variable,'r') %时间误差输出曲线
xlabel('time(s)');ylabel('errorsum');
title('误差总的累积')
figure(4);
plot(time, intergral_output,'r') % PID中积分项输出
xlabel('time(s)');ylabel('intergral_output');
title('PID中积分项输出')
figure(5);
plot(time, gain_output,'r') % PID中比例项输出
xlabel('time(s)');ylabel('gain_output');
title('PID中比例项输出');
figure(6);
plot(time, diffiential_output,'r') % PID中微分项输出
xlabel('time(s)');ylabel('diffiential_output');
title('PID中微分项输出');