PID库与PID基本优化(三)

本系列旨在以我本身写的PID lib为例,讲一下PID的几点基本优化,PID的基本原理网上有不少资料,所以本系列将不会涉及PID的基本实现原理,在这里特别推荐Matlab tech talk的PID教程:https://ww2.mathworks.cn/videos/series/understanding-pid-control.html。html

因为笔者大一在读,尚未学习自动控制原理等课程,所以本系列将不会从自控原理角度展开,相反的,本系列将试图从“直觉”展开,经过直观的描述让你们从直觉上感觉并理解PID的一些包括微分先行、积分分离等基础的优化。算法

因为笔者水平有限,文中不免存在一些不足和错误之处,诚请各位批评指正。ide

1 积分分离

1.1 问题

个人PID库与PID基本优化(二)中提到过,在目标信号瞬间发生变化时,会致使微分项输出出现异常。这样的状况不只会致使微分项出现问题,一样会影响积分项的稳定性。例如在系统启动或者设定值被人为大幅度改变时,因为偏差瞬间增大,偏差的积分会迅速累积,从而致使积分项输出过大,进而产生较大的超调,严重时甚至会引发系统振荡:函数

1.2 解决方案

在消除微分冲击问题时,咱们经过将偏差的微分拆解成两项,去掉其中引发冲击的一项以解决问题。但对于积分项来讲,将偏差的积分拆成两项并删掉目标信号的积分是不现实的,由于这样积分控制就失去了消除静态偏差的能力。学习

所以咱们须要换一种思路,既然在目标信号瞬间变化时,偏差的瞬间增大致使了积分的过度积累。咱们只须要在偏差超过必定阈值时中止积分过程,当偏差小于这个阈值,降至合理范围的时候,咱们再继续积分过程,这样就避免了因为目标信号变化引发的巨大偏差累积到积分项中。优化

从图二中能够看到,积分项是在控制过程开始一段时间后开始积累,避免了过度累积,从而减少了超调:3d

1.3 代码实现

库中并无实现积分分离,而是选择了过渡效果更平缓的变积分策略,所以如下代码并未在库中出现code

static void f_Integral_Separation(PID_TypeDef *pid)
{
    //首先判断该周期内积分项是否为积累趋势
    //只有本次积分为积累趋势才会取消积分项
    //在本篇结束前会详细分析这么处理的意义
    if (pid->Err * pid->Iout > 0)
    {
        if (ABS(pid->Err) <= pid->MaxErr)
            return; //完整积分
        else
            pid->ITerm = 0;//取消积分环节
    }
}

2 变速积分

2.1 问题

变速积分与积分分离解决的问题相同,但在积分分离中,咱们对偏差只有积和不积两种对策,但0和1之间的过渡未免太突兀了,所以咱们引入变速积分的概念。htm

2.2 解决方案

变速积分与积分分离解决的问题的方式大体相同,能够将变速积分理解为积分分离的一个再优化。变速积分用连续函数代替积分分离中单纯的0,1切换。blog

这个连续函数能够是线性的也能够是非线性的,通常咱们使用一个比较简单的形式:

\[ITerm=\left\{\begin{array}{lr}Ki * Err & |Err| \leq B \\Ki*Err*\frac{A-|Err|+B}{A} & B<|Err| \leq A+B \\0 & |Err|>\operatorname{A} + B\end{array}\right. \]

2.3 代码实现

static void f_Changing_Integral_Rate(PID_TypeDef *pid)
{
    if (pid->Err * pid->Iout > 0)
    {
        if (ABS(pid->Err) <= pid->ScalarB)
            return; //完整积分
        if (ABS(pid->Err) <= (pid->ScalarA + pid->ScalarB))
            //使用线性函数过渡
            pid->ITerm *= (pid->ScalarA - ABS(pid->Err) + pid->ScalarB) / pid->ScalarA;
        else
            pid->ITerm = 0;//取消积分环节
    }
}

3 最后的问题

在积分分离与变速积分的代码实现中,我都会在算法开始前判断下当前周期下积分是否为累积趋势,只有在累积趋势下才会经过一些方法抑制积分的过分积累。目的是为了不在控制信号发生变化,致使偏差瞬间反向时,因为偏差过大致使积分限制算法发挥做用,这样一来积分没法迅速减少。在偏差反向过程当中,积分居高不下会致使PID输出持续保持较高水平,从而致使响应严重滞后。

这样的滞后在某些控制频率较低的场合下甚至会致使超调和振荡,下图为前文PID参数保持不变时将目标值归零后控制曲线的变化:

所以,须要在积分分离或变速积分在对积分项进行处理前先判断一下积分是否会累积,若是当前周期的偏差会致使积分减少,则无需抑制积分减少的趋势,由于这两种算法归根结底是为了不积分过分积累而非积分的快速变化。

相关文章
相关标签/搜索