先定义个pid公式:
输入量为in(k),输出量为out(k),目标为target(k),偏差为err(k)=target(k)-in(k)。
o
u
t
(
k
)
=
p
i
d
(
t
a
r
g
e
t
(
k
)
,
i
n
(
k
)
)
=
K
p
∗
e
r
r
(
k
)
+
K
i
∑
j
=
0
k
e
r
r
(
j
)
+
K
d
∗
(
e
r
r
(
k
)
−
e
r
r
(
k
−
1
)
)
\begin{aligned} out(k) &= pid(target(k),in(k))\\ &=K_p*err(k)+K_i\sum_{j=0}^{k} err(j)+K_d*\big (err(k)-err(k-1)\big ) \end{aligned}
out(k)=pid(target(k),in(k))=Kp∗err(k)+Kij=0∑kerr(j)+Kd∗(err(k)−err(k−1))
在调试pid时,会因为输入输出物理意义不同,而使pid三个参数有不同的意义,如调试位置环时,式子为:输出速度=pid(目标位置,输入位置),调试速度环时,式子为:输出电流=pid(目标速度,输入速度),输入与输出单位不同。
先说速度环,输出电流与这个输出电流得到的速度(下一次的输入速度)可以近似看成线性关系,即
I
o
u
t
=
α
∗
V
o
u
t
I_{out}=\alpha * V_{out}
Iout=α∗Vout
这时如果只设置参数p的话,可以得到
α
∗
V
o
u
t
=
I
o
u
t
=
K
p
∗
(
V
t
a
r
g
e
t
−
V
i
n
)
\alpha * V_{out}=I_{out}=K_p*(V_{target}-V_{in})
α∗Vout=Iout=Kp∗(Vtarget−Vin)
可以解得
V
o
u
t
=
K
p
α
+
K
p
V
t
a
r
g
e
t
V_{out}=\frac {K_p}{\alpha +K_p}V_{target}
Vout=α+KpKpVtarget
这个公式大概的意义就是:
当设置好目标速度和参数p时,会存在一个速度让整个系统稳定下来,这个速度就是
V
o
u
t
V_{out}
Vout,而这个速度又会作为输入重新输入系统,即
V
o
u
t
=
V
i
n
V_{out}=V_{in}
Vout=Vin。
由
V
o
u
t
=
K
p
α
+
K
p
V
t
a
r
g
e
t
V_{out}=\frac {K_p}{\alpha +K_p}V_{target}
Vout=α+KpKpVtarget可知,
K
p
K_p
Kp越大时,
V
i
n
V_{in}
Vin越接近
V
t
a
r
g
e
t
V_{target}
Vtarget,静差减小。
当然
K
p
K_p
Kp不是越大越好,当
K
p
K_p
Kp较大时,系统会出现很大的振荡(甚至发散),以以下表格数据(假设
α
\alpha
α为1,即
V
o
u
t
=
I
o
u
t
V_{out}=I_{out}
Vout=Iout)为例:
时间 | K p K_p Kp | V t a r g e t V_{target} Vtarget | V o u t V_{out} Vout |
---|---|---|---|
1 | 10 | 10 | 0 |
2 | 10 | 10 | 100 |
3 | 10 | 10 | -900 |
4 | 10 | 10 | 9100 |
5 | 10 | 10 | -90900 |
可见,在速度环中,当 K p K_p Kp较小时,静差较大,当 K p K_p Kp较大时,会出现大振荡。在调试电机速度环时,我本人的做法是,调出一个静差较小但不能有振荡的 K p K_p Kp,如果静差还是有点大就加一个 K i K_i Ki来消除静差。当然,也可以只加 K i K_i Ki,这样就不会有静差和振荡,但会出现响应较慢的情况,因为 K i K_i Ki需要时间去积分。所以我认为比较好的做法是先调一个 K p K_p Kp来提供一个瞬时的反应,再加一个 K i K_i Ki来消除小静差。
接着是位置环,位置环如果只设置
K
p
K_p
Kp就不会导致静差,我们可以会公式上分析:
S
o
u
t
=
∫
V
o
u
t
=
∫
K
p
∗
(
S
t
a
r
g
e
t
−
S
i
n
)
S_{out}=\int V_{out}=\int K_p*(S_{target}-S_{in})
Sout=∫Vout=∫Kp∗(Starget−Sin)
而每次输出位置又会作为输入重新进入系统,即:
S
o
u
t
=
S
i
n
S_{out}=S_{in}
Sout=Sin
可以得知,只有当输入位置与目标位置相等时,输出速度为零,这时整个系统才稳定。
然后让我们来分析
K
p
K_p
Kp大小对这个过程的影响,首先可以知道的是
K
p
K_p
Kp决定了整个系统稳定下来的时间,
K
p
K_p
Kp越大,
S
i
n
S_{in}
Sin接近
S
t
a
r
g
e
t
S_{target}
Starget的速度越快,系统更快稳定。而当
K
p
K_p
Kp较大时,系统会出现振荡(甚至发散)。继续以表格为例:
时间 | K p K_p Kp | S t a r g e t S_{target} Starget | S i n S_{in} Sin | V o u t V_{out} Vout | S o u t S_{out} Sout |
---|---|---|---|---|---|
1 | 10 | 10 | 0 | 100 | 100 |
2 | 10 | 10 | 100 | -900 | -800 |
3 | 10 | 10 | -800 | 8100 | 7300 |
4 | 10 | 10 | 7300 | -72900 | -65600 |
5 | 10 | 10 | -65600 | 656100 | 590500 |
对于位置环的调参,我有两种做法:一种是先调出一个较大但不会引起振荡的 K p K_p Kp,这种的好处是不会超调不会振荡,但对于电机来说稳定性会相对减小,不够硬。另一种是调一个大的 K p K_p Kp再加一个小的 K d K_d Kd来抑制它的超调或振荡,稳定性会足够好,但不好调, K d K_d Kd较小时会超调,较大时会出现频率很高的微小振荡,有时几乎找不到稳定的 K d K_d Kd,只能减小 K p K_p Kp引起的超调量再重新调 K d K_d Kd。