pid.h


/* --------------------------------------------------------------------- * * PID库函数: * 控制器操作函数. * * 修订操作 版本号 日期 修订人 * ------------ ------ ---------- ------------ * 创建 1.0 2018.01.19 Universea * * ---------------------------------------------------------------------*/ #ifndef __PID_H #define __PID_H #include "BasicData.h" typedef struct { uint8_t feedbackDifferentialMode; float kp; /* 比例系数 */ float ki; /* 积分系数 */ float kdExpect; /* 微分系数 */ float kdFeedback; /* 微分反馈系数 */ float kFeedForward; /* 前馈系数 */ }pidArgumentStruct; typedef struct { float err; /* 误差 */ float expectLast; /*上次的期望值 */ float feedbackLast; /*上次的反馈值 */ float feedbackDifferential; /* 反馈微分 */ float feedbackDifferential_ex; /* 反馈微分 */ float expectDifferential; /* 期望微分 */ float errorIntegral; /* 误差积分 */ float out; /* pid输出 */ }pidValueStruct; float pidCalculate( float dTs, /* 周期 */ float feedForward, /* 前馈 */ float expect, /* 期望值(设定值) */ float feedback, /* 反馈值 */ pidArgumentStruct *pidArgument, /* PID参数结构体 */ pidValueStruct *pidValue, /* PID数据结构体 */ float integralErrorLimit, /* 积分误差限幅 */ float integralLimit /* 积分限幅 */ ); #endif
pid.c


/* --------------------------------------------------------------------- * * PID库函数: * 控制器操作函数. * * 修订操作 版本号 日期 修订人 * ------------ ------ ---------- ------------ * 创建 1.0 2018.01.19 Universea * * ---------------------------------------------------------------------*/ #include "PID.h" #include "MyMath.h" #include "MyFilter.h" float pidCalculate( float dTs, /* 周期(单位:秒) */ float feedForward, /* 前馈值 */ float expect, /* 期望值(设定值) */ float feedback, /* 反馈值() */ pidArgumentStruct *pidArgument, /* PID参数结构体 */ pidValueStruct *pidValue, /* PID数据结构体 */ float integralErrorLimit, /* 积分误差限幅 */ float integralLimit /* 积分限幅 */ ) { float differential, hz; hz = safeDivision( 1.0f, dTs, 0 ); /* 控制器频率 */ pidValue->err = (expect - feedback); /* 误差 */ pidValue->expectDifferential = (expect - pidValue->expectLast) * hz; /* 期望值微分 */ if ( pidArgument->feedbackDifferentialMode == 0 ) /* 常规反馈值微分 */ { pidValue->feedbackDifferential = (feedback - pidValue->feedbackLast) * hz; } else{ pidValue->feedbackDifferential = pidValue->feedbackDifferential_ex; } /* 微分值计算 期望值微分 - 反馈值微分 (微分先行,只对反馈微分) */ differential = (pidArgument->kdExpect * pidValue->expectDifferential - pidArgument->kdFeedback * pidValue->feedbackDifferential); /* 误差积分 */ pidValue->errorIntegral += pidArgument->ki * LIMIT( (pidValue->err), -integralErrorLimit, integralErrorLimit ) * dTs; /* 积分限幅 */ pidValue->errorIntegral = LIMIT( pidValue->errorIntegral, -integralLimit, integralLimit ); /* PID输出 */ pidValue->out = pidArgument->kFeedForward * feedForward /* 前馈 */ + pidArgument->kp * pidValue->err /* 比例 */ + differential /* 微分 */ + pidValue->errorIntegral; /* 积分 */ pidValue->feedbackLast = feedback; /*上次反馈值 */ pidValue->expectLast = expect; /*上次期望值 */ return(pidValue->out); }