电机PID 控制算法 // 闭环控制算法 // 功能: // 输入:*p PID 控制结构体 // 输出:电机控制输出值——PWM 波脉冲宽度 int count=0; unsigned int speed_PID_Calc( struct PID *p ) { int ek; int tmpValue = p->ControlValue; int deltaValue = 0; ek = p->Reference - p->FeedBack; // 本次误差 = 参考值 - 反馈值 //将 PID 公式离散化后,采用增量式 PID 控制,更新电机控制输出值 // 遇限削弱积分法,如果进入饱和区,并且积分增加,则不进行积分运算,尽快离开饱和
// 增量的范围(0~10)*(1+10+10)*256=53760)线性转换为(0~550),移位数, 在 4~7之间为好 if ( ( p->ControlValue >=550 && ek>0 ) || ( p->ControlValue ek_1) + p->Kc * ( (ek - p->ek_1) - (p->ek_1 - p->ek_2) ))))>>5 ; else//不在饱和区,则按正常离散的 PID 公式计算 deltaValue = ((int)( p->Ka * ((ek - p->ek_1) + p->Kb * ek + p->Kc * ( (ek - p->ek_1) - (p->ek_1 - p->ek_2) ))))>>5 ; // 更新前两次误差 p->ek_2 = p->ek_1; p->ek_1 = ek; tmpValue = p->ControlValue + deltaValue; // 返回值 if ( tmpValue >= 551 ) return 550; else if ( tmp