4. 电流环调优:自整定算法原理与实现

电流环是电机控制的基石。你想想看,速度环和位置环调得再好,如果电流环响应慢半拍,整个系统就像踩在棉花上。我个人习惯,拿到一个新电机平台,第一件事就是把电流环的底子打好。

但手动调PI参数,说实话挺烦的。电阻电感得测,带宽得算,还得反复试。所以这一章,我们来聊聊怎么让控制器自己把这事干了——电流环自整定。

核心观点:自整定的本质,是用算法代替人工试凑。它通过注入激励信号,在线辨识电机电气参数,然后根据目标带宽自动算出PI增益。

4.1 为什么需要自整定?

我在项目中遇到过好几次这样的情况:电机标称参数和实际测量值差了一大截。尤其是温升之后,电阻能变20%~30%。如果还用出厂那组PI参数,轻则电流震荡,重则直接过流保护。

手动整定的问题在于:

  • 依赖经验——新手调PI像猜谜,老手也得试好几轮
  • 费时间——换一个电机型号就得重来一遍
  • 不准确——靠示波器看波形调,误差其实挺大的

自整定就是为了解决这些痛点。它能在几十毫秒内完成参数辨识,然后自动算出合适的PI值。说白了,就是把工程师从重复劳动里解放出来。

4.2 自整定的核心原理

电流环自整定分两步走:

  1. 参数辨识——测出电机的电阻R和电感L
  2. 增益计算——根据R、L和目标带宽算出Kp和Ki

嗯,这里要注意,参数辨识的精度直接决定了自整定的成败。如果R和L测偏了,后面算出来的PI就是错的。

4.2.1 参数辨识方法

最常用的方法是直流注入法。原理很简单:给d轴注入一个直流电压,然后测电流响应。

具体步骤是这样的:

  1. 电机静止,转子锁住(或者用制动器)
  2. 注入一个已知的直流电压Vd
  3. 等待电流稳定,记录稳态电流Id
  4. 根据欧姆定律算出电阻:R = Vd / Id
  5. 然后注入一个电压阶跃,记录电流上升时间,算出电感:L = τ × R

你可能会问:为什么不直接用万用表测?我在项目里试过,万用表测的是直流电阻,而电机在高频PWM开关下的等效电阻是不一样的。而且,线路阻抗、接触电阻都会引入误差。所以还是让控制器自己测最靠谱。

小技巧:注入电压不要太大,一般选额定电压的5%~10%就行。太大了电流会冲过头,太小了信噪比不够。我习惯先试5%,看电流响应是否平滑,再微调。

4.2.2 增益计算公式

有了R和L,接下来就是算PI参数了。电流环一般设计成一阶低通滤波器的形式,目标带宽用ωc表示。

标准公式:

Kp = L × ωc
Ki = R × ωc

等等,这个公式看起来简单,但有个坑。你看,Kp和Ki都跟ωc成正比。如果目标带宽设得太高,Kp会很大,电流环容易震荡。我曾经在一个项目里把带宽设到了2000 rad/s,结果电流波形像锯齿一样,吓得我赶紧降下来。

实际工程中,目标带宽一般取:

应用场景 推荐带宽 (rad/s) 说明
通用伺服 500 ~ 1000 兼顾响应和稳定性
高速主轴 1000 ~ 2000 需要快速响应,但要注意噪声
机器人关节 300 ~ 600 刚性要求高,带宽不宜过大
大惯量负载 200 ~ 400 带宽太高容易震荡

警告:千万不要把带宽设得超过PWM开关频率的1/10。比如10kHz的PWM,带宽最多设1000 rad/s。再高就超出控制器的能力范围了,系统会不稳定。

4.3 自整定流程

下面这张图展示了完整的自整定流程。我建议你仔细看看,每一步都有讲究。

电流环自整定流程图 电流环自整定流程图 开始自整定 锁住转子 注入直流电压测R 注入阶跃电压测L 计算Kp、Ki 整定完成 注意事项 • 注入电压不宜过大 • 等待电流稳定再采样 • 多次测量取平均值 • 注意温度影响

这个流程看起来简单,但实际实现时有很多细节。我踩过的坑,下面一个一个说。

4.4 实现细节与避坑指南

4.4.1 采样时机

