3、电流采样与调理:三相电流采样方法
电流采样是FOC的「眼睛」。你想想看,没有准确的电流反馈,你算出来的转子位置、转矩控制全是空中楼阁。我在早期做伺服驱动时,就吃过采样不准的亏——电机低速抖得像筛子,查了三天才发现是采样电阻的温漂在作怪。
这一节,我把三相电流采样的三种主流方案、采样电阻怎么选、运放怎么配、ADC时序怎么对齐,一次性讲透。
3.1 三种采样方案:单电阻、双电阻、三电阻
先看一张总览图,把三种方案的核心差异搞清楚。
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周期的「下桥导通区间」。
以双电阻采样为例,时序是这样的:
- PWM计数器到达峰值或谷值 → 触发ADC启动
- ADC采样保持时间 → 等待采样电容充电(通常≥100ns)
- ADC转换时间 → 逐次逼近(12位ADC约1μs)
- 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就成功了一半。