#define KP 3 //比例
#define KI 40 //积分
#define KD 3 //微分
#define MAX 10000 //返回的最大值,是pwm的周期值
#define MIN 0
#define ERRORMAX 0X08 //速度PID,设置死区范围
typedef struct PID //定义数法核心数据
{
signed int Ref; //速度PID,速度设定值
signed int Back; //速度PID,速度反馈值
signed long PreError; //速度PID,前一次,速度误差,,vi_Ref - vi_FeedBack
signed long PreDerror; //速度PID,前一次,速度误差之差,d_error-PreDerror;
unsigned int Kp; //速度PID,Ka = Kp
unsigned int Ki; //速度PID,Kb = Kp * ( T / Ti )
unsigned int Kd; //速度PID,
signed long PreU; //电机控制输出值
}PID;
PID sPID; // PID Control Structure
void PIDInit(void)
{
sPID.Ref = 0 ; //速度设定值
sPID.Back = 0 ; //速度反馈值
sPID.PreError = 0 ; //前一次,速度误差,,vi_Ref - vi_FeedBack
sPID.PreDerror = 0 ; //前一次,速度误差之差,d_error-PreDerror;
sPID.Kp = KP;
sPID.Ki = KI;
sPID.Kd = KD;
sPID.PreU = 0 ; //电机控制输出值
}
unsigned int v_PIDCalc( PID *pp )
{
signed long error,d_error,dd_error;
error = (signed long)(pp->Ref - pp->Back); // 偏差计算
d_error = error - pp->PreError;
dd_error = d_error - pp->PreDerror;
pp->PreError = error; //存储当前偏差
pp->PreDerror = d_error;
if( ( error < VV_ERRORMAX ) && ( error > -VV_ERRORMAX ) ); //设置调节死区
//速度PID计算
pp->PreU += (signed long)( pp -> Kp * d_error + pp -> Ki * error + pp->Kd*dd_error);
else if( pp->PreU >= MAX ) //速度PID,防止调节最高溢出
pp->PreU = MAX;
else if( pp->PreU <= MIN ) //速度PID,防止调节最低溢出
pp->PreU = MIN;
else
;
return ( pp->PreU ); // 返回预调节占空比
}
void main(void)
{
While(1)
{
PWMOUT+=v_PIDCalc( PID *pp );
}
}