电流环调试(上):PI控制器参数整定、电流采样偏置校准、电流环带宽测试方法

好,咱们开始聊电流环调试。这是整个电机控制里最核心、也最磨人的一环。我常说,电流环调好了,速度环和位置环就是锦上添花;电流环调不好,后面全是白搭。

今天这节,咱们只讲三件事:PI参数怎么整定、电流采样偏置怎么校准、带宽怎么测。嗯,内容不少,但都是硬货。

一、PI控制器参数整定——别急着上自动整定

很多人一上来就开自动整定,结果整出来参数电机嗡嗡响。我个人习惯,先手动摸一遍底。

1.1 先搞清楚你的电机参数

PI整定前,你至少要知道:

  • 定子电阻 Rs(用万用表或LCR表测)
  • d/q轴电感 Ld、Lq(一般厂家会给,或者自己用脉冲法测)
  • 逆变器开关频率 fsw(决定了电流环的极限带宽)

有了这些,才能算初始PI值。我在项目中遇到过,有人拿着别人家的电机参数直接套用,结果电流震荡得一塌糊涂。说白了,每台电机的电气参数都不一样,别偷懒。

1.2 经典PI整定公式(工程版)

对于表贴式永磁同步电机(Ld ≈ Lq),我常用这个公式起步:

// 电流环PI参数工程估算
// 目标带宽:f_bw (Hz),一般取 f_sw / 20 ~ f_sw / 10
// 电机参数:Rs, Ls (Ld ≈ Lq)

Kp = 2 * PI * f_bw * Ls;
Ki = Kp * Rs / Ls;   // 或者 Ki = Kp * (Rs / Ls) * 1.2 留点余量

// 举例:Rs=0.5Ω, Ls=1.2mH, f_sw=10kHz, 目标带宽取500Hz
// Kp = 2 * 3.1416 * 500 * 0.0012 ≈ 3.77
// Ki = 3.77 * 0.5 / 0.0012 ≈ 1570

你想想看,这个公式的本质是什么?是把电流环近似成一阶惯性环节,然后用零极点对消法。实际中,因为数字控制延迟、死区效应,这个值往往偏大。我一般算出来后,先打七折再试。

我的小技巧: 先给一个很小的Kp(比如计算值的30%),Ki给0。然后慢慢加Kp,直到电流响应出现轻微震荡,这时候Kp往回退20%。再加Ki,消除稳态误差。这个方法虽然土,但很稳。

1.3 手动整定的步骤(我常用的)

  1. Ki置零,Kp从小往大加。给一个阶跃电流指令(比如1A),看响应波形。
  2. 找到临界震荡点。当Kp大到让电流开始持续震荡,记下这个Kpcrit
  3. Kp取Kpcrit的0.6~0.8倍。这时候响应应该没有超调,但上升时间还可以。
  4. 加入Ki。从Ki = Kp * (Rs / Ls) * 0.5开始,慢慢加,直到稳态误差消失。
  5. 验证。给一个方波电流指令,看跟踪效果。上升时间、超调量、稳态误差都要看。
注意: 整定过程中,电流限幅一定要设好!我曾经有一次忘了设限幅,Kp加太大,电流直接冲到驱动器保护值,电机差点飞车。嗯,从那以后我每次调参前都先检查限幅值。

二、电流采样偏置校准——小误差,大问题

电流采样偏置,说白了就是零漂。你想想看,电机没转的时候,ADC读回来的电流值应该是0,但实际总有那么几个mA甚至几十mA的偏差。这个偏差在低速时会被积分器放大,导致电机抖动甚至爬行。

2.1 为什么会有偏置?

  • 运放输入偏置电压——硬件天生的,没法完全消除。
  • ADC参考电压误差——参考源不准,采样值就偏。
  • 采样电阻温漂——温度变了,电阻值变,偏置也跟着变。

所以,校准不是做一次就完事的。我建议每次上电都做一次静态校准。

2.2 静态校准方法

电机静止、不给电流指令时,采集N次电流值,取平均,作为偏置量。代码很简单:

// 电流采样偏置校准函数
// 采集1000次,取平均
#define CALIB_SAMPLES 1000

