对PID控制器三个参数的认识
对 P I D m PID PID控制器三个参数的认识
声明:本文代码思路参考了(B站ID:DR_CAN或知乎ID:小潘是个工程师),又或者自己在看二人的帖子或视频后,自己做了相应的改进。奈何时间有点长了,再次整理时实在无法回忆起细节,若有读者发现了代码的起源处,烦请告知,我会补上相应的引用链接。
本文尝试演示了 P m P P、 I m I I、 D m D D三个参数对控制器性能的影响,并给出了相应的实现代码。需要指出的是:在实际的控制系统中,依靠简单的控制变量法无法直接获取满意的控制器参数,一组最优控制器参数的获取并非易事。实际控制中,相较于 P I D m PID PID, P I m PI PI控制器可能更常见,这在一定程度上削弱了调参的难度。本文仅作为参考,帮助读者对PID控制器的三个参数产生一个感性的认识。蓝色虚线框中的内容不同造就了三段不同的演示代码。
P m 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 m 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 m 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)