4、电流采样与重构:单电阻、双电阻、三电阻采样原理,相电流重构算法

电流采样,说白了就是FOC控制的眼睛。眼睛不好使,算法再牛也白搭。

我刚开始做无传感器FOC时,踩过最大的坑就是电流采样。当时板子转起来好好的,一加载就抖得跟筛子似的。查了三天,最后发现是采样时序差了那么几个微秒。嗯,从那以后,我对电流采样这块就特别较真。

4.1 三种采样方案,怎么选?

目前主流的电流采样方案就三种:单电阻、双电阻、三电阻。各有各的脾气,我一个个说。

4.1.1 三电阻采样——最直接,也最贵

三电阻采样,就是在电机三相的下桥臂各串一个采样电阻。三个ADC通道同时采,三相电流直接读出来。

优点:

  • 三相电流同时获取,不需要重构
  • 采样窗口宽,时序压力小
  • 低速、零速性能好

缺点:

  • 成本高(三个电阻+三个运放+三个ADC通道)
  • PCB面积大
  • 三路增益需要匹配,否则有偏置误差
我的经验: 三电阻方案最适合伺服驱动、机器人关节这类对低速性能要求高的场合。成本不是首要考虑因素时,选它最省心。

4.1.2 双电阻采样——性价比之王

双电阻采样只采两相电流,第三相通过基尔霍夫电流定律算出来:Iu + Iv + Iw = 0,所以 Iw = -(Iu + Iv)。

这是目前工业界最主流的方案。我做过的大部分项目都用的它。

优点:

  • 成本适中(两个电阻+两个运放)
  • 重构算法简单
  • 性能均衡

缺点:

  • 存在不可观测区域(低调制比区域)
  • 需要处理采样死区

4.1.3 单电阻采样——最省钱,也最折腾

单电阻采样只在下桥臂公共端放一个采样电阻。通过在不同PWM状态下采样,重构出三相电流。

说实话,我一般不建议新手上来就搞单电阻。除非成本压得特别死,比如几十块钱的电动工具、风扇驱动这类产品。

优点:

  • 成本最低(一个电阻+一个运放)
  • PCB面积最小
  • 没有增益匹配问题

缺点:

  • 重构算法复杂
  • 存在大量不可观测区域
  • 低速性能差
  • 对PWM同步要求极高
避坑指南: 我曾经在一个风扇项目里硬上单电阻方案,结果低速时电流波形跟狗啃的一样。后来老老实实加了两个采样电阻,问题秒解。单电阻方案,能不用就别用。

4.2 相电流重构算法——单电阻的核心

既然单电阻这么坑,为什么还要讲?因为理解了单电阻的重构原理,你就真正理解了电流采样的本质。

4.2.1 基本原理

单电阻采样的核心思想:在一个PWM周期内,不同开关状态下,流过采样电阻的电流对应不同的相电流。

举个例子,当U相上桥臂导通、V相和W相下桥臂导通时,电流路径是:U相上桥臂 → 电机 → V相和W相下桥臂 → 采样电阻。此时采样电阻上的电流就是U相电流。

同理,通过切换不同的开关状态,我们可以依次采样到两相电流,第三相用基尔霍夫定律算出来。

4.2.2 采样时序与不可观测区域

这里有个关键问题:每次切换开关状态后,电流需要一段时间才能稳定下来。这个时间叫「采样建立时间」,一般需要1-2μs。

如果PWM占空比太靠近0%或100%,有效采样窗口就太短了,根本来不及采。这就是所谓的「不可观测区域」。

核心结论: 单电阻方案在调制比低于15%或高于85%时,基本没法正常工作。双电阻方案也有这个问题,但范围小得多。

4.2.3 重构算法实现

下面给一个简单的单电阻重构伪代码。实际项目中还要加滤波、补偿、异常处理,这里只展示核心逻辑。

// 单电阻相电流重构
// 假设PWM采用中心对齐模式

void CurrentReconstruction(void)
{
    // 获取当前PWM比较值
    uint16_t cmp1 = TIM1->CCR1;  // U相
    uint16_t cmp2 = TIM1->CCR2;  // V相
    uint16_t cmp3 = TIM1->CCR3;  // W相
    
    // 判断当前有效的采样状态
    // 状态1: U上桥臂导通,V、W下桥臂导通 → 采样U相电流
    // 状态2: V上桥臂导通,U、W下桥臂导通 → 采样V相电流
    
    if (cmp1 > cmp2 && cmp1 > cmp3) {
        // U相占空比最大,在PWM周期中间采样U相
        sample_phase = PHASE_U;
        adc_value = ReadADC();
        Iu = adc_value * current_scale;
    }
    else if (cmp2 > cmp1 && cmp2 > cmp3) {
        // V相占空比最大,采样V相
        sample_phase = PHASE_V;
        adc_value = ReadADC();
        Iv = adc_value * current_scale;
    }
    
    // 计算第三相电流
    Iw = -(Iu + Iv);
    
    // Clarke变换
    Ialpha = Iu;
    Ibeta = (Iu + 2*Iv) / 1.732f;
}

4.3 采样误差分析与补偿

采样误差这东西,你不管它,它就会在控制环路里放大,最后表现为转矩脉动、噪音、甚至震荡。

4.3.1 常见误差来源

误差类型 原因 影响
偏置误差 运放输入偏置、ADC偏移 产生直流分量,导致转矩脉动
增益误差 采样电阻精度、运放增益偏差 相电流幅值不匹配,产生2次谐波
时序误差 PWM与ADC触发不同步 采样点偏移,电流畸变
噪声干扰 开关噪声、地弹 采样值抖动,控制不稳定

4.3.2 我的补偿策略

我一般会在初始化阶段做一次自动校准。电机不转的时候,采100次电流取平均,作为偏置值存起来。后面每次采样都减去这个偏置。

增益误差嘛,我习惯用硬件解决——选1%精度的电阻,运放用零漂移的。软件补偿太麻烦,而且效果有限。

一个小技巧: 采样时刻最好选在PWM周期的正中间(中心对齐模式下)。这时候开关噪声最小,电流最稳定。我一般用定时器的更新事件触发ADC,再配合一个可编程的采样延迟,微调采样点位置。

4.4 知识体系总览

下面这张图,把电流采样与重构的核心逻辑串起来了。你照着这个思路去理解,就不会乱。

电流采样与重构知识体系 三电阻采样 双电阻采样 单电阻采样 直接采样三相电流 采样两相,计算第三相 PWM状态切换重构 采样时序与不可观测区域 误差分析(偏置/增益/时序) 补偿策略(校准/滤波/同步) 最终目标:准确、稳定的相电流信息 → FOC控制

电流采样这块,说白了就是「成本」和「性能」的博弈。三电阻省心但费钱,单电阻省钱但费心,双电阻是大多数人的选择。

我个人建议:如果你刚开始做FOC,先拿双电阻方案练手。等把电流环调顺了,再考虑要不要为了省几毛钱去折腾单电阻。毕竟,项目进度比那几毛钱值钱多了。

一句话总结: 采样准不准,决定了FOC能不能用。采样稳不稳,决定了FOC好不好用。别在采样上省钱,否则后面调试的时间成本会让你后悔。

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