由于计算机控制是一种采样控制, 它只能根据采样时刻的偏差计算控制量,而不能像模拟控制那样连续输出控制量量, 进行连续控制。

     由于这一特点,积分项和微分项不能直接使用,必须进行离散化处理。如果采样周期足够小,则可以获得足够精确的结果,离散控制过程与连续过程十分接近。 


     表示的控制算法式直接给出的 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;
}