小车编码电机PID速度环位置式和增量式调试总结

目录

一、位置式PID和增量式PID

二、问题分析

三、参数调节


小车由于在自身重力或摩擦力等因素影响下,实际转速会小于输入转速,导致里程计误差较大。在较小速度情况下可能会出现堵转情况,导致小车在导航过程中输入小幅度角度转动的时候,无法及时调整进而撞到障碍物,因此需要给电机加PID速度环闭环控制。

一、位置式PID和增量式PID

        PID有位置式和增量式,两者各有优缺点。

        位置式PID的输出直接对应系统输出,响应速度快,适用于需要快速响应的系统,但缺点是容易出现积分饱和:当惯性系统达到最大输出值时,由于系统还未达到目标位置,error一直存在,如果没有积分限幅积分项会不断累加,一旦开始反向变化,系统需要一定时间从饱和区退出,会导致系统超调或震荡。

        增量式PID不需要做累加,控制量增量的确定仅与最近三次偏差采样值有关,计算误差对控制量计算的影响较小,当输出达到最大值时,增量自动归零,避免持续饱和,适用于需要平滑控制的系统,如步进电机。缺点是由于输出的是控制量的增量,响应不如位置式PID,更难直接用于控制一些需要精确位置调整的系统

二、问题分析

        我们先采用位置式PID来进行调试,下面给出代码

double PID::compute_positional(double setpoint, double measured_value, short outLimit, short IntegralLimit) {
    outLimit = config_outLimit;
    IntegralLimit = config_IntegralLimit;

    double error = setpoint - measured_value;

    // 当目标值为零时,重置积分项
    if (setpoint == 0.0) {
        integral_pos = 0.0;
    }

    double proportional = kp * error;
    integral_pos += ki * error;
    double derivative = kd * (error - prev_error_pos);

    // 积分限幅
    if (integral_pos > IntegralLimit)
        integral_pos = IntegralLimit;
    else if (integral_pos < -IntegralLimit)
        integral_pos = -IntegralLimit;

    double output_unclamped = proportional + integral_pos - derivative;
    double output = output_unclamped;
    // ROS_INFO("integral_pos=%.1f,output=%.1f",integral_pos,output);

    // 输出限幅
    if (output > outLimit)          output = outLimit;
    else if (output < -outLimit)    output = -outLimit;

    // 抗积分饱和:输出被限幅时调整积分项
    if (output_unclamped != output) {
        integral_pos = output - proportional - derivative;
    }

    prev_error_pos = error;
    return output;
}

小车最大pwm为900,最大线速度0.3m/s,先给小车一个KP=2000,KI和KP都为0,输出限幅和积分限幅为900,目标速度为0.2,输出左右两轮速度波形图如下:

小车速度始终达不到0.2,这里有个矛盾的地方:如果小车速度达到0.2了,则偏差值error为0,那么KP*error为0,output也为0,那么速度为0,速度为0那么error值又不为0,就会有速度输出,形成矛盾,为此我记录了几组数据,得出以下公式:实际速度=f+(目标速度-f)/2,f为小车克服摩擦力的速度,当f为0时,小车实际速度为目标速度一半,此时加入KI,先给个较小值20

可以看到小车速度逐渐到达0.2,分析后得知:小车电机速度环的KP可以帮助小车预先接近目标速度,再此基础上,KI开始进行积分,从积分开始到目标速度的那块红色阴影面积即为最终的pwm值,如下图,当达到目标速度时KP和KI稳定在目标速度进行调节使小车稳定在目标速度

三、参数调节

        个人调参经验:KP<=最大output/最大误差。KI影响增长到目标转速的快慢,但太快会过冲,我对小车的要求使快速到达目标转速,建议大家对着波形调试,将KI调到速度波形可快速到达目标转速,或稍微过冲。KD我个人不建议加,因为小车电机要快速达到目标转速,但KD会抑制速度过快增长,所以KD给0。

KP=2000,KI=200效果:

位置式和增量式效果对比,上面是位置式,下面是增量式,相同参数情况下:

个人觉得差别不大,但增量式在参数较小的情况下变化更平滑,KP=200,KI=20:

增量式PID代码:

double PID::compute_incremental(double setpoint, double measured_value, short outLimit) {
    // 当目标速度为0时,重置历史值
    if (setpoint == 0.0) {
        prev_output_inc = 0.0;
        prev_error_inc1 = 0.0;
        prev_error_inc2 = 0.0;
    }

    double error = setpoint - measured_value;
    double output = prev_output_inc + kp * (error - prev_error_inc1) +
                    ki * error + kd * (error - 2 * prev_error_inc1 + prev_error_inc2);

    prev_error_inc2 = prev_error_inc1;
    prev_error_inc1 = error;
    prev_output_inc = output;

    // 输出限幅
    if (output > outLimit)          output = outLimit;
    else if (output < -outLimit)    output = -outLimit;


    return output;
}

