PID控制

PID控制原理

PID 组成

P: 比例
I:积分 消失静态误差
D:微分 具有预判的作用

pid核心代码

float PidControl::IncPIDCalc(IncPID_t *IncPID, float set_val, float cul_val)
{

	//std::cout<<"  "<<IncPID->Kp<<IncPID->Kp<<" set_val =  "<<set_val<<" cul_val = "<<cul_val<<endl;
	//printf("kp = %f ki = %f  set_val= %f, cul_val = %f\n",IncPID->Kp,IncPID->Kp,set_val,cul_val);
	//设定值
	IncPID->set_val = set_val;
	//当前值
	IncPID->cul_val = cul_val;

	//偏差
	IncPID->Ek = set_val - cul_val;

	//比例差值E[k]-E[k-1]
	IncPID->Kp_err = IncPID->Ek - IncPID->Ek_1;

	//积分差值E[k]
	IncPID->Ki_err = 0;
	//-- 抗积分饱和
	//---- 上过调
	if (IncPID->out_val > IncPID->val_max)
	{
		//防止进一步上过调
		if (IncPID->Ek <= 0)
		{
			IncPID->Ki_err = IncPID->Ek;
		}
	}
	//---- 下过调
	else if (IncPID->out_val < IncPID->val_min)
	{
		//防止进一步下过调
		if (IncPID->Ek >= 0)
		{
			IncPID->Ki_err = IncPID->Ek;
		}
	}
	//---- 未过调
	else
	{
		IncPID->Ki_err = IncPID->Ek;
	}

	//微分差值E[k]-2E[k-1]+E[k-2]
	IncPID->Kd_err = IncPID->Ek - IncPID->Ek_1 - IncPID->Ek_1 + IncPID->Ek_2;

	//本次输出
	IncPID->out_val = IncPID->Kp * IncPID->Kp_err; //比例E[k]-E[k-1]
	IncPID->out_val += IncPID->Ki * IncPID->Ki_err; //积分E[k]
	IncPID->out_val += IncPID->Kd * IncPID->Kd_err; //微分E[k]-2E[k-1]+E[k-2]

													//输出限位
	if (IncPID->out_val < IncPID->val_min)
	{
		IncPID->out_val = IncPID->val_min;
	}
	else if (IncPID->out_val > IncPID->val_max)
	{
		IncPID->out_val = IncPID->val_max;
	}

	//更新E[k-2]
	IncPID->Ek_2 = IncPID->Ek_1; //E[k-2] = E[k-1]
								 //更新E[k-1]
	IncPID->Ek_1 = IncPID->Ek; //E[k-1] = E[k]

	return IncPID->out_val;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值