4、电流采样与调理:三相电流采样方法(低端/高端)、运放电路设计、ADC采样时序与滤波

各位同学,咱们今天聊点实在的。FOC 控制的核心是什么?说白了,就是精确知道电机里此刻的电流是多少。你连电流都测不准,后面的 Clarke 变换、Park 变换全是白搭。我在项目里见过太多人,算法写得飞起,结果一上电电机抖得像筛糠,最后查出来是电流采样环节出了问题。

所以这一章,咱们就把电流采样这件事彻底讲透。从采样方法到运放电路,再到 ADC 时序和滤波,一步不落。

4.1 三相电流采样方法:低端 vs 高端

先问个问题:电流采样电阻放哪儿?这决定了你的采样方式是低端还是高端。

4.1.1 低端电流采样

低端采样,就是把采样电阻放在 MOSFET 的源极和 GND 之间。嗯,这是我最常用的方式,原因很简单——便宜、简单。

  • 优点:共模电压接近 GND,运放好选,成本低。
  • 缺点:采样电阻上的压降会抬高源极电压,影响驱动电路。而且,你只能在下管导通时采样。

我在做一款低压无人机电调时,就用的低端采样。当时图省事,随便找了个几毛钱的运放,结果发现采样波形上全是毛刺。后来换了颗高共模抑制比的运放,问题才解决。

注意:低端采样时,采样电阻的功率要留够余量。我曾经算错功率,电阻直接冒烟了。

4.1.2 高端电流采样

高端采样,电阻放在母线正端和 MOSFET 漏极之间。好处是能一直采样,不受开关状态影响。但代价也大——共模电压高得吓人,运放必须能承受母线电压。

  • 优点:连续采样,不受 PWM 开关影响。
  • 缺点:运放贵,电路复杂,共模抑制比要求高。

我个人习惯,低压小功率(48V 以下)用低端,高压大功率(比如伺服驱动器)用高端。你想想看,高压下低端采样那个共模干扰,处理起来比高端还麻烦。

4.1.3 单电阻采样 vs 三电阻采样

这里再补充一个知识点:采样电阻的数量。

采样方式 电阻数量 适用场景 我的评价
单电阻采样 1个(母线) 低成本、小体积 算法复杂,重构电流有盲区
三电阻采样 3个(每相一个) 高性能、高精度 我推荐新手用这个,省心

单电阻采样看着省成本,但电流重构算法在占空比接近 0% 或 100% 时有盲区。我在一个项目中吃过这个亏,电机低速运行时电流波形完全失真。后来老老实实换回三电阻,世界清净了。

4.2 运放电路设计

采样电阻上的电压很小,一般只有几十到几百毫伏。ADC 的输入范围通常是 0~3.3V 或 0~5V。所以,必须用运放把信号放大。

4.2.1 差分放大电路

最经典的电路就是差分放大。为什么用差分?因为要抑制共模噪声。电机驱动是个强干扰环境,PWM 开关瞬间的 dv/dt 能到几十 V/ns,共模噪声大得离谱。

// 典型差分放大电路参数
// 增益 = Rf / Rin
// 假设采样电阻 0.01Ω,最大电流 10A
// 采样电压 = 0.01 * 10 = 0.1V
// ADC 输入范围 0~3.3V,取增益 20 倍
// 输出 = 0.1 * 20 = 2V,留有余量

Rin = 1kΩ
Rf  = 20kΩ
// 注意:四个电阻必须精密匹配,否则 CMRR 会下降

我建议运放选型时重点关注两个参数:共模抑制比(CMRR)失调电压。CMRR 至少 80dB 以上,失调电压最好低于 1mV。否则放大后的直流偏置会让你怀疑人生。

重要:运放的供电电压也要注意。低压系统可以用 3.3V 单电源运放,但轨到轨输出是必须的。否则你测不到接近 GND 或 VCC 的电流。

4.2.2 偏置与电平移位

电机电流是双向的(正转和反转)。但 ADC 只能测正电压。怎么办?加一个直流偏置,把交流信号抬到 ADC 的中间电平。

举个例子:ADC 参考电压 3.3V,偏置到 1.65V。这样 -1.65V 到 +1.65V 的输入信号,对应 ADC 的 0 到 3.3V。

