4. 电流采样与重构:单电阻、双电阻、三电阻采样原理,相电流重构算法
说到FOC,电流采样是绕不开的核心环节。你想想看,整个矢量控制闭环,反馈回来的电流不准,那后面的PI调节、坐标变换全是白搭。我在项目里见过太多人,算法写得飞起,结果电机一跑就抖,最后查出来是采样环节出了问题。
今天咱们就把电流采样这件事彻底聊透。单电阻、双电阻、三电阻,这三种方案我都亲手调过,各有各的脾气。我会把每种方案的原理、优缺点、以及实际工程中的坑,都给你掰开揉碎了讲清楚。
4.1 为什么电流采样这么重要?
FOC的核心,说白了就是控制电流矢量。你要知道电机转子当前的位置,还要知道三相绕组里实际流了多少电流。位置靠编码器或霍尔,电流就靠采样电阻和ADC。
我习惯把电流采样比作FOC的「眼睛」。眼睛花了,后面再好的算法也白搭。采样不准会导致:
- 转矩脉动变大,电机嗡嗡响
- 效率下降,发热严重
- 高速运行时失控,甚至炸管
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采样需要时间,一般几百纳秒到几微秒。如果下管导通时间小于这个窗口,你就采不到准确的电流值。
// 双电阻采样窗口保护逻辑
#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 相电流重构算法的工程要点
不管你用哪种方案,重构算法都有几个通用要点。我把它总结成三条铁律:
- 采样时刻必须精准: ADC触发要和PWM同步,最好用硬件触发,别用软件定时器。软件触发有抖动,高速时误差会放大。
- 必须做偏置校准: 采样电路总有直流偏置。上电时先采样一次「零电流」值,存下来做减法。我习惯每次上电都做一次自动校准。
- 滤波要适度: 电流采样噪声大,但滤波太狠会引入相位延迟。我一般用一阶低通滤波,截止频率设在PWM频率的1/10左右。
// 一阶低通滤波,截止频率 = PWM_FREQ / 10
#define FILTER_ALPHA 0.15f // 根据采样频率调整
float current_filter(float raw, float prev) {
return prev + FILTER_ALPHA * (raw - prev);
}
4.7 小结
电流采样是FOC的基石。三电阻最稳,双电阻最均衡,单电阻最省钱但也最折腾。我个人建议:
- 做产品原型或学习阶段,用三电阻,省心
- 做量产产品,优先考虑双电阻,性价比最高
- 只有成本压力极大时,才考虑单电阻,并且要做好心理准备——调试周期至少翻一倍
下一章我们会聊到「坐标变换与PI调节器设计」,到时候你会看到,电流采样的质量直接决定了PI调节器的表现。采样不准,PI调得再好也是白费力气。