3. 单电阻电流采样原理:利用下桥臂导通时间重构三相电流,扇区划分与采样窗口

单电阻电流采样,说白了就是只用一个采样电阻,把三相电流都测出来。很多刚入行的工程师听到这里会问:一个电阻怎么测三路电流?这不是魔术,是时序的艺术。

我刚开始做伺服驱动时,也觉得这玩意儿不靠谱。直到有一次在量产项目上,双电阻方案因为PCB空间不够被迫改成单电阻,我才真正把它吃透。今天我就把这里面的门道给你讲清楚。

3.1 为什么能用单电阻测三相电流?

核心原理其实很简单:直流母线电流等于某一时刻导通相电流之和。

你想想看,在SVPWM调制下,每个开关周期内,逆变器的下桥臂总有两个管子是导通的(或者三个都导通)。电流从直流母线流进来,经过两个下桥臂回到地。这时候,母线电流就等于这两相电流的叠加。

具体来说:

  • 当只有两相下桥臂导通时,母线电流 = 这两相电流之和
  • 当三相下桥臂都导通时,母线电流 = 0(因为电流在内部循环)

所以,只要我们在合适的时刻采样母线电流,再结合当前开关状态,就能反推出各相电流。

关键前提:电机三相电流满足基尔霍夫电流定律(KCL),即 iU + iV + iW = 0。知道任意两相,第三相就能算出来。

3.2 扇区划分与采样窗口

这里有个实际问题:什么时候采样?采样多久?这就引出了扇区划分和采样窗口的概念。

SVPWM把空间电压矢量分成6个扇区,每个扇区对应一组特定的开关组合。我习惯用下面的方式理解:

扇区 非零矢量 导通相(下桥臂) 母线电流反映
I V1(100), V2(110) V、W iV + iW = -iU
II V2(110), V3(010) U、W iU + iW = -iV
III V3(010), V4(011) U、V iU + iV = -iW
IV V4(011), V5(001) V、W iV + iW = -iU
V V5(001), V6(101) U、W iU + iW = -iV
VI V6(101), V1(100) U、V iU + iV = -iW

看到规律了吗?每个扇区都能通过一次采样得到某一相的电流(取负号)。但我们需要两相电流,所以必须采样两次。

3.3 两次采样与电流重构

在一个PWM周期内,我们需要在两个不同的时间点采样母线电流。这两个时间点对应不同的下桥臂导通组合。

以扇区I为例:

  1. 第一次采样:在V1(100)矢量作用期间,下桥臂V、W导通,母线电流 = iV + iW = -iU,得到iU
  2. 第二次采样:在V2(110)矢量作用期间,下桥臂W导通(U、V上桥臂导通),母线电流 = iW,直接得到iW
  3. 计算第三相:iV = -iU - iW

嗯,这里要注意:两次采样之间有时间间隔,如果电机转速很高,电流变化明显,就会引入误差。我曾在高速主轴项目上吃过这个亏,后来加了相位补偿才搞定。

我的经验:采样窗口至少要留出1~2μs的死区时间,避开开关管导通瞬间的振荡。ADC触发时刻建议放在PWM定时器计数到比较值后的1/4处,这样信号最稳定。

3.4 单电阻采样的三大痛点

说实话,单电阻方案虽然省成本,但坑也不少。我总结了三类常见问题:

  • 采样盲区:当电压矢量靠近扇区边界时,某个非零矢量的作用时间太短(小于ADC采样保持时间+死区时间),导致无法采样。我曾经在低压大电流项目上被这个问题折磨了两周。
  • 电流重构误差:两次采样时间差导致的电流变化,在高速时尤其明显。解决方案是加入电流预测或插值算法。
  • 噪声干扰:单电阻直接串联在直流母线上,母线电压纹波和开关噪声都会耦合进来。我习惯在ADC前端加一个二阶低通滤波器,截止频率设在1MHz左右。

避坑指南:千万不要在零矢量(V0或V7)期间采样!这时候母线电流为0,采了也是白采。我曾经见过一个同事把采样触发配置错了,结果电流反馈全是零,电机直接飞车。

3.5 扇区划分与采样时序图

下面这张图展示了扇区I内的PWM波形与采样点位置。我习惯用这种方式来检查采样窗口是否足够。

扇区I 单电阻采样时序图 U上桥 V上桥 W上桥 下桥臂导通 V、W W V、W 母线电流 iV+iW=-iU iW 0 采样1 获取iU 采样2 获取iW 0 TPWM/2 TPWM 说明:采样1在V1矢量中间,采样2在V2矢量中间。 两个采样点之间至少间隔3μs以上,确保ADC完成转换。

3.6 采样窗口的约束条件

实际项目中,采样窗口不是想多长就多长。它受三个因素制约:

约束因素 典型值 影响
ADC采样保持时间 0.5~1μs 太短则采样不准
开关管死区时间 0.5~2μs 死区内不能采样
信号建立时间 1~3μs 开关后电流振荡需稳定

所以,一个可靠的采样窗口至少需要2~4μs。如果某个非零矢量的作用时间小于这个值,就进入了采样盲区。

解决方案:当检测到即将进入盲区时,可以主动调整PWM占空比(即移相法),或者切换到双电阻/三电阻采样模式。我一般在代码里预留一个"盲区补偿"函数,实时监测矢量作用时间,低于阈值就触发补偿逻辑。

3.7 代码实现要点

最后,我贴一段伪代码,展示扇区判断和采样点计算的核心逻辑。实际项目中要根据MCU的PWM定时器做适配。

// 扇区判断:根据Vα、Vβ计算扇区号
uint8_t svpwm_sector_calc(float V_alpha, float V_beta) {
    float ref1 = V_beta;
    float ref2 = -0.5f * V_beta + 0.866f * V_alpha;
    float ref3 = -0.5f * V_beta - 0.866f * V_alpha;
    
    uint8_t sector = 0;
    if (ref1 > 0) sector |= 0x01;
    if (ref2 > 0) sector |= 0x02;
    if (ref3 > 0) sector |= 0x04;
    
    // 查表映射
    const uint8_t sector_map[8] = {0, 1, 5, 0, 3, 2, 4, 0};
    return sector_map[sector];
}

// 采样窗口检查:判断两个非零矢量是否足够长
uint8_t sample_window_check(float T1, float T2) {
    const float T_sample_min = 3.0e-6f;  // 最小采样窗口3μs
    if (T1 < T_sample_min || T2 < T_sample_min) {
        return 0;  // 进入盲区,需要补偿
    }
    return 1;  // 窗口正常
}

这段代码我用了好几年,从STM32到TMS320F28379都移植过。核心就是两点:扇区判断要快(用查表代替if-else),采样窗口检查要放在每个PWM周期里跑。

好了,单电阻采样的原理和扇区划分就讲到这里。记住一句话:采样窗口是单电阻方案的命门,设计时一定要留足余量。