3、电流采样与调理:三相电流采样方法

电流采样是FOC的「眼睛」。你想想看,没有准确的电流反馈,你算出来的转子位置、转矩控制全是空中楼阁。我在早期做伺服驱动时,就吃过采样不准的亏——电机低速抖得像筛子,查了三天才发现是采样电阻的温漂在作怪。

这一节,我把三相电流采样的三种主流方案、采样电阻怎么选、运放怎么配、ADC时序怎么对齐,一次性讲透。

3.1 三种采样方案:单电阻、双电阻、三电阻

先看一张总览图,把三种方案的核心差异搞清楚。

三相电流采样方案对比 三电阻采样 每相独立采样电阻 3路运放 + 3路ADC 可同时采样三相电流 精度最高,成本最高 适合高端伺服、机器人 双电阻采样 两相采样,第三相计算 2路运放 + 2路ADC Ia + Ib = -Ic 性价比最优 工业驱动主流方案 单电阻采样 母线单电阻采样 1路运放 + 1路ADC 需重构三相电流 成本最低,算法复杂 低成本家电、风扇 关键对比维度 维度 三电阻 双电阻 单电阻 采样精度 ★★★★★ ★★★★☆ ★★★☆☆ 硬件成本 高 中 低 算法复杂度 低 低 高 适用场景 高端伺服 工业驱动 低成本应用

3.2 三电阻采样——精度天花板

三电阻方案,说白了就是每相下桥臂串一个采样电阻。三路同时采样,互不干扰。我最早做的一款20kW伺服驱动器,用的就是三电阻方案——精度确实好,但成本也感人。

电路结构:三个采样电阻分别接在三相下桥MOSFET的源极与GND之间。每个电阻上的压降直接反映该相电流。

// 三电阻采样时序伪代码
void ADC_IRQHandler(void) {
    // 三路ADC同时触发
    Ia = ADC_GetValue(ADC_CH_A) * (Vref / 4095) / R_shunt / Gain;
    Ib = ADC_GetValue(ADC_CH_B) * (Vref / 4095) / R_shunt / Gain;
    Ic = ADC_GetValue(ADC_CH_C) * (Vref / 4095) / R_shunt / Gain;
    
    // 校验:Ia + Ib + Ic ≈ 0
    if (fabs(Ia + Ib + Ic) > 0.1) {
        // 采样异常,做故障处理
    }
}

我的经验:三电阻方案最大的坑是「地弹噪声」。大电流切换时,GND电位会瞬间跳动。我建议在采样电阻的GND端单独走一条Kelvin连线回ADC参考地,别跟功率地混在一起。

3.3 双电阻采样——工业主流

双电阻采样,只采两相电流,第三相用基尔霍夫定律算出来:Ic = -(Ia + Ib)。这是目前工业驱动最常用的方案,性价比最优。

为什么是两相?因为三相电流之和恒为零(星形连接,且没有零序分量)。你想想看,省一路运放和一路ADC,成本降了三分之一,精度损失却很小。

采样时刻的选择:双电阻采样有个关键点——必须在PWM周期的特定时刻触发ADC。我习惯在PWM载波周期的中间点(即计数器的峰值或谷值)触发采样,这时候三相下桥都导通,电流路径最清晰。

我曾经踩过的坑:双电阻采样在「低调制比」区域(比如电机刚启动时)会出现采样盲区。因为某相占空比太小,下桥导通时间不够ADC建立。解决办法是加「移相采样」或「三次谐波注入」,把采样窗口拉开。

3.4 单电阻采样——成本杀手

单电阻采样,只在母线上放一个采样电阻。通过在不同PWM状态下采样,重构出三相电流。成本最低,但算法最复杂。

它的原理是这样的:母线电流在不同开关状态下,分别等于某一相或两相电流的组合。你需要在两个不同的PWM状态内各采一次,然后解方程组。

// 单电阻电流重构(简化版)
// 状态1:SVPWM矢量V1(100)→ 母线电流 = Ia
// 状态2:SVPWM矢量V2(110)→ 母线电流 = -Ic
// 然后解出 Ia, Ib, Ic

