PID公式
以上是离散PID计算公式,PID的连续和离散,以及离散中的位置和增量,原理上都是完全一样的。一般控制都是离散PID,而且离散的表达形式更加直观,这里只给出离散的形式。
PID控制的理解
非线性的可不可以
有了PID控制,系统的输入和输出间的具体关系就不重要了。PID最好还是线性,非线性需要根据情况改变pid系数,比如某个既不是线性也不是单调的系统,输出与输入间的关系为——二次函数:
y
=
(
u
−
1
)
2
y=(u-1)^2
y=(u−1)2
- 想让这个函数达到一个稳定的值y=4,初始状态为u=0,y=1。
假设不知道内部的关系是什么,只知道参考值4比初值1要大,可以先随便设个系数。
用matlab模拟该系统:
clc,clear;
ref = 4;
err = 0;
err_last = 0;
integral = 0;
y(1) = 1;
u(1) = 0;
for i=1:60
err = ref-y(i);
integral = integral+err;
u(i+1) = 0.05*err+0.05*(err-err_last)+0.05*integral;
err_last = err;
y(i+1) = (u(i+1)-1).^2;
end
i=1:61;
plot(i,u);
hold on;
plot(i,y);
grid on;
xlabel('采样次数');
ylabel('u and y');
legend('u','y');
结果为:
2. 如果初始状态为u=5,y=16。
虽然也能调节到参考值,但是u在最开始的时候变为了负。而且根据计算,y的初值比参考值大,误差为负,那么第一次采样的时候,u必为负。如果某些系统的输入不能为负,就可能出现问题。这种问题也很容易解决,给u加上限值即可,只允许u在这个范围内变化,一是为系统安全考虑,二是避免PID调节失败。比如虽然第一次采样后u被调为负,但是由于系统对u有限制,只能调到0,那么y=1,之后就会重复之前u=0,y=1的调节过程。
3. 如果初始状态为u=0,y=1,参考值为0
使用同样的pid系数就完全调不了了:
这是因为调节方向完全反了,即使加了限制,也不可行。比如若限制
0
<
=
u
<
=
5
0<=u<=5
0<=u<=5, 调节过程中u会一直卡在0处。
应该将PID系数改成负值。
如果系统单调,就不会有上述的问题,如果系统不单调,可能调着调着越过了极值点,就不是负反馈了。
对于线性系统
输入量=当前和过去所有误差的加权之和,对于PID来说,当前误差的权重较大,同时之前所有的误差也影响着最后计算出来的输入量。
比例部分
比例部分就是当前误差乘以某个系数
K
p
K_p
Kp。比如说某个系统y=u,想从y=1调到y=5。调节过程中y肯定在逐渐变大,差距在逐渐缩小,那么比例部分就越来越小。所以越到后期,越到差距小的时候,比例部分就接近0。
比例部分主要是在调节刚开始的时候有用,可以显著加快前期的调节速度。如果比例系数过大,有可能调节过程中出现超调,积分过大也有可能出现超调。但积分造成的超调更严重些,不能把积分环节设置得太大,因此为了追求前期的快速,还是要设置一定比例系数的。
如果只有比例部分,可以计算一下对于
y
=
u
y=u
y=u系统只使用比例环节得到的输出量终值,设该终值为
y
n
y_n
yn,那么:
(
y
r
e
f
−
y
n
)
K
p
=
y
n
(y_{ref}-y_n)K_p=y_n
(yref−yn)Kp=yn
y
n
=
K
p
y
r
e
f
K
p
+
1
y_n=\frac{K_py_{ref}}{K_p+1}
yn=Kp+1Kpyref
比例部分的作用就是在刚开始出现误差的时候让输入量快速向合理的方向移动。
积分部分
积分部分才是使系统调节到
y
r
e
f
y_{ref}
yref的关键。看增量PID算法的公式可以看出来,积分环节的输入量的变化量=当前误差*积分系数。
积分部分的最终目标就是误差为0。
pid系数的正负确定
pid系数都是有正负的,设定前得先知道调节的方向。如果系统单调递增,想让y增大,误差为正,u也得增大,因此积分系数为正。如果系统单调递减,想让y增大,误差为正,u就得减小,因此积分系数为负。否则根本调不到稳定值。
比例系数和积分系数的正负是一致的。