第2章 电流采样与调理电路:从电阻选型到ADC触发

电流采样,是FOC控制的第一道关卡。说白了,你电流都测不准,后面算出来的转矩、速度全是空中楼阁。我刚开始做FOC时,就吃过这个亏——采样出来的电流波形看着挺漂亮,电机一转起来就抖得不行。后来才发现,是采样电路里的共模噪声把ADC结果给污染了。

这一章,咱们就把电流采样这条链路从头到尾捋一遍。从采样电阻怎么选,到运放电路怎么搭,再到ADC什么时候触发,最后聊聊滤波那点事。

2.1 相电流采样电阻选型

采样电阻,也叫shunt电阻。它的任务很简单:把电流信号变成电压信号,送给ADC去读。但简单归简单,选型上坑不少。

核心选型指标:

  • 阻值:通常在1mΩ~50mΩ之间。阻值越大,信号幅度越大,但功耗也大。我一般先算一下:最大相电流×阻值,得到的电压不要超过ADC满量程的80%。比如3.3V ADC,最大采样电压留到2.6V左右比较安全。
  • 功率:P = I²R。别忘了留余量,我习惯按2倍额定功率选。电机堵转时电流会飙升,电阻烧了可不是闹着玩的。
  • 温漂:铜箔电阻温漂大,锰铜或合金电阻好一些。温漂50ppm以内的,基本够用。
  • 寄生电感:这个容易被忽略。高频电流下,寄生电感会产生额外压降,导致采样失真。选低电感封装(比如2512、1206)会好很多。

举个例子。一个额定10A的电机,峰值15A。我选5mΩ电阻,峰值压降75mV,功率1.125W。留2倍余量,选3W的电阻。温漂25ppm,封装2512。嗯,这个组合我用了好几个项目,没出过问题。

2.2 运放电路设计:差分 vs 共模

采样电阻上的电压,通常只有几十毫伏。直接送给ADC?不行。ADC的输入范围是0~3.3V,几十毫伏的信号分辨率太差了。所以需要运放把信号放大。

这里有两个关键点:一是放大倍数,二是共模抑制。

2.2.1 差分放大电路

差分放大,是电流采样的主流方案。它只放大采样电阻两端的差模电压,对共模电压有天然的抑制能力。

// 典型差分放大电路参数
// 增益 = Rf / Rin
// 假设 Rf = 10kΩ, Rin = 1kΩ, 增益 = 10
// 采样电阻 5mΩ, 电流 10A → 差模电压 50mV → 输出 500mV

// 共模抑制比 CMRR 是关键指标
// 好的运放 CMRR > 80dB
// 我常用的运放:AD8418, INA240, TSC101

我在项目中遇到过一个问题:差分放大电路输出有直流偏置。查了半天,发现是电阻不匹配导致的。四个电阻只要有一个偏差0.1%,CMRR就会下降不少。所以,我建议用集成差分放大器,内部电阻已经匹配好了,省心。

2.2.2 共模电压问题

电机相线上的共模电压,变化很快。尤其是PWM开关瞬间,共模电压会跳变几十伏。如果运放的共模抑制能力不够,这个跳变就会耦合到输出端,造成采样毛刺。

避坑指南:我曾经在一个项目里,运放输出波形在PWM边沿处出现尖峰,导致ADC采样值忽大忽小。后来加了RC低通滤波,把截止频率设在1MHz左右,尖峰才压下去。记住:运放带宽不是越高越好,够用就行。

2.3 采样时序与ADC触发

电流采样,不是随便什么时候都能采的。PWM开关瞬间,电流波形上有大量噪声。你得挑一个安静的时刻去触发ADC。

这里有个概念叫「采样窗口」。在PWM周期的中间时刻,或者上下桥臂都关断的时刻,电流纹波最小,采样最准。

PWM模式 采样时机 说明
中心对齐PWM PWM周期中点(计数值=0或周期值) 上下桥臂都关断,电流纹波最小
边沿对齐PWM PWM周期开始或结束 需要避开开关噪声,通常加延时
单电阻采样 两个不同PWM状态 需要重构三相电流,时序更复杂