<think>好的,我现在需要回答用户关于编码器在电机速度环位置环中的应用及实现方法的问题。首先,我需要回顾用户提供的引用内容,确保回答准确。引用[1]提到了磁编码器的工作原理测速方法,而引用[2]讨论了FOC中的速度环控制。用户的问题主要集中在编码器在这两个环中的应用实现方式,所以需要分点详细说明。 首先,编码器在速度环中的作用。根据引用[2],速度环需要实际速度反馈,编码器提供脉冲信号来测量转速。常见的测速方法有M法、T法M/T法,需要简要解释这些方法,并提到如何将它们应用于速度环的控制中,比如通过PID调节Iq电流。 接下来是位置环中的应用。位置环依赖编码器的位置反馈,比如绝对式编码器可以直接输出位置信息。需要说明位置环的结构,通常作为外环,速度环作为内环,形成级联控制。还要提到位置环的控制策略,比如PID或前馈控制,以及如何通过编码器信号进行位置补偿。 然后,实现方法部分需要分硬件软件两个方面。硬件方面包括编码器的选型(增量式或绝对式)接口设计;软件方面涉及测速算法、滤波处理以及闭环控制算法的实现,比如参考引用[1]中的代码示例。 最后,应用场景需要结合引用[1][2]提到的机器人、数控机床等,说明高精度控制场景中编码器的重要性。此外,优化方向如多传感器融合误差补偿也需要提及,以增强回答的全面性。 需要确保使用正确的中文术语,避免技术错误,同时保持结构清晰。可能还需要检查是否有遗漏的关键点,例如编码器分辨率对控制精度的影响,或者不同编码器类型(磁编码器与光学编码器)的适用场景差异。另外,用户的问题可能还涉及实现中的具体挑战,如信号噪声处理,但根据当前引用,可能不需要深入展开,除非有必要联系到测速方法中的滤波处理。 总结回答的结构:分速度环应用、位置环应用、实现方法、应用场景、优化方向几个部分,每个部分简明扼要,引用相关文献,并在最后生成相关问题。确保使用正确的LaTeX格式,比如测速公式用$$...$$,行内变量用$...$,如$M$法。</think>### 编码器在电机速度环位置环中的应用及实现方法 #### 一、编码器在速度环中的应用 1. **速度反馈** 编码器通过测量电机转子的角位移变化,生成脉冲信号(如增量式编码器的A/B相),通过$M$法(频率法)、$T$法(周期法)或$M/T$法(混合法)计算转速[^1]。 - **$M$法**:固定时间内的脉冲数计算速度,公式为: $$v = \frac{N}{T \cdot P}$$ 其中$N$为脉冲数,$T$为采样时间,$P$为编码器线数。 - **$T$法**:测量相邻脉冲的时间间隔,适用于低速场景。 - **$M/T$法**:结合两者,兼顾高低速精度[^1]。 2. **闭环控制** 速度环将目标速度与实际速度(来自编码器)的误差输入PID控制器,输出转矩电流$I_q$,通过电流环驱动电机,形成速度-电流双闭环控制[^2]。 #### 二、编码器在位置环中的应用 1. **位置反馈** 绝对式编码器直接输出转子的绝对位置(如AS5047p磁编码器),增量式编码器通过累计脉冲数计算相对位置。位置环作为外环,速度环作为内环,实现级联控制。 2. **位置控制策略** - **位置误差调节**:目标位置与实际位置的误差通过PID或前馈控制器,输出速度指令给速度环。 - **轨迹跟踪**:在数控机床等高精度场景中,编码器实时反馈位置,结合插补算法实现复杂轨迹跟踪。 #### 三、实现方法 1. **硬件设计** - **编码器选型**:根据精度需求选择增量式(低成本)或绝对式(高可靠性)。 - **信号接口**:SPI(AS5047p)、SSI或正交编码接口(QEI)[^1]。 2. **软件算法** - **测速算法**:基于编码器脉冲的$M/T$法实现(示例代码片段): ```c uint32_t calculate_speed(uint32_t pulses, float delta_t) { return pulses / (delta_t * ENCODER_RESOLUTION); } ``` - **滤波处理**:对速度/位置信号进行滑动平均或卡尔曼滤波,抑制噪声。 - **闭环控制**:实现位置环PID调节(目标位置→速度指令→电流输出)[^2]。 #### 四、典型应用场景 1. **工业机器人**:编码器提供关节位置反馈,实现精准运动轨迹。 2. **数控机床**:位置环控制刀具进给量,精度达微米级。 3. **伺服驱动系统**:速度环与位置环协同,满足高动态响应需求[^2]。 #### 五、优化方向 1. **多传感器融合**:结合IMU或光栅尺,提升抗干扰能力。 2. **编码器误差补偿**:针对机械安装偏心、温度漂移进行校准。 3. **高分辨率编码器**:如17位绝对式编码器,提升低速控制平滑性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值