我一直在为运动系统设计控制器。控制器包含串联的增益、比例积分器 (PI) 和前置滤波器。我已经手动调整了控制器的增益以获得所需的带宽(交叉频率)。铅和 PI 的频率基于经验法则(对于铅,分子中的带宽/3,分母中的带宽 *3 和积分器的带宽/5)。如何仅通过提及所需的带宽来决定控制器的增益以自动获得。有什么经验法则可以遵循吗?它如何根据采样频率变化?
2 回答
好吧,您可以简单地使用关于 I 操作和前导过滤器的经验法则。然后您只需检查开环的波特图。在您想要带宽的频率处检查系统的幅度。然后,您可以简单地计算需要应用多少增益才能将该点向上移动到 0 dB(带宽)。
此外,经验法则假定采样频率足够高。但是,一般来说,如果采样频率变低,您的增益也会变低,但是 I 作用和前置滤波器的频率也会发生变化。
-编辑-
我为你做了一个小脚本。脚本是自我解释的。
相同的方法可以应用于离散域。此外,我不会在离散域中设计控制器,而是在连续时域中设计控制器。接下来,我将使用离散化方法将控制器从连续时间转换为离散时间,例如双线性变换。http://nl.mathworks.com/help/control/ref/c2d.html提供了如何在 Matlab 中执行此操作的信息。
另外,我想给你推荐这个工具,http://cstwiki.wtb.tue.nl/index.php ?title=Home_of_ShapeIt
clear all;
close all;
clc;
%% Initialize parameters
s = tf('s');
% Mass of plant
m = 10;
% Desired bandwidth
BW = 10;
%% Define plant
P = 1/(m*s^2);
%% Define filters
% Lead lag filter
f1 = (1/(2*pi*BW/3)*s + 1)/(1/(2*pi*BW*3)*s + 1);
% Integrator
f2 = (s + 2*pi*BW/5)/s;
% define Controller
C = f1*f2;
%% Determine gain
% Open loop
OL = C*P;
% Evaluate at bandwidth and get magnitude
mag = abs(evalfr(OL,2*pi*BW));
% Desired gain is 1/mag
C = 1/mag*C;
% Recalculate open loop
OL = C*P;
% Evaluate at bandwidth, magnitude should be 1
sprintf('Magnitude at bandwidth: %f\n',abs(evalfr(OL,2*pi*BW)));
%% Compute other stuff
% Sensnitivity
SS = 1/(1 + OL);
% Closed loop, complementary sensitivity
CL = OL*SS;
% Process sensitivity
PS = P*SS;
% Controller sensitivity
CS = C*SS;
%% Create some plots
% Open loop
figure(1);
bode(OL);
title('Open loop');
% Nyquist
figure(2);
nyquist(OL);
% Other sensitivities
figure(3);
subplot(2,2,1);
bodemag(CL);
title('Closed loop');
subplot(2,2,2);
bodemag(SS);
title('Sensitivity');
subplot(2,2,3);
bodemag(PS);
title('Process sensitivity');
subplot(2,2,4);
bodemag(CS);
title('Controller sensitivity');
% Step
figure(4);
step(CL);
title('Step response');
PID控制器设计是一个固有的难题。除非您的系统由于简单性而允许您导出某些表达式,否则您无法通过简单的事情来做到这一点。
一种方法是求助于非凸非光滑优化算法,例如 Matlab 自己的systune
或 HIFOO 或其他一些解决“a”解决方案而不是“the”解决方案的工具。
文档中有环路整形和带宽限制的示例。