由于计算机控制是一种采样控制, 它只能根据采样时刻的偏差计算控制量,而不能像模拟控制那样连续输出控制量量, 进行连续控制。 由于这一特点,积分项和微分项不能直接使用,必须进行离散化处理。如果采样周期足够小,则可以获得足够精确的结果,离散控制过程与连续过程十分接近。 

        表示的控制算法式直接给出的 PID 控制规律定义进行计算的,所以它给出了全部控制量的大小,因此被称为全量式或位置式 PID 控制算法。

缺点是: 由于全量输出, 所以每次输出均与过去状态有关, 计算时要对 ek 进行累加,工作量大; 并且,因为计算机输出的 对应的是执行机构的实际位置, 如果计算机出现故障,输出将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故,这在实生产际中是不允许的。增量式 PID 控制算法可以避免着重现象发生。
 

话不多说,直接上代码:

int SpeedPID(s32 GoalSpeed)                    //目标速度  速度PID调节,增量式
{
s32 ActualSpeed; //实际参数
double IncrementSpeed; //增加的速度

Count=FTM_QUAD_get(FTM1); //获取脉冲数
Speed = Count*144586/10000; //获取速度
//【Counter/512*0.419*6.283*0.02812*1000=(毫米/单位采样时间)】
//【脉冲数÷一圈脉冲数×齿轮比×2π×轮胎半径(m)×1000倍放大】
ActualSpeed = Speed; //获取实际速度

err = GoalSpeed-ActualSpeed; //目标值和实际数值的差
IncrementSpeed = SpeedKP*(err-err_last)+SpeedKI*err+SpeedKD*(err-2*err_last+err_lastbefore); //需要增加的速度
SpeedPWM += IncrementSpeed; //目前给的速度=现在的速度+增加的速度
err_lastbefore = err_last; //前前偏差值=前偏差值
err_last = err; //前偏差值=偏差值

if(SpeedPWM>240) //设置最大值
{SpeedPWM = 240;}
else if(SpeedPWM<-240) //设置最小值
{SpeedPWM = -240;}

PWM = (int)SpeedPWM; //更改pwm
return PWM;
}