Skip to content

PID

PID,是一种常见的控制器,即使用比例积分微分对误差进行控制的一种算法。

适用系统:二阶以内线性系统,齐次性,叠加性的系统。

数学公式

err(t) 为误差, target(t) 为目标值, feedback(t) 为反馈值,则有 err(t)=target(t)feedback(t)

u(t) 为控制信号,则 PID 可以表示为如下形式

u(t)=Kperr(t)+Kierr(t)dt+Kdddterr(t) 

将以上公式进行拉普拉斯变换后可得(拉普拉斯变换我也没学,等后面学了再补充吧)

u(s)=Kperr(s)+Ki1serr(s)+Kdserr(s)u(s)=(Kp+Ki1s+Kds)err(s)

故可得 PID 传递函数

C(s)=(Kp+Ki1s+Kds)

参数解释

Kp :比例控制,与 err 成一次函数关系,即误差大时,增量大,误差小时,增量减小。

Ki :积分控制,消除稳态误差,使输出值缓慢调整至目标值附近。

Kd :微分控制,可理解为阻尼作用,使受控对象迅速趋近目标值,减少振荡频率和幅度。但需要注意的是 Kd 项对高频噪声敏感,会放大高频噪声,一般不单独使用,如果 Kd 值调试不当,会使受控对象出现高频振动。

代码实现

C
/*增量式*/
pid->now = get_motor->speed;
pid->target = target_speed;
pid->err = pid->target - pid->now;
pid->output = pid->kp * (pid->err - pid->last_err) + pid->ki * pid->err +
              pid->kd * (pid->err - pid->last_err * 2 + pid->previous_err);
pid->previous_err = pid->last_err;
pid->last_err = pid->err;

串级 PID 控制

angle->speed

角度环作为内环,速度环作为外环,角度换的输出值作为速度环的目标值,双重 PID 控制,达到更精确的控制效果。

current->speed

同上述控制方式,读者可以自行思考。

不止如上双环 pid 的控制方式,还可以使用三环四环进行控制。

带前馈的 PID 控制器

为了更精确地控制运动,我们还可以在 PID 的基础上加上一个前馈控制,即 FPID,对目标值进行预测提前调整。由于笔者还未使用过该类型控制器,暂时不写。