使用命令行设计 PID 控制器设计
此示例说明如何为由下式给出的被控对象设计 PID 控制器:
首先,创建一个被控对象模型,并为其设计简单的 PI 控制器。
sys = zpk([],[-1 -1 -1],1);
[C_pi,info] = pidtune(sys,'PI')
C_pi = 1 Kp + Ki * --- s with Kp = 1.14, Ki = 0.454 Continuous-time PI controller in parallel form.
info = struct with fields:
Stable: 1
CrossoverFrequency: 0.5205
PhaseMargin: 60.0000
C_pi
是表示 PI 控制器的 pid
控制器对象。info
的字段显示,调节算法选择约 0.52 弧度/秒的开环穿越频率。
检查受控系统的闭环阶跃响应(参考跟踪)。
T_pi = feedback(C_pi*sys, 1); step(T_pi)
为了改进响应时间,您可以设置比 pidtune
自动选择的结果(即 0.52)更高的目标穿越频率。将穿越频率提高到 1.0。
[C_pi_fast,info] = pidtune(sys,'PI',1.0)
C_pi_fast = 1 Kp + Ki * --- s with Kp = 2.83, Ki = 0.0495 Continuous-time PI controller in parallel form.
info = struct with fields:
Stable: 1
CrossoverFrequency: 1
PhaseMargin: 43.9973
新控制器可实现更高的穿越频率,但代价是相位裕度降低。
比较两个控制器的闭环阶跃响应。
T_pi_fast = feedback(C_pi_fast*sys,1); step(T_pi,T_pi_fast) axis([0 30 0 1.4])
ans = 1×4
0 30.0000 0 1.4000
legend('PI','PI,fast')
ans = Legend (PI, PI,fast) with properties: String: {'PI' 'PI,fast'} Location: 'northeast' Orientation: 'vertical' FontSize: 9 Position: [0.7287 0.7968 0.1572 0.0789] Units: 'normalized' Use GET to show all properties
性能下降的原因是 PI 控制器没有足够的自由度在 1.0 弧度/秒的穿越频率下实现良好的相位裕度。增加导数动作可以改进响应。
为 Gc
设计 PIDF 控制器,目标穿越频率为 1.0 弧度/秒。
[C_pidf_fast,info] = pidtune(sys,'PIDF',1.0)
C_pidf_fast = 1 s Kp + Ki * --- + Kd * -------- s Tf*s+1 with Kp = 2.72, Ki = 0.985, Kd = 1.72, Tf = 0.00875 Continuous-time PIDF controller in parallel form.
info = struct with fields:
Stable: 1
CrossoverFrequency: 1
PhaseMargin: 60.0000
信息字段显示,控制器中的导数动作允许调节算法设计一个更激进的控制器,以实现具有良好相位裕度的目标穿越频率。
比较快速 PI 和 PIDF 控制器的闭环阶跃响应和抗扰。
T_pidf_fast = feedback(C_pidf_fast*sys,1); step(T_pi_fast, T_pidf_fast); axis([0 30 0 1.4]); legend('PI,fast','PIDF,fast');
您可以将受控系统的输入(负载)抗扰与快速 PI 和 PIDF 控制器进行比较。为此,绘制从被控对象输入到被控对象输出的闭环传递函数的响应。
S_pi_fast = feedback(sys,C_pi_fast); S_pidf_fast = feedback(sys,C_pidf_fast); step(S_pi_fast,S_pidf_fast); axis([0 50 0 0.4]); legend('PI,fast','PIDF,fast');
上图表明,PIDF 控制器还展示了更快的抗扰能力。