Speed PID adjustment

typedef struct MyPID
{
    
    
	int Target;   //设定目标
	int Uk;       //PID输出
	int Udk;      //PID增量
	int Uk_1;     //保存上一次PID输出
	int P;
	int I;
	u8  b;  //是否积分运算标志
	int D;
	int ek_0;//当前误差
	int ek_1;//上一次误差
	int ek_2;//上上次误差
}PID;

PID Speed_PID;     //定义一个变量,分布了具体的内存空间
PID *Speed_Point = &Speed_PID;

/*********初始化PID**********/
void PIDInit()
{
    
    
	Speed_Point->Target = ;
	Speed_Point->Uk = 0;
	Speed_Point->Udk = 0;
	Speed_Point->Uk_1 = ;
	Speed_Point->P = 3;
	Speed_Point->I = 1;
	Speed_Point->b = 1;
	Speed_Point->D = 1;
	Speed_Point->ek_0         = 0;         //ek=0
    Speed_Point->ek_1         = 0;         //ek-1=0
    Speed_Point->ek_2         = 0;          //ek-2=0
}
//输入位置环偏差输出(设定值),输入当前速度值(测定值)
int SpeedPID(int placeout,int g_Speed_Count)
{
    
    
	Speed_Point->ek_0 = placeout-g_Speed_Count;  //偏差计算
	Speed_Point->Udk = Speed_Point->P*(Speed_Point->ek_0-Speed_Point->ek_1)+Speed_Point_b*Speed_Point->I*Speed_Point->ek_0;   //增量计算
	Speed_Point->Uk = Speed_Point->Uk1+Speed_Point->Udk;//PID输出
//保存误差,用于下一次计算
	Speed_Point->ek_2 = Speed_Point->ek_1;
	Speed_Point->ek_1 = Speed_Point->ek_0;
	Speed_Point->Uk_1 = Speed_Point->Uk;
	if(Speed_Point->Uk >= PWM_Max)
	{
    
    
		return PWM_Max;
	}
	else if(Speed_Point->Uk <= PWM_Min)
	{
    
    
		return PWM_Min;
	}
	return(Speed_Point->Uk);
}

Guess you like

Origin blog.csdn.net/m0_37187962/article/details/106967242