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

说到FOC,电流采样是绕不开的核心环节。你想想看,整个矢量控制闭环,反馈回来的电流不准,那后面的PI调节、坐标变换全是白搭。我在项目里见过太多人,算法写得飞起,结果电机一跑就抖,最后查出来是采样环节出了问题。

今天咱们就把电流采样这件事彻底聊透。单电阻、双电阻、三电阻,这三种方案我都亲手调过,各有各的脾气。我会把每种方案的原理、优缺点、以及实际工程中的坑,都给你掰开揉碎了讲清楚。

4.1 为什么电流采样这么重要?

FOC的核心,说白了就是控制电流矢量。你要知道电机转子当前的位置,还要知道三相绕组里实际流了多少电流。位置靠编码器或霍尔,电流就靠采样电阻和ADC。

我习惯把电流采样比作FOC的「眼睛」。眼睛花了,后面再好的算法也白搭。采样不准会导致:

  • 转矩脉动变大,电机嗡嗡响
  • 效率下降,发热严重
  • 高速运行时失控,甚至炸管
注意: 电流采样引入的噪声和延迟,往往是FOC系统性能瓶颈的根源。很多工程师花大把时间调PI参数,却忽略了采样环节的优化——这是典型的「头痛医脚」。

4.2 三电阻采样:最经典,也最直观

三电阻采样,就是在逆变器的三个下桥臂各放一个采样电阻。每个PWM周期,你都能同时得到三相电流的信息。这是最直接的方法,也是我最早接触的方案。

工作原理:

当某一相的下管导通时,电流流过采样电阻,产生压降。ADC在合适的时刻采集这个电压,就能算出该相电流。三相轮流导通,你就能得到Ia、Ib、Ic。

关键时序:

采样窗口必须选在下管导通且电流稳定的时刻。我一般会在PWM的中间点触发ADC,因为此时开关噪声最小,电流也最平稳。

// 伪代码:三电阻采样触发逻辑
// 假设PWM中心对齐模式
void ADC_Trigger_Config(void) {
    // 在PWM计数器达到周期值的一半时触发
    PWM->CCR1 = PWM_PERIOD / 2;  // 触发点
    // 同时采集三相电流
    ADC->Start_Group_Conversion();
}
优点:
  • 三相电流同时获取,无需重构
  • 算法简单,适合初学者
  • 低速和零速性能好
缺点:
  • 成本高:需要三个采样电阻+三个运放
  • PCB面积大,走线复杂
  • 电阻一致性要求高,否则引入增益误差

我在一个伺服驱动器项目里用过三电阻方案。当时为了追求极致的低速平稳性,三电阻确实是最省心的选择。但后来量产时发现,三个电阻的温漂不一致,导致低速时电流有偏置——嗯,这个问题折腾了我两周。

4.3 双电阻采样:性价比之选

双电阻采样只用两个下桥臂采样电阻,第三相电流通过基尔霍夫电流定律推算出来:Ia + Ib + Ic = 0,所以Ic = -(Ia + Ib)。

这招很聪明,省了一个电阻和一个运放。我目前大部分项目都在用双电阻方案,性价比确实高。

采样窗口的挑战:

双电阻采样有个关键限制:你必须在同一时刻采集两相电流。如果PWM占空比太小或太大,会导致某一相的下管导通时间过短,ADC来不及采样。

为什么会这样?因为ADC采样需要时间,一般几百纳秒到几微秒。如果下管导通时间小于这个窗口,你就采不到准确的电流值。

我的经验: 双电阻采样最怕「死区时间附近的占空比」。当某一相占空比接近0%或100%时,采样窗口会变得非常窄。我一般会在软件里做「最小采样窗口保护」,如果检测到某相导通时间小于5μs,就改用上一周期的采样值,或者插入额外的PWM脉冲来延长采样窗口。
// 双电阻采样窗口保护逻辑
#define MIN_SAMPLE_TIME_US  5  // 最小采样时间5μs

uint8_t Check_Sample_Window(float duty_cycle) {
    float on_time_us = duty_cycle * PWM_PERIOD_US;
    if (on_time_us < MIN_SAMPLE_TIME_US) {
        return 0;  // 采样窗口不足
    }
    return 1;
}

