我实现了简单的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 控制器。
太多评论,但没有明确的答案。什么是“简单 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;
要配置您的
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;
}
这不是一个超级优雅、经过审查的算法,但它给了你一个想法。
如果我正确理解您的问题,您是在询问积分器的抗饱和功能。
还有更聪明的方法,但很简单
if ( abs (I) < x)
{
I += previous_error;
}
将防止积分器饱和。
然后你需要算出 x、Kp 和 Ki,以便
abs(x*Ki) + abs(3.14*Kp) < 4000
[编辑] 因为正如 Macduff 所说,你首先需要分析你的系统并选择正确的 Ki 和 Kp,x 是上式中唯一真正自由的变量。
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;