|
//位置式PID
int32 PID_Realize(PID *sptr, float *PID, int32 NowData, int32 Point)
{
int32 iError, // 當(dāng)前誤差
Realize; // 最后得出的實(shí)際增量
iError = Point - NowData; //計算當(dāng)前誤差
sptr->SumError += PID[KI] * iError; //誤差積分
if (sptr->SumError >= PID[KT])
{
sptr->SumError = PID[KT];
}
else if (sptr->SumError <= -PID[KT])
{
sptr->SumError = -PID[KT];
}
Realize = PID[KP] * iError
+ sptr->SumError
+ PID[KD] * (iError - sptr->LastError)*100;
sptr->PrevError = sptr->LastError; // 更新前次誤差
sptr->LastError = iError; // 更新上次誤差
sptr->LastData = NowData; // 更新上次數(shù)據(jù)
return Realize; // 返回實(shí)際值
}
//增量式PID
int32 PID_Increase(PID *sptr, float *PID, int32 NowData, int32 Point)
{
int32 iError, //當(dāng)前誤差
Increase; //最后得出的實(shí)際增量
iError = Point - NowData; // 計算當(dāng)前誤差
Increase = PID[KP] * (iError - sptr->LastError)
+ PID[KI] * iError
+ PID[KD] * (iError - 2 * sptr->LastError + sptr->PrevError);
sptr->PrevError = sptr->LastError; // 更新前次誤差
sptr->LastError = iError; // 更新上次誤差
sptr->LastData = NowData; // 更新上次數(shù)據(jù)
return Increase; // 返回增量
}
|
評分
-
查看全部評分
|