27,509
社区成员




#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;
}
//增量误差 sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError + sptr->Derivative * sptr->PrevError; 红色部分错误,积分部分必须将所有的历史误差累加再乘于积分系数,差分部分才是当前误差减去上次误差乘于差分误差系数! PID系数确定称为整定,先让Ki=Kd=0,由小到大改变Kp,直到不稳定,再加入Ki,同样由小到大调整,再加入Kd,一般,K的基本上是0; [quote=引用 3 楼 玉怀一捧雪 的回复:]存储误差写错了 //存储误差,用于下次计算 sptr->LastError = sptr->iError; sptr->PrevError= sptr->LastError;
//增量偏差
sptr->iIncpid = sptr->Proportion*(sptr->iError - sptr->LastError) + sptr->Integral*sptr->iError,+ sptr->Derivative*(sptr->iError - 2 * sptr->LastError + sptr->PrevError);
我的问题是,偏差值sptr->iIncpid怎么换算到PWM占空比上? 通过目标转速换算得到的误差 直接累加到PWM占空比上? //存储误差,用于下次计算 sptr->LastError = sptr->iError; sptr->PrevError= sptr->LastError;