void SingleShuntReconstruct(void) {
    float I_bus_1 = GetBusCurrent(T1);  // 在V1状态采样
    float I_bus_2 = GetBusCurrent(T2);  // 在V2状态采样
    
    Ia = I_bus_1;
    Ic = -I_bus_2;
    Ib = -(Ia + Ic);
}

单电阻的致命弱点:在「扇区边界」和「低调制比」区域,两个采样状态之间的时间间隔可能小于ADC的最小采样时间,导致重构失败。我见过不少工程师在这上面翻车——电机一转起来就电流波形畸变。

3.5 采样电阻选型

采样电阻选型,我总结了四个核心参数:

参数 推荐值 选型理由
阻值 5mΩ ~ 50mΩ 阻值太小信噪比差,太大发热严重
功率 ≥ 2 × I²R 留足余量,防止温漂
温漂 ≤ ±50ppm/°C 温漂直接影响电流精度
电感 ≤ 5nH 低感设计,减少高频噪声

我个人的选型习惯:对于10A以内的驱动,我常用10mΩ/1W的合金电阻;超过20A,我会降到5mΩ,同时用Kelvin接法消除焊盘电阻的影响。

3.6 运放调理电路设计

采样电阻上的压降只有几十毫伏,必须经过运放放大后才能送进ADC。典型的调理电路是这样的:

运放电路拓扑:
  采样电阻 → 差分放大器 → 二阶低通滤波器 → ADC输入

关键参数:
  - 增益:50~100倍(根据ADC参考电压和采样电阻阻值计算)
  - 带宽:≥ 10倍PWM频率(通常1MHz以上)
  - 共模抑制比:≥ 80dB

我常用的运放型号是TI的OPA2350或ADI的AD8606——轨到轨输入输出、低失调电压、高CMRR。千万别用LM358那种通用运放,它的压摆率不够,会吃掉你的电流波形细节。

一个小技巧:在运放输出端串一个100Ω电阻再进ADC,可以抑制运放和ADC采样电容之间的电荷注入效应。这个电阻我是在一次EMC测试失败后才加上的——加了之后,ADC采样值稳定了很多。

3.7 ADC采样时序

ADC采样时序是FOC的灵魂。采早了,电流还没建立;采晚了,电流已经衰减。正确的采样窗口必须对准PWM周期的「下桥导通区间」。

以双电阻采样为例,时序是这样的:

  1. PWM计数器到达峰值或谷值 → 触发ADC启动
  2. ADC采样保持时间 → 等待采样电容充电(通常≥100ns)
  3. ADC转换时间 → 逐次逼近(12位ADC约1μs)
  4. DMA传输 → 结果直接送入内存,不占CPU
// STM32定时器触发ADC配置示例
void ADC_TriggerConfig(void) {
    TIM1->CR2 |= TIM_CR2_CCDS;          // 更新事件触发ADC
    TIM1->ARR = PWM_PERIOD - 1;         // 载波周期
    TIM1->CCR1 = PWM_PERIOD / 2;        // 中点触发
    
    ADC1->CR2 |= ADC_CR2_EXTTRIG;       // 外部触发使能
    ADC1->CR2 |= ADC_CR2_EXTSEL_0;      // 选择TIM1触发
}

注意:ADC采样时刻必须避开PWM开关切换的死区时间。死区时间内,上下桥都关断,电流路径不确定。我建议采样窗口至少离死区结束200ns以上。

3.8 总结:怎么选?

最后给个直接的建议:

  • 做高端伺服、机器人关节 → 三电阻,别犹豫
  • 做工业通用驱动器 → 双电阻,性价比最优
  • 做低成本家电、风扇、泵 → 单电阻,但要做好算法保护

电流采样这件事,硬件决定了天花板,软件决定了你能不能摸到天花板。采样电阻选好了、运放调好了、时序对齐了,你的FOC就成功了一半。