电机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 <= 0 && ek<0 )) //进入饱和区则不再进行积分运算 deltaValue = ((int)( p->Ka * ((ek - p->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 ( tmpValue <= 0 ) return 1; else return tmpValue; } 主要原理是上面的,如果需要和实际应用结合起来,那就依据所留I/O 口进行适当的修改参数。 PID 控制直流电机编程 2009-04-23 19:46 DMC 界面: Speed1_Cmd:设置电机运转的速度 Speed1_Now:电机当前反馈速度 Speed1_Kp:2.5 节自校正 PID 控制器中提到的Kp 值 User_R0:当前 P_TMR3_TGRA 寄存器的值 User_R1:设置速度与电机实际转速的差值 Motor 1 Start 和Motor 1 Stop 控制启停 PID 调节控制做电机速度控制 子程序说明 PIDInit ( ) 原形:void PIDInit (void) 描述:PID 所用到的RAM 清零 输入参数:无 输出参数:无 头 文 件:Spmc75_PID.h 库文 件:DigitalPID_V100 注意事项:请在设置参数前使用。 例 子:PIDInit (); PID 调节控制做电机速度控制 PIDSetPoint ( ) 原形:void PIDSetPoint(int) 描述:设置PID 调节的目标值 输入参数:期望值 ...