4. 电流采样原理:三相电流采样方法
好,咱们进入电流环调参前,有个绕不开的话题——电流采样。说白了,FOC 控制的核心就是电流。电流采不准,后面调得再好也是白搭。我见过不少工程师,花大把时间调 PI 参数,结果问题出在采样上,白白浪费了时间。
今天咱们就把三种采样方法掰开揉碎了讲清楚。单电阻、双电阻、三电阻,各有各的脾气。
4.1 三电阻采样法
这是最直观的方法。三个下桥臂各串一个采样电阻,分别测三相电流。你想想看,硬件上最完整,软件上也最简单。
优点:
- 每相独立采样,互不干扰
- 采样窗口宽,时序好安排
- 低速、高速都能用
缺点:
- 成本高,三个电阻加三个运放
- PCB 面积大
- 三路 ADC 同步要求高
采样时序要点:
三电阻采样通常在 PWM 中心对齐时触发。我习惯在 PWM 周期的中间点采样,这时候电流最稳定。具体来说,就是计数器上溢或下溢时触发 ADC。
我的经验: 三电阻采样时,三个 ADC 通道最好用同一个触发源。我在一个项目里吃过亏,三个通道分别触发,结果采样时刻差了几个微秒,电流波形看着就不对劲。
4.2 双电阻采样法
这是目前最常用的方案。只采样两相电流,第三相通过基尔霍夫电流定律算出来。Ia + Ib + Ic = 0,对吧?
优点:
- 成本适中,两个电阻加两个运放
- PCB 布局相对简单
- 性能足够大多数应用
缺点:
- 低调制比区域采样困难
- 需要处理扇区切换时的盲区
这里有个关键问题——什么时候采不到?当 PWM 占空比接近 0% 或 100% 时,某个下桥臂导通时间太短,电流还没稳定,ADC 就触发了。这就是所谓的“采样盲区”。
避坑指南: 我曾经在一个伺服项目里,电机低速运行时电流噪声特别大。查了两天,最后发现是采样时刻刚好落在下桥臂关断的瞬间。后来我把采样点往中间移了移,问题就解决了。
双电阻采样时序:
// 伪代码示例:双电阻采样触发逻辑
if (PWM_Counter == PWM_Period/2) {
// 中心对齐触发
ADC_StartConversion(CH_A);
ADC_StartConversion(CH_B);
// CH_C = -(CH_A + CH_B)
}
4.3 单电阻采样法
单电阻采样,说白了就是只用一个电阻,通过在不同时刻采样来重构三相电流。成本最低,但难度最大。
原理: 母线电流在不同开关状态下,流经的相不同。通过在不同 PWM 状态切换时采样,就能推算出各相电流。
优点:
- 成本极低,一个电阻一个运放
- PCB 面积最小
缺点:
- 采样时序极其复杂
- 低速性能差
- 对 ADC 采样速度要求高
- 噪声大,精度低
采样时序分析:
单电阻采样需要在每个 PWM 周期内采样两次。第一次在状态切换后,第二次在另一个状态切换后。两次采样值通过矩阵运算,解出三相电流。
举个例子:在扇区 I 时,第一次采样得到 Ia,第二次采样得到 -Ic,然后算出 Ib = -(Ia + Ic)。
误差来源:
| 误差类型 | 原因 | 影响 |
|---|---|---|
| 采样时刻误差 | ADC 触发延迟 | 电流相位偏移 |
| 振铃误差 | 开关管导通瞬间的振荡 | 采样值偏大或偏小 |
| 死区时间误差 | 上下桥臂切换时的死区 | 电流重构失真 |
| ADC 量化误差 | ADC 分辨率有限 | 低速时电流纹波大 |
我的建议: 如果你刚开始做 FOC,别碰单电阻。先老老实实用双电阻或三电阻。单电阻采样看着省钱,但调试时间成本高得多。我见过一个团队,单电阻方案调了三个月还没搞定,最后换回双电阻,一周就跑起来了。
4.4 三种方法对比
| 项目 | 三电阻 | 双电阻 | 单电阻 |
|---|---|---|---|
| 成本 | 高 | 中 | 低 |
| 精度 | 高 | 中高 | 低 |
| 采样时序复杂度 | 低 | 中 | 高 |
| 低速性能 | 好 | 中 | 差 |
| 高速性能 | 好 | 好 | 中 |
| 适用场景 | 高端伺服 | 工业驱动 | 低成本消费类 |
4.5 采样误差分析与补偿
不管用哪种方法,误差总是存在的。咱们得知道误差从哪来,怎么补。
主要误差源:
- 偏置误差: 运放的输入偏置电压。表现为电流零点偏移。
- 增益误差: 采样电阻精度、运放增益偏差。表现为电流幅值不准。
- 相位延迟: 从电流变化到 ADC 采样完成,存在延迟。
- 噪声干扰: 开关管动作产生的共模噪声。
注意: 偏置误差可以通过软件校准。我一般在电机静止时,连续采样 100 次取平均,作为零点偏置。然后每次采样都减去这个偏置值。增益误差嘛,需要外部标准电流源来标定。
补偿方法:
// 偏置校准示例
float offset_A = 0;
for (int i = 0; i < 100; i++) {
offset_A += ADC_Read(CH_A);
}
offset_A /= 100; // 零点偏置
// 实际使用时
float Ia = ADC_Read(CH_A) - offset_A;
float Ia_scaled = Ia * gain_A; // 增益校准
我的习惯: 每次上电都做一次偏置校准。温度变化会影响运放的偏置,所以如果环境温度变化大,建议定期重新校准。嗯,这个细节很多人会忽略。
好了,电流采样这块就讲这么多。三种方法各有适用场景,我个人最推荐双电阻,性价比最高。下一节咱们开始讲电流环的 PI 参数整定,那才是真正考验功夫的地方。