针对的情况 链接到标题
- 与只有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控制过于频繁,因此难免会有抖动,
输入死区 链接到标题
应该说这个算法是对上面的输出偏移出现的抖动的一个对口的优化。
在某些系统中,输出的目标值有微小的噪声波动,或者系统有一定的滞后,导致执行器在误差很小的时候频繁调控,不能最终稳定下来。
那么思路就是:若误差小于一个限度,则固定输出0,不进行调控
out=
- 0,(|error(k)|)
- out(k),(error(k)>A)
程序实现 链接到标题
if (fabs(Error0)<5)
{
Out=0;
}
else
{
Out=Kp*Error0+Ki*ErrorInt+Kd*DifOut;
}
这也就意味着只要误差小于一定值,就不会再调了,从而减小了抖动