速度环设计:PI参数整定与观测器实战

速度环,说白了就是让电机老老实实按你给的速度转。我做了这么多年驱动,见过太多人把精力全花在电流环上,结果速度环一跑就抖。其实速度环才是决定系统好不好用的关键。

这一章我们重点聊三件事:PI参数怎么调、速度怎么测准、以及速度环和电流环到底怎么配合。嗯,都是实战里绕不开的硬骨头。

速度环PI参数整定

速度环的PI参数,和电流环不太一样。电流环响应快,带宽高,PI参数可以往大了怼。但速度环不行——机械时间常数比电气时间常数大得多,你调快了反而容易振荡。

我个人习惯先调比例,再调积分。比例决定响应速度,积分消除静差。但积分加多了,系统会变「肉」,超调也大。

速度环PI整定口诀(我自己的经验总结):

  • 先给一个小的Kp,让电机能转起来,别抖
  • 慢慢加Kp,直到出现轻微振荡,然后退回70%
  • 加Ki,从0开始慢慢加,直到静差消失
  • 如果超调太大,加一点微分或者做积分限幅

我曾经在一个伺服项目里,Ki给大了,结果电机低速时一窜一窜的,像抽风一样。查了半天才发现是积分饱和。后来加了积分限幅和抗饱和处理,问题才解决。

下面是一个常用的速度环PI结构,我习惯用增量式,避免积分饱和的麻烦:

// 速度环PI - 增量式实现
float speed_pi_ctrl(float target_speed, float actual_speed) {
    float error = target_speed - actual_speed;
    float delta_out;
    
    // 比例项
    float p_out = Kp_speed * error;
    
    // 积分项 - 带限幅
    integral_speed += Ki_speed * error;
    if (integral_speed > INTEGRAL_LIMIT) integral_speed = INTEGRAL_LIMIT;
    if (integral_speed < -INTEGRAL_LIMIT) integral_speed = -INTEGRAL_LIMIT;
    
    // 输出
    float output = p_out + integral_speed;
    
    // 输出限幅
    if (output > OUTPUT_LIMIT) output = OUTPUT_LIMIT;
    if (output < -OUTPUT_LIMIT) output = -OUTPUT_LIMIT;
    
    return output;
}

小技巧:速度环的输出就是电流环的给定值。所以速度环的输出限幅,其实就是电流限幅。我一般把输出限幅设为额定电流的1.5倍,既能保护电机,又不影响动态响应。

速度观测器:M法和T法测速

速度环再牛,测不准速度也是白搭。常用的测速方法就两种:M法和T法。你想想看,一个靠计数,一个靠计时,各有各的适用场景。

方法 原理 适用场景 精度特点
M法 固定时间内计脉冲数 中高速(>100 RPM) 高速时精度高,低速时误差大
T法 测量相邻脉冲的时间 低速(<100 RPM) 低速时精度高,高速时更新慢
M/T法 两者结合 全速域 综合最优,但计算量大

M法实现简单,我早期项目里全用M法。但有一次做低速对位,电机在10 RPM以下转,M法测出来的速度跳得跟心电图似的。后来换成T法,才稳下来。

下面是M法和T法的核心代码,我贴出来供你参考:

// M法测速:固定时间窗口内计数
float m_method_speed(uint32_t pulse_count, float time_window_ms) {
    // pulse_count: 时间窗口内的脉冲数
    // time_window_ms: 时间窗口,单位ms
    // PPR: 编码器线数
    float speed_rpm = (pulse_count * 60.0f * 1000.0f) / (PPR * time_window_ms);
    return speed_rpm;
}

// T法测速:测量两个脉冲之间的时间
float t_method_speed(float pulse_interval_us) {
    // pulse_interval_us: 相邻脉冲间隔,单位us
    float speed_rpm = (60.0f * 1000000.0f) / (PPR * pulse_interval_us);
    return speed_rpm;
}

注意:T法在高速时,脉冲间隔会变得非常短。如果定时器分辨率不够,测出来的速度会跳。我曾经在3000 RPM时用T法,结果速度反馈跳了±200 RPM,后来加了低通滤波才压住。建议高速时切回M法,或者用M/T法自适应切换。

速度环与电流环的级联关系

三环控制里,速度环是外环,电流环是内环。速度环的输出直接给到电流环的给定。这个级联关系,说白了就是「速度环告诉电流环该出多大力」。

但这里有个关键点:电流环的带宽必须远大于速度环。我一般要求电流环带宽是速度环的5-10倍。否则速度环一调整,电流环跟不上,系统就会振荡。

下面这张图是我自己画的级联关系,你看一眼就明白了:

速度环与电流环级联关系图 速度环与电流环级联关系 速度给定 速度PI 电流给定 电流环 电机 速度反馈 关键说明: 1. 速度环输出 = 电流环给定(Iq_ref) 2. 电流环带宽需为速度环的5-10倍 3. 速度环采样周期通常为电流环的5-20倍

从图里你能看到,速度环的输出直接喂给电流环。电流环执行得快,速度环才能稳。我一般把电流环周期设在50-100μs,速度环周期设在500μs-2ms。这样速度环每次更新,电流环已经跑了好几轮了。

还有一个容易忽略的点:速度环的输出限幅。这个限幅值其实就是电流环的峰值电流。如果你把速度环输出限幅设得太大,电流环会一直饱和,速度环就失控了。我习惯把限幅设在电机额定电流的1.2-1.5倍,既能保证加速性能,又不会烧电机。

级联调试顺序(我的标准流程):

  1. 先调好电流环,确保电流响应快且无超调
  2. 电流环闭环,速度环开环,手动给电流看电机转不转
  3. 速度环加比例,从0开始慢慢加,直到速度响应满意
  4. 加积分,消除静差,注意不要加太多
  5. 做阶跃响应测试,看超调和调节时间

嗯,这一章的内容差不多就这些。速度环设计说难不难,说简单也不简单。关键是把PI参数调明白,把速度测准,再把级联关系理清楚。做到这三点,你的速度环基本就稳了。