2. 电流环设计:PI控制器参数整定、电流采样与滤波、死区补偿策略

电流环是FOC控制的最内环,也是整个系统的基础。说白了,位置环和速度环调得再好,如果电流环响应慢或者有震荡,那上层控制全是白搭。我个人习惯把电流环比作电机的“肌肉反应”——它必须快、准、稳。

这一章我们重点解决三个问题:PI参数怎么调、电流怎么采得准、死区怎么补。嗯,咱们一个一个来。

2.1 PI控制器参数整定——从理论到实战

电流环的PI控制器,传递函数其实很简单:

G(s) = Kp + Ki/s

但参数怎么给?我见过很多新手直接套公式,结果电机嗡嗡响。为什么?因为实际系统有延迟、有采样误差、有死区,纯理论算出来的值往往偏大。

2.1.1 带宽法整定(推荐)

我个人最常用的方法是带宽法。先确定你想要的电流环带宽,比如1kHz,然后反推PI参数。

参数 公式 说明
Kp L × ωc L为电机相电感,ωc为目标带宽角频率
Ki R × ωc R为电机相电阻,ωc = 2π × fc

举个例子,电机电感L=0.5mH,电阻R=0.1Ω,目标带宽fc=800Hz:

ωc = 2 × 3.14 × 800 = 5026 rad/s
Kp = 0.0005 × 5026 = 2.513
Ki = 0.1 × 5026 = 502.6

注意,这个算出来的是连续域的值。离散化的时候,我习惯用后向差分法:

Ki_discrete = Ki × Ts

其中Ts是电流环控制周期。如果Ts=100μs,那Ki_discrete = 502.6 × 0.0001 = 0.05026。

实战技巧: 算出来的Kp和Ki可以先打七折。我在项目中发现,理论值直接上电,电机大概率会啸叫。先给70%,跑起来再慢慢加,稳得多。

2.1.2 手动调试步骤

如果你没有电机参数,或者参数不准,那就手动调。我总结了一套“三步法”:

  1. 先调Kp: Ki设为0,慢慢增大Kp,直到电流响应出现轻微震荡。记下这个值,然后取60%~70%。
  2. 再加Ki: 保持Kp不变,慢慢增加Ki,直到稳态误差消失。注意,Ki太大会导致超调。
  3. 微调: 同时微调Kp和Ki,观察阶跃响应。我一般要求上升时间在1~2个控制周期内,超调不超过5%。
避坑指南: 我曾经在一个项目里,Ki给得太大,结果电流环低频震荡,电机低速时一抖一抖的。查了两天才发现是Ki饱和了——积分项累积太多,输出限幅后一直退不出来。解决办法是加积分限幅,或者用抗饱和积分(Anti-windup)。

2.2 电流采样与滤波——信号链的命门

电流采样不准,PI调得再好也没用。你想想看,控制器拿到的反馈都是错的,输出怎么可能对?

2.2.1 采样方式对比

采样方式 精度 成本 适用场景
单电阻采样 低 低 低成本、低性能
双电阻采样 中 中 通用FOC,最常用
三电阻采样 高 高 高性能、伺服驱动
霍尔/磁通门 最高 很高 隔离要求高的场合

我个人最常用双电阻采样。成本适中,精度够用。但要注意采样时刻——必须在PWM的中间点采样,避开开关噪声。

2.2.2 采样时刻与同步

STM32的定时器可以触发ADC采样。我习惯这样配置:

// 配置TIM1的TRGO事件触发ADC
TIM1->CR2 |= TIM_CR2_MMS_1;  // 更新事件作为TRGO
// ADC配置为外部触发
ADC1->CR2 |= ADC_CR2_EXTSEL_3 | ADC_CR2_EXTTRIG;
// 采样时间设置在PWM中心对齐模式的计数器上溢/下溢点

为什么要在中心点采样?因为此时相电流刚好稳定,开关管导通状态已经建立,噪声最小。

关键点: 采样窗口必须避开死区时间和开关跳变沿。我一般设置采样点比PWM中心点偏移1~2μs,确保采到的是“干净”的电流值。

2.2.3 滤波策略

采样回来的电流,一定要滤波。但滤波会引入延迟,所以要在“干净”和“快速”之间找平衡。

我常用的三种滤波方式:

  • 一阶低通滤波: 最简单,y[n] = α × x[n] + (1-α) × y[n-1]。α取0.1~0.3,延迟约1~3个采样周期。
  • 中值滤波: 连续采3~5次,取中间值。抗脉冲干扰效果好,但计算量大一点。
  • 卡尔曼滤波: 效果最好,但实现复杂。我只有在高精度伺服项目里才用。

嗯,这里要注意:滤波器的截止频率要远高于电流环带宽。比如电流环带宽1kHz,滤波器截止频率至少10kHz,否则相位滞后会搞乱你的PI控制。

2.3 死区补偿策略——别让死区吃掉你的性能

死区是防止上下桥臂直通的必要手段,但它会带来电流畸变和转矩脉动。我见过一个项目,死区设了3μs,结果电机低速运行时电流波形像锯齿一样,怎么调PI都没用。

2.3.1 死区效应分析

死区导致的实际输出电压与理想电压之间存在误差。这个误差与电流方向有关:

  • 电流流入电机(正方向):实际电压比理想值低
  • 电流流出电机(负方向):实际电压比理想值高

说白了,死区相当于在电流过零点附近引入了一个“死区电压”,导致电流波形出现平顶和畸变。

2.3.2 补偿方法

我常用的死区补偿方法有两种:

方法 原理 优点 缺点
电压前馈补偿 根据电流方向,在电压指令上叠加一个补偿量 实现简单,计算量小 对电流方向检测精度敏感
脉冲宽度补偿 直接调整PWM占空比,抵消死区影响 补偿精度高 需要精确的死区时间参数

我个人偏爱电压前馈补偿法。代码实现大概是这样:

// 死区补偿函数
float deadtime_compensation(float v_ref, float i_phase, float t_dead, float v_bus) {
    float v_comp = 0.0f;
    float v_dead = (t_dead / T_pwm) * v_bus;  // 死区等效电压

    if (i_phase > I_THRESHOLD) {
        v_comp = v_dead;   // 电流正方向,补偿正电压
    } else if (i_phase < -I_THRESHOLD) {
        v_comp = -v_dead;  // 电流负方向,补偿负电压
    } else {
        // 电流过零区域,线性过渡
        v_comp = (i_phase / I_THRESHOLD) * v_dead;
    }

    return v_ref + v_comp;
}
经验之谈: 电流过零区域的线性过渡很重要。如果不做过渡,电流过零点附近会出现补偿跳变,反而引入新的谐波。我一般取I_THRESHOLD为额定电流的5%~10%。

2.4 本章知识结构

下面这张图总结了电流环设计的核心逻辑,从参数整定到采样滤波再到死区补偿,环环相扣:

电流环设计知识结构图 电流环设计核心知识结构 PI参数整定 电流采样与滤波 死区补偿策略 带宽法 手动调试 采样方式 滤波策略 电压前馈 脉宽补偿 三者关系:PI参数决定响应速度,采样滤波决定反馈质量,死区补偿决定输出精度 调试顺序:先调采样滤波 → 再调PI参数 → 最后调死区补偿
总结一下: 电流环设计没有捷径,但有一条清晰的路径——先把采样搞准,再用带宽法粗调PI,最后用死区补偿打磨细节。我在多个项目里验证过,这套流程下来,电流环的响应时间基本能控制在1~2个PWM周期内,电流THD也能降到5%以下。