增量式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)			(a<b? a:b)
#define range(x, a, b)		(min(max(x, a), b))
#define exchange(a, b, tmp) (tmp=a, a=b, b=tmp)
#define myabs(x)			((x<0)? -x:x)

float pid_calc(PID *pid)
{
	float out;
	float ep, ei, ed;
	
	pid->e_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); 




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值