PI控制器的配置和限制输出

问题描述 投票:0回答:4

我实现了简单的PI控制器,代码如下:

 PI_controller() {

    // handling input value and errors
    previous_error = current_error;
    current_error = 0 - input_value;

    // PI regulation
    P  = current_error //P is proportional value
    I += previous_error;  //I is integral value
    output = Kp*P + Ki*I;  //Kp and Ki are coeficients

 }

输入值始终在 -π 和 +π 之间。 输出值必须介于 -4000 和 +4000 之间。

我的问题是 - 如何正确配置和(最重要的是)限制 PI 控制器。

c
4个回答
1
投票

太多评论,但没有明确的答案。什么是“简单 PI 控制器”?还有“一根绳子有多长”?我不明白你为什么(有效地)编码

P = (current_error = 0 - input_value);

它简单地否定了 -π 到 π 的误差。然后您将错误汇总为

I += previous_error;

但是还没有说明累积误差界限,然后计算

output = Kp*P + Ki*I;

必须是

-4000 <= output <= 4000
。因此,您正在寻找
Kp
Ki
的值,使您保持在界限内,或者可能不让您保持在界限内,除非在 average 条件下。

我建议一个经验解决方案。尝试一系列运行,归档结果,将

Kp
Ki
的值各步进 5 步,首先从极端负值到正值。按照您所说的限制输出,计算超出限制的结果数量。

接下来,将

Kp
Ki
之一的范围减半,并进一步明智地选择限制哪一个。等等。 “分而治之”。

对于您的要求“如何正确限制PI控制器”,您确定4000是限制而不是4096甚至4095?

if (output < -4000) output = -4000;
if (output >  4000) output =  4000;

0
投票

要配置您的

Kp
Ki
,您确实应该分析系统的频率响应并设计 PI 以给出所需的响应。要简单地限制输出,请决定是否需要冻结积分器,或者仅限制立即输出。我建议冻结积分器。

I_tmp = previous_error + I;
output_tmp = Kp*P + Ki*I_tmp;
if( output_tmp < -4000 )
{
  output = -4000;
}
else if( output_tmp > 4000 )
{
  output = 4000;
}
else
{
  I = I_tmp;
  output = output_tmp;
}

这不是一个超级优雅、经过审查的算法,但它给了你一个想法。


0
投票

如果我正确理解您的问题,您是在询问积分器的抗饱和功能。

还有更聪明的方法,但很简单

if ( abs (I) < x)
{
    I += previous_error;
}

将防止积分器饱和。

然后你需要算出 x、Kp 和 Ki,以便

abs(x*Ki) + abs(3.14*Kp) < 4000

[编辑] 因为正如 Macduff 所说,你首先需要分析你的系统并选择正确的 Ki 和 Kp,x 是上式中唯一真正自由的变量。


0
投票
output =(Kp*(current_err - prev_err))+(Ki*samplingtime*current_err)+output;

if(output>4000)
{
output = 4000;
}
else if(output<-4000)
{
  output = -4000;
}
prev_err = current_err;
© www.soinside.com 2019 - 2024. All rights reserved.