我试图用Matlab设计一个PID补偿器。 我正在做以下事情:
我的工厂具有这种转移功能:
plant
( 0.0195 s - 6.5 )/ (1.74e-06 s^2 - 0.003 s - 1)
因此,使用PID调谐功能,指定所需的交叉频率:
>> [info,pid_c] = pidtune(plant,'PID',(2E6/6)*2*pi)
info =
Kp + Ki * 1/s
with Kp = 162, Ki = 1.96e+08
Continuous-time PI controller in parallel form.
pid_c =
Stable: 1
CrossoverFrequency: 2.0944e+06
PhaseMargin: 60.0000
但是,当我关闭循环并分析系统的极点时,我发现在右半平面上有一个极点:
>> pid_c = 162 + 1.96E8/s
pid_c =
( 162 s + 1.96e08 ) / s
Continuous-time transfer function.
>> sys=feedback(plant*pid_c,1)
sys =
(3.159 s^2 + 3.821e06 s - 1.274e09 )/ ( 1.74e-06 s^3 + 3.156 s^2 + 3.821e06 s - 1.274e09)
Continuous-time transfer function.
>> pole(sys)
ans =
1.0e+06 *
-0.9071 + 1.1721i
-0.9071 - 1.1721i
0.0003 <==== RSP pole
我的直觉说我应该通过在PID的分子上加一个(s + 0.0003)来摆脱这个极点:
>> pid_c=pid_c*(s+0.0003)
pid_c =
( 162 s^2 + 1.96e08 s + 5.88e04 )/ s
但它根本不起作用,我闭环的转移功能就是这样:
sys =
(3.159 s^3 + 3.821e06 s^2 - 1.274e09 s - 3.822e05) / (3.159 s^3 + 3.821e06 s^2 - 1.274e09 s - 3.822e05)
当然这是错误的。
我非常感谢你的帮助。
答案 0 :(得分:0)
问题是因为您未正确调用pidtune
。返回的第一个变量是控制器,第二个是关于闭环稳定性的信息,而不是相反的。来自documentation:
[C,info] = pidtune(...)
返回数据结构info
包含有关闭环稳定性的信息,选中 开环增益交叉频率和实际相位裕度。
所以我会将代码更改为:
[pid_c,info] = pidtune(plant,'PID',(2E6/6)*2*pi);
sys=minreal(feedback(pid_c*plant,1));
pole(sys)
你犯的第二个错误是极点不在0.0003
,而在0.0003 * 1e6
。如果您要依赖屏幕上显示的内容,则至少应使用format long g
来获得更多有效数字。
另外,请注意我使用minreal
计算闭环传递函数的最小实现,因为您似乎混合了非常大和非常小的数字,而不是一个很好的组合。 / p>