PI控制器代码实现

时间:2018-07-06 04:23:37

标签: matlab

我试图正确理解PI控制器的积分项,因此我通过此代码模拟了一个虚拟PI控制器

e =[10 7 8 5 6 3 4 1 2 1];
kp = 0.4;
ki = 1.35;
Ts = 0.5;
I =0;
for i =1:10
    P = kp*e(i);
    I = I +e(i)*Ts;
    output(i)= P+(ki*(I));
end

现在我在想什么,如果将ki与I项相集成或者最后应该乘以

e =[10 7 8 5 6 3 4 1 2 1];
kp = 0.4;
ki = 1.35;
Ts = 0.5;
I =0;
for i =1:10
    P = kp*e(i);
    I = I +e(i)*Ts*ki;
    output(i)= P+I;
end

令我惊讶的是,它们都具有相同的输出,这第二个代码应该有不同吗,因为我在第二个代码中将错误乘以ki来保存错误的乘数,我在这里不真正了解一些基本知识吗?我知道我在空转过程中犯了一些错误,有人可以指出吗?

2 个答案:

答案 0 :(得分:0)

两个版本的代码中输出的I项对我来说都是等效的:

I_output k = ki *Σ j = 1 k (e j * Ts)=Σ< sub> j = 1 k (e j * Ts * ki)

但是如果我错了,请纠正我。

答案 1 :(得分:0)

实际上,您在做同一件事是他们两个,因此他们是相同的。

'5.0000 8.5000 12.5000 15.0000 18.0000 19.5000 21.5000 22.0000 23.0000 23.5000'这是第一种情况下的向量I,在将其与P相加之前先与ki相乘。

现在,在第二种情况下,您已经将ki与每个Ts相乘,因此I的每个值都像以前一样包含ki的乘法。如果您查看I'6.7500 11.4750 16.8750 20.2500 24.3000 26.3250 29.0250 29.7000 31.0500 31.7250'的较新值,您会理解它们都是相同的。

如果使用'I =(I + e(i)* Ts)* ki;',结果将有所不同。因为现在您每次都将ki乘以整个I。