PID不严谨的快速理解

PID公式:

\Delta u(t)=kp*[e(k)-e(k-1)]+ki*e(k)+kd*[e(k)-2*e(k-1)+e(k-2)]

Kp:比例

Ki:积分 

Kd:微分

 举栗:水缸深1m,已经有0.2m,需要加满

比例控制:

        u=Kp*error

        error = 1m-0.2m

经过比例控制,最后会水位卡在0.8m,称为暂态误差或稳态误差

积分控制:

        在比例控制下添加积分控制,消除稳态误差。(不严谨的解释积分——堆积一起,这里表示累加)

        Kp*error+Ki*\int error

        \int error=0.8+0.4=1.2        

微分控制:

        当快加满控制倒水量,防止超过容量1m。

        理解刹车:提前刹车减速,防止过线

        u=Kd*[error(t)-error(t-1)]实际微分项绝对值为负数

        

//首先定义PID结构体用于存放一个PID的数据
typedef struct
{
   	float kp,ki,kd;//三个系数
    float error,lastError;//误差、上次误差
    float integral,maxIntegral;//积分、积分限幅
    float output,maxOutput;//输出、输出限幅
}PID;
 
//用于初始化pid参数的函数
void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
{
    pid->kp = p;
    pid->ki = i;
    pid->kd = d;
    pid->maxIntegral = maxI;
    pid->maxOutput = maxOut;
}
 
//进行一次pid计算
//参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
void PID_Calc(PID *pid,float reference,float feedback)
{
 	//更新数据
    pid->lastError = pid->error;//将上一次error存起来
    pid->error = reference-feedback;//计算新error
    //微分
    float dout = pid->kd * (pid->error - pid->lastError);
    //比例
    float pout = pid->kp * pid->error;
    //积分
    pid->integral += pid->ki * pid->error;	//进行累加
    //积分限幅
    if(pid->integral > pid->maxIntegral) 	//是否大于最大输入值
	{
		pid->integral = pid->maxIntegral;
	}
    else if(pid->integral < -pid->maxIntegral) 
	{
		pid->integral = -pid->maxIntegral;
	}
    //计算输出
    pid->output = pout+dout + pid->integral;
    //输出限幅
    if(pid->output > pid->maxOutput) 
	{	
		pid->output = pid->maxOutput;
	}
    else if(pid->output < -pid->maxOutput) 
	{	
		pid->output = -pid->maxOutput;
	}
}
 
PID mypid;//创建一个PID结构体变量
 
int main()
{
    PID_Init(&mypid,10,1,5,800,1000);//初始化PID参数
    while(1)
    {
        float feedbackValue=...;//这里获取到被控对象的反馈值
        float targetValue=...;//这里获取到目标值
        PID_Calc(&mypid,targetValue,feedbackValue);//进行PID计算,结果在output成员变量中设定执行器输出大小(mypid.output);
        delay(10);
    }
}

(不严谨的理解微分——越分越细)

不严谨的PID:P现在;I过去;D未来

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值