Algorithm 具有较大且不可预测异常的PID控制回路

Algorithm 具有较大且不可预测异常的PID控制回路,algorithm,embedded,controls,pid,Algorithm,Embedded,Controls,Pid,简短问题 在其他统一控制区域内,是否有处理非常大异常(数量级)的通用方法 背景 我正在研究一种控制算法,它可以驱动电机穿过一个大致一致的控制区域。在无负载/最小负载的情况下,PID控制非常有效(快速响应,几乎没有超调)。我遇到的问题是,通常至少会有一个高负载位置。该位置由用户在安装过程中确定,因此我无法合理地知道何时/何地需要该位置 当我调整PID以处理高负载位置时,它会导致非负载区域出现较大的过冲(这是我完全预料到的)。虽然可以超调中间行程,但外壳上没有机械硬挡块。缺少硬停止意味着任何明显的超

简短问题
在其他统一控制区域内,是否有处理非常大异常(数量级)的通用方法

背景
我正在研究一种控制算法,它可以驱动电机穿过一个大致一致的控制区域。在无负载/最小负载的情况下,PID控制非常有效(快速响应,几乎没有超调)。我遇到的问题是,通常至少会有一个高负载位置。该位置由用户在安装过程中确定,因此我无法合理地知道何时/何地需要该位置

当我调整PID以处理高负载位置时,它会导致非负载区域出现较大的过冲(这是我完全预料到的)。虽然可以超调中间行程,但外壳上没有机械硬挡块。缺少硬停止意味着任何明显的超调都可能/确实会导致控制臂与电机断开(产生死机)

我正在原型化的东西

  • 嵌套PID(远离目标时非常激进,靠近目标时保守)
  • 远离时固定增益,关闭时PID
  • 保守PID(在空载情况下工作)+一种外部控制,用于寻找PID失速并施加额外能量,直到达到目标或检测到快速变化率(即离开高负载区域)
硬件限制

  • 全行程定义
  • 无法添加硬停止(此时)
更新
我的回答并不表明这是最好的解决办法。这只是我当前的解决方案,我想我会与大家分享。

初始解决方案 失速_pwm_输出=pwm/|ΔE|

PWM=最大PWM值
ΔE=上次错误-新错误

初始关系基于电机中无变化,成功提升PWM输出。有关示例输出,请参见下图

这种方法适用于非攻击性PID失速的情况。然而,它有一个不幸(且明显)的问题,即当非攻击性PID能够达到设定点并尝试减速时,失速的pwm输出会上升。当行驶到非负载位置时,该爬升会导致较大的超调

当前解决方案 理论 失速的pwm输出=(kE*PID\U pwm)/|ΔE |

kE=标度常数
PID_PWM=来自非破坏性PID的当前PWM请求
ΔE=上次错误-新错误

我的当前关系仍然使用1/ΔE概念,但使用非侵略性PID PWM输出来确定失速PWM输出。这允许PID在开始接近目标设定点时限制失速pwm输出,但在失速时允许100%pwm输出。需要定标常数kE以确保PWM进入饱和点(下图中高于10000)

伪码 请注意,在我的电流控制逻辑中,校准失速pwm的结果被添加到PID pwm输出中

int calc_stall_pwm(int pid_pwm, int new_error)
{
    int ret = 0;
    int dE = 0;
    static int last_error = 0;
    const int kE = 1;

    // Allow the stall_control until the setpoint is achived
    if( FALSE == motor_has_reached_target())
    {
        // Determine the error delta
        dE = abs(last_error - new_error);
        last_error = new_error;

        // Protect from divide by zeros
        dE = (dE == 0) ? 1 : dE;

        // Determine the stall_pwm_output
        ret = (kE * pid_pwm) / dE;
    }

    return ret;
}
输出数据 失速PWM输出

请注意,在失速PWM输出图中,~3400处的突然PWM下降是一个内置安全功能激活,因为电机无法在给定时间内到达位置

无负载PWM输出