// 偏置电路设计
// 使用电阻分压 + 电压跟随器
// Vref = 3.3V * R2 / (R1 + R2)
// 取 R1 = R2 = 10kΩ,Vref = 1.65V

// 运放输出 = Vin * Gain + Vref
// 这样 ADC 就能测到正负电流了

嗯,这里要注意:偏置电压的噪声会直接叠加到信号上。我习惯用高精度基准源(比如 REF3033)来产生偏置,而不是直接从电源分压。电源上的纹波会让你抓狂的。

4.3 ADC 采样时序与滤波

电路设计好了,信号也调理好了。但如果你在错误的时间点采样,一切白费。

4.3.1 采样窗口的选择

三相逆变器在 PWM 开关时,电流波形上有巨大的尖峰。这是 MOSFET 开关瞬间的续流电流和寄生参数造成的。如果你在开关瞬间采样,读到的值完全是错的。

正确的做法是:在 PWM 的中间点采样。此时上下管都处于稳定导通或关断状态,电流波形最平缓。

技巧:我一般把 ADC 采样触发点设置在 PWM 计数器的中间值。比如 PWM 周期为 1000 个计数,就在计数值为 500 时触发 ADC。这样能避开开关噪声。

4.3.2 同步采样 vs 顺序采样

三相电流最好同时采样。因为 FOC 计算需要同一时刻的三相电流值。如果顺序采样,A 相和 C 相之间会有时间差,导致计算出的电流矢量有误差。

我用的 STM32 系列 MCU,有 3 个 ADC 可以同步采样。如果 MCU 只有一个 ADC,那就用采样保持电路,或者软件补偿时间差。

// STM32 同步采样配置示例
// 使用 ADC1、ADC2、ADC3 同时采样三相电流
// 触发源:TIM1 的 CC4 事件

// 配置 TIM1 的 CC4 在计数值为 500 时产生触发
TIM1->CCR4 = 500;
TIM1->DIER |= TIM_DIER_CC4DE;

// 配置 ADC 为同步注入模式
ADC1->CR1 |= ADC_CR1_JAUTO;
ADC1->CR2 |= ADC_CR2_JEXTTRIG | ADC_CR2_JSWSTART;

4.3.3 数字滤波

即使采样时序对了,信号上还是会有残留噪声。这时候就需要数字滤波。

我常用的滤波方法有两种:

  • 均值滤波:连续采样 N 次取平均。简单有效,但会引入延迟。
  • 一阶低通滤波:y[n] = α * x[n] + (1-α) * y[n-1]。α 越小,滤波越强,延迟越大。
// 一阶低通滤波实现
// α = 0.1,截止频率约 1.6kHz(采样率 10kHz 时)

float current_filtered = 0.0f;
float alpha = 0.1f;

float filter(float raw_current) {
    current_filtered = alpha * raw_current + (1.0f - alpha) * current_filtered;
    return current_filtered;
}
注意:滤波会引入相位延迟。在高速 FOC 控制中(比如电机转速上万转),过强的滤波会导致电流环响应变慢,甚至引起震荡。我一般把滤波截止频率设置在电流环带宽的 5~10 倍以上。

4.4 实战经验总结

最后,分享几个我在项目中踩过的坑:

  1. 采样电阻的布局:一定要靠近 MOSFET 源极,走线要短而粗。我用 4 层板时,把采样电阻放在顶层,底层铺地,减少寄生电感。
  2. 运放供电去耦:运放电源引脚旁边必须放 0.1μF 和 10μF 电容。我见过有人省了这颗电容,结果运放自激振荡,输出波形全是高频噪声。
  3. ADC 参考电压:不要直接用 MCU 的 VDD 做 ADC 参考。VDD 上有数字电路产生的噪声。我习惯用外部基准源,或者至少用 LC 滤波给 VREF 供电。
  4. 采样时序验证:用示波器同时测量 PWM 波形和 ADC 触发信号,确认采样点确实在噪声最小的位置。我曾经以为时序对了,结果一测发现差了 2μs,刚好落在开关尖峰上。

好了,电流采样这部分就讲到这里。下一章咱们聊 Clarke 变换和 Park 变换,把电流从三相静止坐标系转到两相旋转坐标系。到时候你就知道,为什么电流采样精度直接决定了 FOC 的控制效果。

有什么问题,欢迎在评论区留言。咱们下期见。