4. 电流采样与调理电路:采样电阻、运放选型、电流重构技术、ADC配置

电流采样是FOC控制中最关键的一环。说白了,你算法写得再好,电流采不准,一切都是白搭。我刚开始做FOC时,就吃过这个亏——电机转得挺顺,一加负载就抖,查了三天才发现是采样电路噪声太大。

这一章,咱们把电流采样的每个环节都掰开揉碎讲清楚。

4.1 采样电阻:位置与选型

采样电阻放在哪?这是个经典问题。常见的方案有三种:

方案 位置 优点 缺点
三电阻 下桥臂GND侧 采样精度高,适合大电流 需要3个运放,成本高
单电阻 直流母线 成本最低,PCB面积小 重构算法复杂,低速性能差
双电阻 两相下桥臂 性价比高,应用最广 需要电流重构

我个人习惯用双电阻方案。为什么?因为它在成本和性能之间取得了很好的平衡。STM32的FOC库原生支持双电阻重构,省心不少。

4.1.1 电阻值怎么选?

选电阻值,核心就一句话:在最大电流时,采样电压不超过运放的输入范围。

举个例子:

  • 电机峰值电流:10A
  • 运放输入范围:0~3.3V
  • 增益:50倍

那么采样电阻最大压降 = 3.3V / 50 = 66mV。电阻值 = 66mV / 10A = 6.6mΩ。我一般选5mΩ,留点余量。

注意:电阻值不能太小,否则信噪比会恶化。我曾经在一个项目中用了2mΩ的电阻,结果小电流时信号完全被噪声淹没,根本没法用。

4.2 运放选型:关键参数

运放是采样电路的核心。选型时,我重点关注这几个参数:

  • 失调电压:最好小于1mV。失调大了,小电流采样误差会很大。
  • 共模抑制比:至少80dB。电机驱动是强干扰环境,共模抑制比不够,采样信号会被共模噪声污染。
  • 带宽:至少1MHz。FOC的PWM频率一般在10~20kHz,运放带宽不够,信号会失真。
  • 压摆率:至少1V/μs。电流变化很快,压摆率低了,运放跟不上。

我常用的运放型号:

型号 失调电压 CMRR 带宽 压摆率
LMV321 1mV 85dB 1MHz 1V/μs
MCP6002 0.5mV 90dB 1MHz 0.6V/μs
OPA2333 0.01mV 130dB 2MHz 5V/μs

OPA2333性能最好,但价格也贵。如果成本敏感,MCP6002是个不错的选择。

4.3 电流重构技术

双电阻方案只能采样两相电流,第三相电流需要重构。原理很简单:三相电流之和为零。

即:Ic = -(Ia + Ib)

但这里有个坑:采样窗口。PWM开关瞬间,电流会有尖峰,必须避开这段时间采样。

关键点:采样时刻必须选在PWM导通中间,避开开关噪声。我一般设置采样点在PWM周期的25%和75%位置。

STM32的定时器支持这个功能。配置如下:

// 配置ADC触发源为TIM1的TRGO
TIM1->CR2 |= TIM_CR2_MMS_1;  // 更新事件触发
// 设置采样点偏移
TIM1->CCR1 = PWM_PERIOD / 4;  // 25%处采样
TIM1->CCR2 = PWM_PERIOD * 3 / 4;  // 75%处采样

4.3.1 重构的边界条件

电流重构不是万能的。当占空比接近0%或100%时,采样窗口会变得非常窄,甚至消失。这就是所谓的不可观测区域。

解决办法:

  • 使用移相PWM,让采样窗口错开
  • 在不可观测区域使用预测算法,根据上一周期的电流值估算
  • 实在不行,切换到三电阻方案
经验之谈:我在做无人机电调时,遇到过低速抖动问题。后来发现是电流重构在低占空比时失效了。最后用了移相PWM+预测算法,问题才解决。

4.4 ADC配置:精度与速度的平衡

ADC配置直接影响采样精度。STM32的ADC有12位分辨率,但实际有效位数(ENOB)往往只有10~11位。

配置要点:

  1. 采样时间:至少1μs。采样时间太短,电容充不满,精度下降。
  2. 时钟频率:不要超过14MHz。频率高了,ADC内部比较器来不及响应。
  3. 转换模式:使用注入组或规则组。我习惯用注入组,因为它可以打断规则组的转换,保证采样时刻精确。
  4. DMA传输:必须用DMA。CPU去读ADC数据,效率太低。

配置代码示例:

// ADC1初始化
ADC1->CR2 |= ADC_CR2_ADON;  // 使能ADC
ADC1->SMPR2 |= ADC_SMPR2_SMP0_0 | ADC_SMPR2_SMP0_1;  // 采样时间:28.5个周期
ADC1->SQR3 |= 0;  // 规则组通道0
// 注入组配置
ADC1->JSQR |= (1 << 20);  // 注入组长度1
ADC1->JSQR |= (0 << 15);  // 注入组通道0

4.4.1 校准

ADC有偏移误差和增益误差。STM32提供了内置校准功能:

ADC1->CR2 |= ADC_CR2_CAL;  // 启动校准
while(ADC1->CR2 & ADC_CR2_CAL);  // 等待校准完成

但内置校准只能消除芯片本身的误差。如果采样电阻和运放有偏差,还需要软件校准。

重要:软件校准不能省。我见过有人直接用ADC原始值做FOC,结果电机电流控制误差达到20%。加个简单的两点校准,误差就能降到1%以内。

4.5 整体架构图

下面这张图展示了电流采样到ADC的完整链路:

电流采样与调理电路架构 无刷电机 采样电阻 5mΩ 双电阻方案 运放 增益50倍 MCP6002 STM32 ADC 12位 注入组+DMA 关键说明: 1. 采样电阻放在下桥臂GND侧,避免共模电压过高 2. 运放采用差分输入,抑制共模噪声 3. ADC采样时刻由TIM1触发,精确控制在PWM导通中间 4. 采样数据通过DMA直接传输到内存,不占用CPU 5. 软件校准消除采样电阻和运放的偏移误差

4.6 实战中的坑

最后,分享几个我踩过的坑:

  • 地线环路:采样电路的地和功率地必须分开,单点接地。否则,大电流会在GND上产生压降,导致采样误差。
  • 滤波电容:运放输出端加一个100pF的电容,滤除高频噪声。但电容不能太大,否则会引入相位延迟。
  • PCB布局:采样电阻到运放的走线要短,远离PWM信号线。我见过有人把采样线走在PWM线下面,结果采样信号全是开关噪声。
最后一句:电流采样是FOC的基石。花时间把这块做好,后面的控制算法才能发挥出效果。别像我一样,等到电机抖了才回头查采样电路。