4. 电流采样与重构:单电阻、双电阻、三电阻采样原理、采样时刻选择、低端与高端采样、电流重构算法

电流采样是FOC的「眼睛」。没有准确的电流反馈,你的PI环调得再好也是白搭。我见过不少新手,花大把时间调参数,结果发现是采样电路出了问题——相位电流根本不准。

这一章,我们就把电流采样这件事彻底讲透。从硬件拓扑到采样时刻,再到重构算法,全部覆盖。

4.1 三种采样拓扑:单电阻、双电阻、三电阻

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

电流采样拓扑对比 三电阻采样 • 3个下桥臂串联采样电阻 • 每相独立采样 • 直接得到Ia、Ib、Ic • 无需重构,精度最高 • 成本高,占用3路ADC 双电阻采样 • 2个下桥臂采样电阻 • 采样两相电流 • 第三相通过基尔霍夫计算 • 性价比之选 • 需2路ADC,中等精度 单电阻采样 • 直流母线串联1个电阻 • 通过PWM状态重构三相电流 • 成本最低,仅1路ADC • 算法复杂,低速区有盲区 • 适合低成本量产 关键参数对比 参数 三电阻 双电阻 单电阻 ADC通道数 3 2 1 重构算法 无 简单 复杂 低速性能 优秀 良好 有盲区 成本 高 中 低 应用场景 伺服、高端 通用工业 消费、家电

4.2 采样时刻选择:为什么不能随便采?

很多人以为电流采样就是「ADC一触发,数据就出来」。其实没那么简单。PWM开关动作会产生巨大的共模噪声和尖峰,如果你在开关切换瞬间采样,读回来的数据基本是废的。

我个人习惯把采样时刻放在PWM载波的波峰或波谷。为什么?因为这时候所有开关管都处于稳定导通或关断状态,母线电流没有剧烈变化。

核心原则:采样时刻必须避开开关管导通/关断的瞬态过程。一般建议在PWM周期中点(波峰或波谷)触发ADC,此时噪声最小,采样值最稳定。

4.2.1 低端采样 vs 高端采样

这里有个概念容易混淆——低端采样和高端采样。

  • 低端采样:电阻串联在下桥臂MOSFET的源极与GND之间。优点是共模电压低,运放好选,成本低。缺点是无法在零矢量期间采样(因为下管关断时电流不流过电阻)。
  • 高端采样:电阻串联在母线正端与上桥臂漏极之间。共模电压高,需要差分运放或隔离运放,成本高。但可以在任意时刻采样。

我做过一个项目,客户要求极低成本,选了低端单电阻方案。结果在低速重载时,电流重构总是失败。后来发现是采样窗口太窄,ADC还没来得及稳定,PWM状态就变了。

经验之谈:低端采样时,务必保证ADC采样保持时间足够长。我一般设置采样时间 ≥ 500ns,配合适当的硬件滤波(RC截止频率约1-2MHz),效果不错。

4.3 单电阻电流重构算法

单电阻采样是成本最低的方案,也是算法最复杂的方案。它的核心思想是:在直流母线上只放一个电阻,通过PWM开关状态的变化,在不同时刻「偷看」不同相的电流。

4.3.1 重构原理

三相逆变器有8种开关状态(6个有效矢量和2个零矢量)。在某个有效矢量期间,直流母线电流等于某一相的相电流。比如:

  • 矢量V1 (100):母线电流 = Ia
  • 矢量V2 (110):母线电流 = -Ic
  • 矢量V3 (010):母线电流 = Ib
  • 矢量V4 (011):母线电流 = -Ia
  • 矢量V5 (001):母线电流 = Ic
  • 矢量V6 (101):母线电流 = -Ib

所以,只要在PWM周期内,在两个不同的有效矢量期间各采样一次母线电流,就能得到两相电流,第三相通过基尔霍夫定律算出。

4.3.2 采样窗口与最小脉宽限制

这里有个大坑——采样窗口不够宽。单电阻重构要求每个有效矢量的持续时间必须大于ADC采样时间 + 消隐时间。如果调制比很低(比如电机刚启动时),有效矢量时间可能只有几百纳秒,根本不够采样。

我曾经在一个风扇项目上踩过这个坑。电机在100RPM以下时,电流波形乱得一塌糊涂。后来加了「移相补偿」和「预测补偿」才搞定。

注意:单电阻采样在低速区存在「不可观测区域」。当调制比低于某个阈值(通常约0.15-0.2)时,有效矢量时间太短,无法完成两次采样。此时需要采用特殊策略:要么切换到双电阻模式(如果有),要么使用预测/观测器估算电流。

4.3.3 重构算法实现

