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

时间:2014-12-18 20:08:31

标签: c

我已经实现了简单的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控制器。

3 个答案:

答案 0 :(得分:1)

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

P = (current_error = 0 - input_value);

简单地否定了-π到π的误差。然后使用

汇总错误
I += previous_error;

但尚未说明累积误差范围,然后计算

output = Kp*P + Ki*I;

必须是-4000 <= output <= 4000。因此,您正在寻找能够让您保持在界限范围内的KpKi的值,或者除非在平均值条件下,否则不会让您保持在界限范围内。

我建议采用经验解决方案。尝试一系列运行,归档结果,将KpKi的值各自步进5步,首先从极端负值到pos值。按照您的说明限制输出,计算超出限制的结果数。

接下来,将KpKi之一的范围减半,并进一步明确选择要限制的范围。等等。 “分而治之”。

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

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

答案 1 :(得分:0)

要配置KpKi,您确实应该分析系统的频率响应,并设计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;
}

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

答案 2 :(得分:0)

如果我正确理解了您的问题,那么您正在询问集成商的抗干扰问题。

有更聪明的方法,但简单

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

将阻止积分器的终结。

然后你需要找出x,Kp和Ki,以便abs(x*Ki) + abs(3.14*Kp) < 4000

[edit]关闭因为macduff状态,你首先需要分析你的系统并选择正确的Ki和Kp,x是上面等式中唯一真正自由的变量。