注入直流电压后,电流不会立刻稳定。因为电机绕组有电感,电流上升需要时间。我建议等3~5个电气时间常数(τ = L/R)再采样。

举个例子:如果L=5mH,R=1Ω,那么τ=5ms。等15~25ms再读数,基本就稳了。

4.4.2 噪声处理

PWM开关会产生高频噪声,直接采样的数据波动很大。我曾经吃过这个亏——第一次测出来的R值跳来跳去,根本没法用。

解决办法:

  • 硬件滤波——在ADC前端加RC低通滤波器,截止频率设到PWM频率的1/10
  • 软件滤波——连续采10~20个点,去掉最大最小值,取平均
  • 同步采样——在PWM载波的波峰或波谷时刻触发ADC,避开开关噪声

我的习惯:软件滤波用滑动平均,窗口大小设16。既平滑了噪声,又不会引入太大延迟。你试试看,效果不错。

4.4.3 温度补偿

电阻随温度变化很明显。铜绕组的温度系数大约是0.0039/°C。也就是说,温升50°C,电阻能涨20%。

如果你在冷机状态下自整定,然后电机跑热了,电流环性能就会下降。我建议:

  • 在自整定完成后,记录当前温度
  • 运行时实时监测温度(用NTC或估算)
  • 根据温度实时修正R值,进而修正Ki

代码实现大概是这样:

// 温度补偿示例
float R_actual = R_nominal * (1 + 0.0039 * (T_current - T_calibrate));
float Ki_compensated = R_actual * omega_c;

4.4.4 电感饱和效应

大电流时,磁路会饱和,电感会下降。如果你在轻载下自整定,然后重载运行,实际电感比测出来的小,电流环会偏慢。

我的做法是:在多个电流点下分别测电感,然后做一张查找表。运行时根据当前电流查表修正。

电流 (A) 电感 (mH) 备注
0.5 5.0 轻载,未饱和
2.0 4.7 开始饱和
5.0 3.8 明显饱和
10.0 2.9 深度饱和

4.5 代码实现示例

下面是一个简化的自整定函数。实际产品中要加更多保护逻辑,但核心思路都在这里了。

// 电流环自整定函数
void current_loop_autotune(float target_bandwidth) {
    float R, L, Kp, Ki;
    float V_inject = 0.05 * Vdc;  // 注入5%额定电压
    float I_steady;
    float tau;
    
    // 第一步:锁转子(假设外部已锁住)
    
    // 第二步:测电阻
    set_d_voltage(V_inject);
    delay_ms(20);  // 等待电流稳定
    I_steady = get_d_current();
    R = V_inject / I_steady;
    
    // 第三步:测电感
    set_d_voltage(V_inject * 1.5);  // 阶跃
    uint32_t t_start = get_timer();
    while (get_d_current() < I_steady * 0.632) {
        // 等待电流上升到63.2%
    }
    tau = (get_timer() - t_start) / 1000.0;  // 单位ms转s
    L = tau * R;
    
    // 第四步:计算PI
    Kp = L * target_bandwidth;
    Ki = R * target_bandwidth;
    
    // 第五步:写入寄存器
    set_Kp(Kp);
    set_Ki(Ki);
    
    // 恢复零电压
    set_d_voltage(0);
}

注意:上面的代码为了清晰做了简化。实际工程中,你需要在测电感时加一个过流保护,防止电流冲过头。我曾经有一次忘了加保护,结果电流直接飙到额定值的两倍,还好保险丝扛住了。

4.6 自整定后的验证

整定完了别急着跑。我习惯做三步验证:

  1. 阶跃响应测试——给一个电流阶跃指令,看上升时间是否接近理论值(约0.35/带宽)
  2. 稳态误差检查——让电流稳定在某个值,看实际值和指令值的偏差
  3. 带宽扫频——用扫频仪测电流环的闭环频率响应,确认-3dB点是否在目标带宽附近

如果验证结果不理想,别灰心。自整定不是万能的,有时候电机参数太特殊(比如极低电感电机),或者噪声太大,自整定结果会有偏差。这时候可以手动微调一下Kp和Ki,或者重新做一次自整定,取多次结果的平均值。

嗯,电流环自整定就聊到这里。记住,自整定是个工具,不是万能药。理解它的原理,知道它的局限,你才能真正用好它。