本文是本人自己做的简单笔记。
高手忽略哈。
typedef struct{
int SetPoint;
long SumError;
float P;
float I;
float D;
int LastError;
int PrevError;
}PID;
void PID_Arg_Init(PID* sptr)
{
sptr->SumError = 0;
sptr->LastError = 0;
sptr->PrevError = 0;
sptr->P = 0.10;
sptr->I = 0.018;
sptr->D = 0.13;
sptr->SetPoint = 50;
}
int PID_Contrl(PID* sptr,int NextPoint)
{
register int iError,iIncPid;
iError = sptr->SetPoint - NextPoint;
iIncPid = sptr->P * iError - sptr->I * sptr->LastError + sptr->D * sptr->PrevError;
sptr->PrevError = sptr->LastError;
sptr->LastError = iError;
return iIncPid;
}
void set_pwm_duty(u16 duty)
{
//
}
PID PID_Temp;
u16 pwm_duty=0;
u16 pid_add=0;
u16 moto_detect_cnt=0;
void pid_test()
{
PID_Arg_Init(&PID_Temp);
moto_detect_cnt=50;
PID_Temp.SetPoint=80;
while(1)
{
pid_add=PID_Contrl(&PID_Temp,moto_detect_cnt);
pwm_duty+=pid_add;
if(pwm_duty>=100)pwm_duty=100;
set_pwm_duty(pwm_duty);
}
}
简单讲解:
比例积分微分三个参数调整,根据项目实际情况不断试错:
sptr->P = 0.10;
sptr->I = 0.018;
sptr->D = 0.13;
速度反馈值,如电机光栅或霍尔脉冲个数反馈 :moto_detect_cnt=50;
目标值:PID_Temp.SetPoint=80;
假设moto_detect_cnt反馈值是50,程序设定的目标值PID_Temp.SetPoint是80,
则此时说明电机速度不够,需要加快速度(增加PWM占空比)
pid_add=PID_Contrl(&PID_Temp,moto_detect_cnt) 就是对比当前的电机速度反馈值和设定的目标值
然后返回需要增加或者减少多少PWM占空比。