#define VV_MIN 0
Ka = Kp //设置调节死区 //速度PID计算 pp->vl_PreU = VV_MAX; signed long vi_PreDerror; //速度PID,前一次,速度误差之差,d_error-PreDerror;电机控制输出值 }PID; PID sPID; // PID Control Structure void PIDInit(void) { sPID.vi_Ref = 0 ; //速度设定值 sPID.vi_FeedBack = 0 ; //速度反馈值 sPID.vi_PreError = 0 ; //前一次,速度误差,,vi_Ref - vi_FeedBack sPID.vi_PreDerror = 0 ; //前一次,速度误差之差,d_error-PreDerror; sPID.v_Kp = VV_KPVALUE; sPID.v_Ki = VV_KIVALUE; sPID.v_Kd = VV_KDVALUE; sPID.vl_PreU = 0 ; //电机控制输出值 } unsigned int v_PIDCalc( PID *pp ) { signed long error,d_error,dd_error; error = (signed long)(pp->vi_Ref - pp->vi_FeedBack); // 偏差计算 d_error = error - pp->vi_PreError; dd_error = d_error - pp->vi_PreDerror; pp->vi_PreError = error; //存储当前偏差 pp->vi_PreDerror = d_error;定义PID参数 #define VV_KPVALUE 3 //比例 #define VV_KIVALUE 40 //积分 #define VV_KDVALUE 3 //微分 #define VV_MAX 10000 //返回的最大值,是pwm的周期值 |