我已经实现了简单的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控制器。
答案 0 :(得分:1)
评论太多但没有明确答案。什么是“简单的PI控制器”?并且“一根绳子有多长”?我不明白为什么你(有效)代码
P = (current_error = 0 - input_value);
简单地否定了-π到π的误差。然后使用
汇总错误I += previous_error;
但尚未说明累积误差范围,然后计算
output = Kp*P + Ki*I;
必须是-4000 <= output <= 4000
。因此,您正在寻找能够让您保持在界限范围内的Kp
和Ki
的值,或者除非在平均值条件下,否则不会让您保持在界限范围内。
我建议采用经验解决方案。尝试一系列运行,归档结果,将Kp
和Ki
的值各自步进5步,首先从极端负值到pos值。按照您的说明限制输出,计算超出限制的结果数。
接下来,将Kp
和Ki
之一的范围减半,并进一步明确选择要限制的范围。等等。 “分而治之”。
关于“如何正确限制PI控制器”的要求,您确定4000是限制而不是4096甚至4095吗?
if (output < -4000) output = -4000;
if (output > 4000) output = 4000;
答案 1 :(得分: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;
}
这不是一个超级优雅,经过审查的算法,但它会给你一个想法。
答案 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是上面等式中唯一真正自由的变量。