3、电流采样与调理:三相电流采样方案、运放电路设计、ADC采样时序与同步
做FOC控制,说白了就是跟电流打交道。你算法写得再漂亮,电流采不准,一切都是白搭。我见过太多人把精力全放在PI参数上,结果板子一跑起来,电流波形跟心电图似的——那其实是采样环节出了问题。
这一章,咱们就把电流采样这件事彻底聊透。从硬件方案到运放设计,再到ADC的时序同步,我会把我在项目中踩过的坑、总结的经验,全都摊开来讲。
3.1 三相电流采样方案:选对路子,少走弯路
电流采样,市面上主流的有三种方案。每种都有它的脾气,你得根据项目需求来选。
| 方案 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 采样电阻+运放 | 在母线上串联精密电阻,测量压降 | 成本低、精度高、响应快 | 有损耗、需隔离 | 中小功率(<1kW) |
| 霍尔电流传感器 | 利用霍尔效应测量磁场 | 隔离性好、无损耗 | 温漂大、带宽有限 | 大功率、需要隔离 |
| 磁通门/电流互感器 | 利用磁通变化感应电流 | 精度极高、隔离 | 体积大、成本高 | 工业级、高精度要求 |
我个人习惯,做中小功率的电机驱动(比如几百瓦的伺服、无人机电调),首选采样电阻方案。为什么?因为便宜、够用、调试方便。你想想看,一个几毛钱的电阻加一个几块钱的运放,就能搞定0.1%精度的电流采样,性价比太高了。
核心要点:采样电阻的选型,阻值不能太大也不能太小。太大,发热严重,效率下降;太小,信号太弱,容易被噪声淹没。一般取几十毫欧到几毫欧之间,具体看电流量程。
我在一个无人机项目中就吃过这个亏。当时为了追求极低的损耗,选了个0.5mΩ的电阻。结果运放输出端噪声大得离谱,ADC读数跳来跳去。后来换成5mΩ的,信号干净多了。嗯,这里要注意:采样电阻的功率额定值一定要留够余量,至少2倍以上。
3.2 运放电路设计:把微弱的信号“放大”成ADC能用的样子
采样电阻上的压降,通常只有几十毫伏。MCU的ADC一般需要0~3.3V的输入范围。所以,运放的作用就是把这个小信号放大,同时把电平抬到ADC的测量范围内。
常用的电路结构是差分放大+偏置。为什么用差分?因为电机驱动是强干扰环境,共模噪声很大。差分结构能有效抑制共模干扰。
我常用的电路是这样的:
// 运放电路设计要点(以INA180为例)
// 1. 增益设置:G = Rf / Rg
// 假设采样电阻 Rs = 5mΩ,最大电流 Imax = 20A
// 则最大压降 Vmax = 5mΩ * 20A = 100mV
// ADC参考电压 Vref = 3.3V
// 目标输出范围:0.1V ~ 3.2V(留一点余量)
// 所需增益 G = (3.2 - 0.1) / (0.1 - (-0.1)) = 15.5
// 取整,G = 16
// 2. 偏置电压设置
// 因为电流有正负,需要把负电流对应的电压抬到0V以上
// 偏置电压 Vbias = Vref / 2 = 1.65V
// 这样,零电流时输出1.65V,正电流时升高,负电流时降低
// 3. 实际电路参数
// Rf = 16kΩ, Rg = 1kΩ
// 偏置电阻分压网络:两个10kΩ电阻分压得到1.65V
小技巧:运放的供电电压最好用5V,而不是3.3V。因为运放输出轨到轨时,靠近电源轨会有非线性区。用5V供电,输出范围可以轻松覆盖0~3.3V,线性度更好。
我曾经在一个项目中,为了省一个电源轨,直接用3.3V给运放供电。结果发现,当电流接近满量程时,ADC读数明显偏离理论值。查了半天,原来是运放输出饱和了。从那以后,我再也不省这个钱了。
3.3 ADC采样时序与同步:别让时序毁了你的FOC
电流采样最关键的,不是硬件精度,而是采样时刻。FOC的核心是Clark/Park变换,它要求三相电流是同一时刻的瞬时值。如果你分时采样,电机转速一高,相位差就出来了,算出来的电流矢量全是错的。
为什么会这样?你想想看,电机在高速旋转时,电流变化很快。如果你先采A相,过10μs再采B相,这10μs里电流已经变了。变换出来的Id、Iq,跟实际值差了一大截。
正确的做法是:三相同时采样。现在很多MCU都支持多通道同步采样,比如STM32的ADC可以配置成注入组,同时触发三个通道。
关键时序:采样时刻必须选在PWM载波的中间点。为什么?因为此时开关管处于导通状态,电流纹波最小,采样值最接近平均值。而且,这个时刻也是SVPWM矢量作用的中点,电流变化率最小。
我一般这样配置时序:
// ADC采样时序配置(以STM32G4为例)
// 1. 配置PWM定时器(TIM1)的更新事件作为ADC触发源
// 2. 设置ADC触发延迟,使采样点落在PWM周期的正中间
// 例如:PWM频率20kHz,周期50μs
// 延迟时间 = 周期/2 = 25μs
// 3. 配置ADC为三重同步采样模式
// 三个ADC同时采样三相电流
// 伪代码示例
void ADC_Config(void) {
// 使能ADC1, ADC2, ADC3
// 配置为同步注入模式
// 触发源:TIM1_TRGO
// 采样时间:2.5个ADC时钟周期(足够采样电阻稳定)
// 设置触发延迟
TIM1->CR2 |= TIM_CR2_CCDS; // 选择更新事件作为TRGO
TIM1->CCR1 = 1250; // 25μs延迟(假设定时器时钟100MHz)
}
注意:采样时间不能太短。采样电容需要时间充电,如果采样时间不够,测量值会偏小。我一般设置至少2.5个ADC时钟周期。如果采样电阻和运放输出阻抗较大,还要适当延长。
还有一个容易被忽略的点:ADC的采样保持时间。有些MCU的ADC在同步采样时,三个通道是依次采样的,只是触发时刻相同。这其实不是真正的“同时”。真正的同步采样,需要MCU有多个独立的ADC核,或者有采样保持电路。选型时一定要看数据手册,别被“同步采样”四个字忽悠了。
我记得有一次帮客户调试,他们用的MCU号称支持同步采样,但实际测出来三相电流总有相位差。后来仔细看手册才发现,那个“同步”只是触发同步,采样还是串行的。最后换了带三个独立ADC的芯片才解决问题。
3.4 实际调试中的避坑指南
说了这么多,最后总结几个我踩过的坑,希望能帮你省点时间:
- 运放输出加RC滤波:在运放输出和ADC输入之间,加一个100Ω+100pF的RC低通滤波。能有效抑制高频噪声,又不影响带宽。
- 采样电阻的布局:采样电阻要尽量靠近MOSFET的源极,走线要短而粗。我用4层板时,会把采样电阻放在顶层,底层铺地,减少寄生电感。
- ADC参考电压要稳:ADC的Vref引脚,一定要用高精度基准源,或者至少用LDO单独供电。别跟数字电路共用一个电源,否则ADC读数会跟着数字噪声跳。
- 校准是必须的:每个通道都有零偏和增益误差。量产时一定要做校准。我一般在校准模式下,先测零电流时的ADC值(零偏),再测一个已知电流(比如1A)时的ADC值(增益),然后写入EEPROM。
嗯,电流采样这部分,说难不难,说简单也不简单。硬件上多花点心思,软件上就能少掉点头发。下一章,咱们聊聊SVPWM的实现,那又是另一番天地了。