对 P I D \rm PID PID控制器三个参数的认识
声明:本文代码思路参考了(
B站ID:DR_CAN
或知乎ID:小潘是个工程师
),又或者自己在看二人的帖子或视频后,自己做了相应的改进。奈何时间有点长了,再次整理时实在无法回忆起细节,若有读者发现了代码的起源处,烦请告知,我会补上相应的引用链接。
本文尝试演示了
P
\rm P
P、
I
\rm I
I、
D
\rm D
D三个参数对控制器性能的影响,并给出了相应的实现代码。需要指出的是:在实际的控制系统中,依靠简单的控制变量法无法直接获取满意的控制器参数,一组最优控制器参数的获取并非易事。实际控制中,相较于
P
I
D
\rm PID
PID,
P
I
\rm PI
PI控制器可能更常见,这在一定程度上削弱了调参的难度。本文仅作为参考,帮助读者对PID控制器的三个参数产生一个感性的认识。
蓝色虚线框中的内容不同造就了三段不同的演示代码。
P \rm P P对控制器性能的影响
MATLAB代码
clear
figure
Gs = tf(2,conv([3,1],[2,1])); %Gs是传递函数,conv是可以理解为因式分解(3s+1)(2s+1)
Kp = [0.5,2,5,10]; %取不同的比例系数,类似数组
for m = 1:4
sys = feedback(Kp(m)*Gs,1); %feedback(G,H),(G,H需事先设定)。
%其中G是传递函数,H为反馈函数,表示一个控制系统G,对其进行负反馈H(要求正反馈用-H)。这里前面写上比例环节与系统的串联,后面的1表示负反馈
step(sys); %求阶跃响应,可以用形如step(feedback(G,H))
hold on;
end
%% 格式控制
lgd = legend({'Kp=0.5','Kp=2','Kp=5','Kp=10'},'FontSize',10.5,'FontName','Times New Roman');
set(gcf,'unit','centimeters','position',[30 15 15 10]);%设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','bold' ,'XColor',[0 0 0] ,'YColor',[0 0 0]);%坐标轴数字大小,坐标轴数字是灰色,故加color代码
xlabel('Time','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Amplitude','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
grid on
set(gca,'gridlinestyle',':','Gridalpha',1)
代码效果
I \rm I I对控制器性能的影响
MATLAB代码
figure
clear
Gs = tf(2,conv([3,1],[2,1]));
Kp = 2;
Ti = [2,4,8,12];
for m = 1:4
G1 = tf([Kp,Kp/Ti(m)],[1,0]); %这里也是(KpS+Kp/Ti)/s
sys = feedback(G1*Gs,1);
step(sys);
hold on;
end
%% 格式控制
lgd = legend({'Ti=2','Ti=4','Ti=8','Ti=12'},'FontSize',12,'FontName','Times New Roman');
set(gcf,'unit','centimeters','position',[30 15 15 9]);%设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','bold' ,'XColor',[0 0 0] ,'YColor',[0 0 0]);%坐标轴数字大小,坐标轴数字是灰色,故加color代码
xlabel('Time','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Amplitude','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
grid on
set(gca,'gridlinestyle',':','Gridalpha',1)
代码效果
D \rm D D对控制器性能的影响
MATLAB代码
figure
clear
Gs = tf(2,conv([3,1],[2,1]));
Kp = 10;
Td = [0,0.4,1,4];
for m = 1:4
G1 = tf([Kp*Td(m),Kp],[0,1]); %这个地方要注意 (Kp*Td(m)*S+Kp)/1=Kp(1+TdS)
sys = feedback(G1*Gs,1); %前面是微分环节与系统的串联,负反馈
step(sys);
hold on;
end
%% 格式控制
lgd = legend({'Td=0','Td=0.4','Td=1','Td=4'},'FontSize',10.5,'FontName','Times New Roman');
set(gcf,'unit','centimeters','position',[30 15 15 9]);%设置画布大小和位置
set(gca,'FontName','Times New Roman','FontSize',10.5,'FontWeight','bold' ,'XColor',[0 0 0] ,'YColor',[0 0 0]);%坐标轴数字大小,坐标轴数字是灰色,故加color代码
xlabel('Time','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
ylabel('Amplitude','FontName','Times New Roman','FontWeight','Bold','FontSize',10.5);
grid on
set(gca,'gridlinestyle',':','Gridalpha',1)