先上代碼
#define MAX_DUTY 100 //輸出最大占空比
PID sPID;
static pPID sptr;
void IncPIDInit(void)
{
sptr = &sPID;
sptr->SetSpeed = 1000; //設定值
sptr->LastError = 0u; //前2次誤差值
sptr->PrevError = 0u; //前1次誤差值
sptr->Proportion = 0.41f; //比例
sptr->Integral = 0.25f; //積分
sptr->Derivative = 0.12f; //微分
sptr->iError = 0; //當前誤差
sptr->iIncpid = 0; //增量誤差
sptr->Uk = 0; //輸出回傳值
}
int IncPIDCalc(int tag_speed)
{
int duty_pwm;
//當前速度誤差
sptr->iError = sptr->SetSpeed- currentSpeed;
//增量誤差
sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError
+ sptr->Derivative * sptr->PrevError;
//存盤誤差,用于下次計算
sptr->PrevError = sptr->iError;
sptr->LastError = sptr->LastError;
sptr->Uk += sptr->iIncpid;
duty_pwm = sptr->Uk*0.2f;
//輸出值限幅
if (duty_pwm >= MAX_DUTY)
{
duty_pwm = MAX_DUTY;
}
else if(duty_pwm <= 0u)
{
duty_pwm = 0;
}
return duty_pwm;
}
初次調PID,有幾個問題請教下
1. 使用增量式PID,通過目標速度和當前速度換算得到增量誤差,sptr->iIncpid怎么換算得到PWM占空比,我得到空載100%占空比轉速為500轉,那是不是可以通過系統0.2來換算
2. sptr->iIncpid增量誤差是不是就是需要調整的速度偏差值,即下一次需要整改的速度
3.系數 kp ki kd該怎么調整,通過仿真還是自己一個一個看速度曲線盲調
uj5u.com熱心網友回復:
如果電機空載和帶載情況下,是否系數還需要單獨分成兩組
uj5u.com熱心網友回復:
sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError+ sptr->Derivative * sptr->PrevError;紅色部分不正確,
ei=目標值-當前值;
PID=Kp*ei +Ki*Sum(ei)+Kd(ei-ei1);//ei當前的誤差值,ei1上次誤差值
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273433.html
標籤:單片機/工控
上一篇:運放電路求教!
