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