void current_offset_calibration(void)
{
    int32_t sum_iu = 0, sum_iv = 0, sum_iw = 0;
    uint16_t i;
    
    // 确保电机静止,PWM输出关闭或占空比为0
    pwm_disable();
    delay_ms(10);  // 等待电流稳定
    
    for(i = 0; i < CALIB_SAMPLES; i++)
    {
        sum_iu += adc_read_u();
        sum_iv += adc_read_v();
        sum_iw += adc_read_w();
    }
    
    offset_u = sum_iu / CALIB_SAMPLES;
    offset_v = sum_iv / CALIB_SAMPLES;
    offset_w = sum_iw / CALIB_SAMPLES;
    
    // 校准后的电流值 = 原始ADC值 - 偏置
    pwm_enable();
}
关键点: 校准必须在PWM关闭状态下进行。如果PWM开着,即使占空比为0,死区效应也会在采样电阻上产生微小电流,导致校准不准。我踩过这个坑,校准完发现偏置值一直在跳,后来才发现是死区时间没处理好。

2.3 动态偏置补偿(进阶)

静态校准只能解决零电流时的偏置。实际运行时,采样电阻会发热,偏置会漂。如果你做的是高性能伺服,建议加入动态补偿:

  • 在每个PWM周期的空闲时刻,采集一次零电流状态(比如下桥臂全部导通时)。
  • 用滑动平均滤波,实时更新偏置值。
  • 注意:这个方法对硬件时序要求高,不是所有平台都支持。

三、电流环带宽测试方法——别光看仿真,动手测

带宽是衡量电流环性能的核心指标。说白了,就是电流环能跟踪多快的指令变化。你调了半天PI,到底带宽够不够?得测。

3.1 扫频法(最准确)

给电流指令叠加一个正弦波,频率从低到高扫,记录实际电流的幅值和相位。当幅值衰减到-3dB(约0.707倍),或者相位滞后90°时,对应的频率就是带宽。

步骤:

  1. 设定一个直流工作点(比如Id=0, Iq=1A)。
  2. 在Iq指令上叠加一个正弦扰动,幅值取工作点的10%~20%(太大非线性,太小信噪比差)。
  3. 从低频(比如10Hz)开始,逐步增加频率,记录每个频率点的幅值和相位。
  4. 画出伯德图,找到-3dB点。
实测经验: 我一般用上位机配合示波器来做。上位机发扫频指令,示波器抓电流波形,然后手动算幅值比。虽然麻烦,但比仿真靠谱多了。后来我写了个自动扫频脚本,省了不少事。

3.2 阶跃响应法(快速评估)

不想扫频?那就用阶跃响应法。给一个阶跃电流指令,看上升时间。对于一阶系统,带宽和上升时间有个近似关系:

带宽(Hz) ≈ 0.35 / 上升时间(s)

// 举例:上升时间测得0.5ms
// 带宽 ≈ 0.35 / 0.0005 = 700Hz

这个公式只适用于过阻尼或临界阻尼系统。如果你的电流响应有超调,那带宽会比这个估算值高一些,但公式就不准了。

3.3 测试时的注意事项

  • 负载要恒定。带载测试时,负载变化会影响带宽测量结果。我建议先空载测,再带载测,对比看。
  • 采样率要够。电流环带宽如果是1kHz,那你的电流采样率至少得10kHz以上,否则测出来的数据是混叠的。
  • 别忘了死区。死区时间会引入相位滞后,降低实际带宽。如果你的带宽一直上不去,检查一下死区补偿有没有做好。
警告: 带宽不是越高越好。带宽太高,系统对噪声和采样延迟更敏感,容易震荡。我见过有人把电流环带宽调到开关频率的1/5,结果电机高频啸叫,电流波形全是毛刺。一般来说,带宽取开关频率的1/20~1/10是比较稳妥的。

小结一下

今天咱们聊了电流环调试的三个基本功:

  • PI整定——从电机参数出发,手动摸临界点,再细调。
  • 偏置校准——静态校准是基础,动态补偿是进阶,别忽视。
  • 带宽测试——扫频法最准,阶跃法最快,选你合适的。

下一节,咱们会继续聊电流环的下半部分:解耦控制、死区补偿、以及电流环的限幅策略。这些东西在实际调试中同样关键,到时候见。

嗯,今天就到这儿。有什么问题,欢迎交流。


公众号:蓝海资料掘金营,微信deep3321