双电阻的「不可观测区」:

当电压矢量落在某些扇区边界时,两相电流无法同时采样。这时候就需要用到「相电流重构算法」来补全数据。

4.4 单电阻采样:最省钱,也最折腾

单电阻采样,只在直流母线上放一个采样电阻。通过在不同时刻采样,结合PWM状态,重构出三相电流。这是成本最低的方案,但也是我踩坑最多的方案。

原理:

母线电流Idc在不同PWM状态下,等于不同的相电流。比如:

  • 当U相上管导通,V、W相下管导通时,Idc = Iu
  • 当U、V相上管导通,W相下管导通时,Idc = -(Iw)

通过在不同PWM状态下采样两次,就能解出两相电流,第三相用基尔霍夫定律推算。

重构算法的核心:

你需要知道每个PWM周期内,母线电流对应哪一相。这需要根据当前电压矢量的扇区和PWM状态来查表。

// 单电阻相电流重构查表逻辑
typedef struct {
    uint8_t phase1;  // 第一次采样对应的相
    uint8_t phase2;  // 第二次采样对应的相
    int8_t sign1;    // 极性
    int8_t sign2;
} Sample_Map_t;

// 根据扇区查表
const Sample_Map_t sample_map[6] = {
    {PHASE_U, PHASE_W, 1, -1},  // 扇区0
    {PHASE_V, PHASE_W, 1, -1},  // 扇区1
    // ... 其他扇区
};
单电阻的坑:
  • 采样噪声大:母线电流含有大量开关噪声
  • 重构误差:在扇区边界附近,两次采样的时间差会导致重构误差
  • 低速性能差:占空比很小时,采样窗口极窄
  • 需要高速ADC:采样频率至少是PWM频率的2倍以上

我曾经在一个低成本风扇项目里硬啃单电阻方案。当时为了省两毛钱成本,选了单电阻。结果调试了整整一个月,低速时的电流重构总是有毛刺。最后加了一个「采样值滤波+预测补偿」才勉强搞定。说实话,如果不是成本压力极大,我不建议新手碰单电阻。

4.5 三种方案对比总结

方案 成本 精度 算法复杂度 低速性能 适用场景
三电阻 优秀 伺服、机器人、高精度驱动
双电阻 中高 良好 工业驱动、电动工具、通用FOC
单电阻 中低 较差 低成本风扇、泵类、消费电子

4.6 相电流重构算法的工程要点

不管你用哪种方案,重构算法都有几个通用要点。我把它总结成三条铁律:

  1. 采样时刻必须精准: ADC触发要和PWM同步,最好用硬件触发,别用软件定时器。软件触发有抖动,高速时误差会放大。
  2. 必须做偏置校准: 采样电路总有直流偏置。上电时先采样一次「零电流」值,存下来做减法。我习惯每次上电都做一次自动校准。
  3. 滤波要适度: 电流采样噪声大,但滤波太狠会引入相位延迟。我一般用一阶低通滤波,截止频率设在PWM频率的1/10左右。
// 一阶低通滤波,截止频率 = PWM_FREQ / 10
#define FILTER_ALPHA  0.15f  // 根据采样频率调整

float current_filter(float raw, float prev) {
    return prev + FILTER_ALPHA * (raw - prev);
}
避坑指南: 我曾经在双电阻方案里遇到过一个问题——两相电流的采样时刻差了几个微秒,导致重构的第三相电流有相位误差。后来我把ADC配置成「同时采样模式」,两个ADC通道在同一时刻触发,问题就解决了。如果你用的MCU支持同步采样,一定要用上。

4.7 小结

电流采样是FOC的基石。三电阻最稳,双电阻最均衡,单电阻最省钱但也最折腾。我个人建议:

  • 做产品原型或学习阶段,用三电阻,省心
  • 做量产产品,优先考虑双电阻,性价比最高
  • 只有成本压力极大时,才考虑单电阻,并且要做好心理准备——调试周期至少翻一倍

下一章我们会聊到「坐标变换与PI调节器设计」,到时候你会看到,电流采样的质量直接决定了PI调节器的表现。采样不准,PI调得再好也是白费力气。