Matlab中的PID补偿

时间:2015-10-28 12:14:41

标签: matlab controls

我试图用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)

当然这是错误的。

我非常感谢你的帮助。

1 个答案:

答案 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>