%-----------------位置式PID------------------%
e =[];e(1)=0;e(2)=0;e(3)=0;
u =[];u(1)=0;u(2)=0;
r =1; y =[];y(1)=0;for i =0:0.01:10e(3)= r -y(end);
deltau =0.5*(e(3)-e(2))+0.5*e(3)+0.05*(e(3)-2*e(2)+e(1));u(2)=u(1)+ deltau;
y =[y,u(2)];
e =[e(2:3),0];
u =[u(2),0];
end
figure(1)stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)xlim([0,1])ylim([0,1.5])xlabel('t')title('位置式PID')
增量式PID
这种适用于被控对象含有积分环节,像步进电机这种。
matlab仿真:
%-----------------增量式PID------------------%
e =[];e(1)=0;e(2)=0;e(3)=0;
u =[];u(1)=0;u(2)=0;
r =1; y =[];y(1)=0;for i =0:0.01:10e(3)= r -y(end);
deltau =0.4*(e(3)-e(2))+0.05*e(3)+0*(e(3)-2*e(2)+e(1));u(2)= deltau;
y =[y,u(2)];
e =[e(2:3),0];
u =[u(2),0];
end
figure(2)stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)xlim([0,1])ylim([0,1.5])xlabel('t')title('增量式PID')
%-----------------积分分离PID------------------%
e =[]; key =0;e(1)=0;e(2)=0;e(3)=0;
u =[];u(1)=0;u(2)=0;
r =1; y =[];y(1)=0;for i =0:0.01:10e(3)= r -y(end);ifabs(e(3))<0.7 key =1;else key =0; end %赋值限制小了会有稳态误差
deltau =0.5*(e(3)-e(2))+0.5*key*e(3)+0.05*(e(3)-2*e(2)+e(1));u(2)=u(1)+ deltau;
y =[y,u(2)];
e =[e(2:3),0];
u =[u(2),0];
end
figure(4)stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)xlim([0,1])ylim([0,1.5])xlabel('t')title('积分分离PID')
带死区的PID控制算法
示意图:
matlab仿真:
%-----------------死区PID------------------%
e =[];e(1)=0;e(2)=0;e(3)=0;
u =[];u(1)=0;u(2)=0;
r =1; y =[];y(1)=0;for i =0:0.01:10e(3)= r -y(end);ifabs(e(3))<0.1%死区增大稳态误差增大
e(3)=0;
end
deltau =0.5*(e(3)-e(2))+0.5*e(3)+0.05*(e(3)-2*e(2)+e(1));u(2)=u(1)+ deltau;
y =[y,u(2)];
e =[e(2:3),0];
u =[u(2),0];
end
figure(5)stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)xlim([0,1])ylim([0,1.5])xlabel('t')title('死区PID')
不完全微分PID控制算法
示意图:
抗干扰
matlab仿真:
%-----------------不完全微分PID------------------%
e =[]; alpha =0.5;e(1)=0;e(2)=0;e(3)=0;
u =[];u(1)=0;u(2)=0; u1=[];u1(1)=0;u1(2)=0;
r =1; y =[];y(1)=0;for i =0:0.01:10e(3)= r -y(end);
deltau =0.5*(e(3)-e(2))+0.5*e(3)+0.05*(e(3)-2*e(2)+e(1));u(2)=u(1)+ deltau;u1(2)= alpha*u1(1)+(1-alpha)*u(2);
y =[y,u1(2)];
e =[e(2:3),0];
u =[u(2),0];
u1 =[u1(2),0];
end
figure(3)stairs(0:0.01:10,y(1:1001),'r-','LineWidth',1)xlim([0,1])ylim([0,1.5])xlabel('t')title('不完全微分PID')