PID电机控制简单应用

float Pid_realize(float speed)
{
	 
	u8 output;
	mPid.SetSpeed=speed;

	mPid.err=mPid.SetSpeed-mPid.ActualSpeed;
	//mPid.integral+=mPid.err;
	#if 1
	adjustment=mPid.err*mPid.Kp;   //  p  

	if(mPid.output>=LIFT_DUTY_MAX)
	{
		adjustment=adjustment+mPid.integral/100;
	}
	else 
	{

		mPid.integral+=mPid.err*mPid.Ki/10;
		if(mPid.integral<0)
		{
			mPid.integral=0;
		}
		
		adjustment=adjustment+mPid.integral/100;

	}

	    mPid.err*=10;
		adjustment+=((mPid.err-mPid.err_last)/10)*(mPid.Kd);
		mPid.err_last=(mPid.err_last * 9 + mPid.err) / 10;
        adjustment /=  20;
		
		mPid.output=adjustment;

		if(mPid.output>=LIFT_DUTY_MAX)
		{
			mPid.output=LIFT_DUTY_MAX;
		}
		else if(mPid.output<=LIFT_DUTY_MIN)
		{
			mPid.output=LIFT_DUTY_MIN;
		}

	return  mPid.output;
	#else 

	
	mPid.voltage=mPid.Kp*mPid.err+mPid.Ki*mPid.integral+mPid.Kd*(mPid.err-mPid.err_last);
	mPid.err_last=mPid.err;
	output=mPid.voltage/100.0;
	if(output>=LIFT_DUTY_MAX)
	{
		output=LIFT_DUTY_MAX;
	}
	else if(output<=LIFT_DUTY_MIN)
	{
		output=LIFT_DUTY_MIN;
	}

	
	return output;  //	pid.ActualSpeed;
	
	#endif
}


void pid_ini(float p,float i,float d)
{
	float j,k,l;
	j=p;k=i;l=d;
	mPid.SetSpeed=0.0;
	mPid.ActualSpeed=0.0;
	mPid.err=0.0;
	mPid.err_last=0.0;
	mPid.voltage=0.0;
	mPid.integral=0.0;
	mPid.Kp=j;
	mPid.Ki=k;
	mPid.Kd=l;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值