Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中的PID补偿_Matlab_Controls - Fatal编程技术网

Matlab中的PID补偿

Matlab中的PID补偿,matlab,controls,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.96

我正试图用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
但它根本不起作用,我的闭环的转换函数是这样的:

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)
当然,这是错误的


我真的很感谢你的帮助。

问题在于你没有正确地调用
pidtune
。返回的第一个变量是控制器,第二个变量是关于闭环稳定性的信息,而不是相反。从:

[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
。如果要依赖屏幕上显示的内容,则至少应使用
格式长g
以获得更高的有效数字


另外,请注意,我使用了
minreal
来计算闭环传递函数的最小实现,因为你似乎有一个非常大和非常小的数字,不是一个好的组合。

而你的问题很难理解,因为你忽略了格式化它,我没有看到你问一个我们可以回答的问题……我已经重新格式化了这个问题,这样就更容易理解发生了什么。看起来您正在覆盖由
pid\u tune
生成的
pid\u c
控制器。不要那样做。您还忽略了极点不是在
0.0003
,而是在
0.0003*1e6
。您可能还希望使用
格式长g
获取RHP极点位置的更多有效数字。当计算闭环传递函数时,也要使用
minreal
,你有一些非常大的数字与非常小的数字组合在一起,这不是一个好的组合。顺便说一句,对
pidtune
的正确调用是
[pid_c,info]=pidtune(…)
,那么你的控制器就在
pid_c
中,可以使用了。不用再写了,非常感谢!minreal函数帮了我的忙。是的,我被错误的pidtune格式和1E6系数误导了。没问题。如果答案帮助你解决问题,请考虑接受答案:
[pid_c,info] = pidtune(plant,'PID',(2E6/6)*2*pi);
sys=minreal(feedback(pid_c*plant,1));
pole(sys)