增量式PID算法的C语言代码

下面给出的可以说是一个最简单的PID代码了,然而麻雀虽小,五脏俱全。对于很多控制场合,用它已经足够了。我力求把代码写得简洁、清晰,而具体的PID算法推导我就不当搬运工了。

typedef struct{
	float limit;		//输出限幅
	float target;		//目标输出量
	float feedback;		//实际输出量	
	float Kp;	
	float Ki;	
	float Kd;	
	float e_0;			//当前误差
	float e_1;			//上一次误差
	float e_2;			//上上次误差
}PID;

#define max(a, b)			(a>b? a:b)
#define min(a, b)			(ae_0 = pid->target - pid->feedback;
	ep = pid->e_0  - pid->e_1;
	ei = pid->e_0;
	ed = pid->e_0 - 2*pid->e_1 + pid->e_2;
	out = pid->Kp*ep + pid->Ki*ei + pid->Kd*ed;
	out = range(out, -pid->limit, pid->limit);
	pid->e_2 = pid->e_1;
	pid->e_1 = pid->e_0;
	return out;
}


在使用的时候,先要定义一个PID结构体

PID pid = {
	100,	//输出限幅
	0,	//目标控制量
	0,	//反馈控制量

	1,	//Kp
	0.5f,	//Ki
	0.1f,	//Kd
	
	0, 0, 0	//e
};

然后创建一个周期任务,通过调用pid_calc()获得控制量的增量,pid_calc()里面只对控制量的增量进行了限幅,有时还需要对控制量进行限幅。

inc_val = pid_calc(&pid);  
control_val += inc_val;  
control_val = range(control_val, MIN_LIMIT, MAX_LIMIT); 




你可能感兴趣的:(c语言)