Matlab中的PID补偿
我正试图用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
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)