STM32的定时器可以配置为:当计数值到达某个点时,自动触发ADC。我一般用中心对齐模式,在计数值为0时触发ADC1和ADC2同时采样两相电流。这样采样点刚好在PWM周期的正中间,噪声最小。

// STM32定时器触发ADC配置示例
// 使用TIM1中心对齐模式
// 在计数值=0时触发ADC注入组转换

TIM1->CR1 |= TIM_CR1_CMS_1;      // 中心对齐模式2
TIM1->CR1 |= TIM_CR1_CEN;        // 使能定时器

// ADC触发源选择:TIM1_TRGO
ADC1->CR2 |= ADC_CR2_EXTSEL_0 | ADC_CR2_EXTSEL_1;  // TIM1_TRGO
ADC1->CR2 |= ADC_CR2_EXTTRIG;    // 使能外部触发

小技巧:如果PWM频率是20kHz,周期50μs。采样窗口设在25μs处,刚好是周期的中点。这时候电流纹波最小,采样值最接近平均值。我习惯在采样前加一个硬件触发延时,让ADC在开关噪声完全消失后再启动转换。

2.4 硬件滤波与软件滤波

采样回来的电流数据,不可能直接用。里面混着高频噪声、PWM毛刺、量化误差。得滤波。

2.4.1 硬件滤波

硬件滤波,就是在运放输出和ADC输入之间,加一个RC低通滤波器。截止频率怎么选?

  • 太高了,滤不掉噪声。
  • 太低了,会滤掉有用的电流信号,造成相位滞后。

我一般把截止频率设在PWM频率的1/10左右。比如PWM 20kHz,RC截止频率设在2kHz。R取1kΩ,C取82nF,算下来差不多1.94kHz。嗯,够用。

硬件滤波参数速查:

  • PWM 10kHz → RC截止频率 1kHz → R=1kΩ, C=159nF(常用100nF+56nF)
  • PWM 20kHz → RC截止频率 2kHz → R=1kΩ, C=82nF
  • PWM 50kHz → RC截止频率 5kHz → R=1kΩ, C=33nF

2.4.2 软件滤波

硬件滤波之后,还有残留噪声。这时候软件滤波上场。

我常用的软件滤波方法有三种:

  1. 均值滤波:连续采N次,取平均。简单,但会引入N个采样周期的延迟。N一般取4~8。
  2. 一阶低通滤波:y[n] = α × x[n] + (1-α) × y[n-1]。α越小,滤波越强,延迟越大。我习惯α取0.1~0.3。
  3. 中值滤波:取连续3~5次采样的中间值。对脉冲噪声特别有效,但计算量大一点。
// 一阶低通滤波实现
// alpha = 0.2, 截止频率约 0.2 * fs / (2 * PI)
// 采样频率 fs = 20kHz, 截止频率约 637Hz

float current_filtered = 0.0f;
float alpha = 0.2f;

float lowpass_filter(float raw_current) {
    current_filtered = alpha * raw_current + (1.0f - alpha) * current_filtered;
    return current_filtered;
}

注意:软件滤波会引入相位延迟。在电流环里,延迟意味着控制带宽下降。我见过有人把滤波系数设得很小,结果电流环响应慢得像蜗牛。我的经验是:硬件滤波尽量把噪声压到ADC分辨率以内,软件滤波只做微调。别指望软件滤波能包打天下。

2.5 知识结构总览

下面这张图,把电流采样链路的各个环节串起来了。从采样电阻到运放,再到ADC触发和滤波,每一步都有讲究。

电流采样与调理电路知识结构图 电流采样与调理电路知识结构 电流采样链路 采样电阻选型 运放电路设计 ADC触发时序 硬件/软件滤波 阻值/功率/温漂 寄生电感 差分放大 共模抑制 PWM触发 采样窗口 RC低通 均值/低通/中值 核心原则:采样精度决定FOC控制质量 每个环节的噪声都会累积到最终电流值上

这张图把电流采样链路的四个核心环节串起来了。从采样电阻到运放,再到ADC触发和滤波,每一步都影响最终的控制质量。我建议你在设计电路时,按这个顺序逐个检查,别跳步。