下面是一个简化的单电阻重构伪代码。实际工程中还要处理ADC偏移、增益校准、滤波等细节。

// 单电阻电流重构 - 简化实现
// 假设PWM采用中心对齐模式

typedef struct {
    float Ia;   // A相电流
    float Ib;   // B相电流
    float Ic;   // C相电流
} PhaseCurrents;

PhaseCurrents reconstruct_current(float Ibus_sample1, float Ibus_sample2,
                                  uint8_t svpwm_state1, uint8_t svpwm_state2) {
    PhaseCurrents currents = {0};

    // 根据SVPWM状态映射母线电流到相电流
    // 第一次采样
    switch(svpwm_state1) {
        case 1:  // 100
            currents.Ia = Ibus_sample1;
            break;
        case 2:  // 110
            currents.Ic = -Ibus_sample1;
            break;
        case 3:  // 010
            currents.Ib = Ibus_sample1;
            break;
        case 4:  // 011
            currents.Ia = -Ibus_sample1;
            break;
        case 5:  // 001
            currents.Ic = Ibus_sample1;
            break;
        case 6:  // 101
            currents.Ib = -Ibus_sample1;
            break;
        default:
            // 零矢量,无法采样
            break;
    }

    // 第二次采样
    switch(svpwm_state2) {
        case 1:
            currents.Ia = Ibus_sample2;
            break;
        case 2:
            currents.Ic = -Ibus_sample2;
            break;
        case 3:
            currents.Ib = Ibus_sample2;
            break;
        case 4:
            currents.Ia = -Ibus_sample2;
            break;
        case 5:
            currents.Ic = Ibus_sample2;
            break;
        case 6:
            currents.Ib = -Ibus_sample2;
            break;
        default:
            break;
    }

    // 计算第三相电流 (Ia + Ib + Ic = 0)
    if (fabs(currents.Ia) < 0.001f) {
        currents.Ia = -(currents.Ib + currents.Ic);
    } else if (fabs(currents.Ib) < 0.001f) {
        currents.Ib = -(currents.Ia + currents.Ic);
    } else {
        currents.Ic = -(currents.Ia + currents.Ib);
    }

    return currents;
}

4.4 双电阻与三电阻采样

双电阻和三电阻方案相对简单,但也有一些细节需要注意。

4.4.1 双电阻采样

双电阻采样两个下桥臂的电流,第三相通过Ia+Ib+Ic=0计算。采样时刻同样要避开开关瞬态。我一般把两个ADC触发时刻对齐到PWM波谷,同时采样两相。

双电阻方案有个好处:即使某一相占空比接近0%或100%,另一相仍然可以正常采样。不像单电阻那样有低速盲区。

4.4.2 三电阻采样

三电阻是精度最高的方案,每相独立采样,没有重构误差。但成本也最高——需要3个采样电阻、3个运放、3路ADC通道。

三电阻采样时,要注意电阻的匹配精度。如果三个电阻阻值不一致,会导致三相电流增益不同,最终在Clark/Park变换后产生转矩脉动。我一般要求电阻精度 ±0.1% 以上,或者做软件校准。

选型建议:

  • 伺服驱动器、机器人关节:三电阻采样,精度优先
  • 通用工业变频器、电动工具:双电阻采样,性价比均衡
  • 风扇、水泵、低成本家电:单电阻采样,成本优先

4.5 采样电路设计要点

最后聊几个硬件上的坑,都是我用示波器烧过保险丝换来的教训。

4.5.1 运放选型

低端采样用单电源运放就行,但要注意输入共模范围必须包含GND。我常用的型号是LMV358、MCP6002,便宜又好买。

高端采样必须用差分运放或隔离运放,比如INA240、AMC1300。千万别用普通运放去采高端——共模电压会把运放烧掉。

4.5.2 滤波与保护

采样电阻两端一定要加RC滤波,截止频率我一般设在1-3MHz。太低会滤掉电流信息,太高又滤不掉噪声。

另外,运放输入端要加钳位二极管(比如BAT54S),防止电机反电动势或开关尖峰把运放打坏。我见过不止一次,有人省了这两个二极管,结果一上电运放就冒烟。

我的调试习惯:新板子第一次上电,先用示波器看采样电阻两端的波形。确认没有超过运放共模范围的尖峰,再开始调软件。这一步能省下大量排查时间。

4.6 本章小结

电流采样是FOC的基石。选哪种方案,取决于你的成本预算和性能要求。单电阻最便宜但算法最复杂,三电阻最贵但最省心,双电阻在中间找到了平衡点。

采样时刻的选择比很多人想象的重要。记住一句话:避开开关瞬态,在PWM波峰或波谷触发ADC。