针对的情况 链接到标题

  • 与只有P项的类似,就是存在恒定小误差
  • 并且在静态的时候out值不为零,但是其输出的力又不足以驱动电机消除误差,会产生无意义的功耗浪费。

前面说过,通过积分分离是可以解决这个问题的,不过我们引入一种另外的方法。

输出偏移 链接到标题

理论分析 链接到标题

判断输出out状态,给一个偏移量使得执行器跳过误动作状态。即

out=

  • (out(k)=0),0
  • (out(k)>0),out(k)+偏移量
  • (out(k)<0),out(k)-偏移量

代码实现 链接到标题

float offset=6;//这个值是经过测试的,电机转动的最小值
if(Out>0)
{
    Out+=offset;
}
else if(Out<0)
{
    Out-=offset;
}
else//这部分可要可不要
{
    Out=0;
}

上面的offset=6是通过一下的测试程序实验测得的

KeyNum=Key_GetNum();//按键扫描
if (KeyNum==1)//按键1
{
    Out+=1;
}
if (KeyNum==2)//按键2
{
    Out-=1;
}
Motor_SetPWM(Out);//电机转动
OLED_Printf(0,16,OLED_8X16,"out:%+04.0f",Out);
OLED_Update();
  • 优点就是在仅有P项的时候也能有很好的效果
  • 但是缺点就是PID控制过于频繁,因此难免会有抖动,

alt text

输入死区 链接到标题

应该说这个算法是对上面的输出偏移出现的抖动的一个对口的优化。

在某些系统中,输出的目标值有微小的噪声波动,或者系统有一定的滞后,导致执行器在误差很小的时候频繁调控,不能最终稳定下来。

那么思路就是:若误差小于一个限度,则固定输出0,不进行调控

out=

程序实现 链接到标题

if (fabs(Error0)<5)
{
    Out=0;
}
else
{
    Out=Kp*Error0+Ki*ErrorInt+Kd*DifOut;
}

这也就意味着只要误差小于一定值,就不会再调了,从而减小了抖动