4、电流采样与调理:相电流采样方法、信号调理电路与ADC配置
电流采样,说白了就是电机的“眼睛”。
你想想看,电流环要闭环控制,总得知道电机里实际流了多少电流吧?采样不准,后面调参调得再好也是白搭。我见过不少工程师,花大把时间调PI参数,结果问题出在采样电路上——白忙活一场。
4.1 相电流采样方法
无感FOC控制,我们通常只需要采样两相电流。为什么?因为三相电流之和为零,第三相可以算出来。当然,前提是电机中性点不引出,且三相平衡。
常用的采样方法有三种:
| 采样方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 三电阻采样 | 在逆变器下桥臂三个MOS管源极各串一个采样电阻 | 成本低,电路简单 | PWM占空比过小时采样窗口不足 | 低成本、中低功率应用 |
| 单电阻采样 | 在直流母线侧串一个采样电阻,通过PWM状态重构相电流 | 成本最低,BOM精简 | 算法复杂,低速区采样精度差 | 极致成本敏感方案 |
| 霍尔/磁通门电流传感器 | 利用霍尔效应或磁通门原理隔离采样 | 隔离性好,精度高,无采样窗口限制 | 成本高,体积大 | 高功率、高可靠性场合 |
我个人习惯,在无感启动的电流环调试阶段,优先用三电阻采样。原因很简单——调试阶段我们需要看到真实的电流波形,三电阻方案最直观,出问题也好排查。
核心要点:无论哪种采样方法,最终都要保证ADC采样时刻与PWM开关状态对齐。采样点选错了,电流值就是错的。
4.2 信号调理电路设计
采样电阻上的信号,通常是毫伏级的差分信号。直接送给ADC?不行。你需要调理电路来做三件事:放大、偏置、滤波。
典型的调理电路链路如下:
4.2.1 差分放大
采样电阻上的信号是差分信号,共模电压可能很高。直接用单端运放?不行,共模抑制比不够。我推荐用仪表放大器或者差分运放。
举个例子,常用的INA240就是专门为电机电流采样设计的。它的共模抑制比能做到80dB以上,而且内部集成了偏置电路。
我的经验:运放的增益不要设得太高。留出20%的余量,防止电流尖峰导致ADC饱和。比如你最大相电流10A,采样电阻1mΩ,信号10mV,ADC参考电压3.3V,增益设到250倍左右就够了,别贪心。
4.2.2 电平偏置
电机电流是双极性的——正转时正向电流,反转时反向电流。但ADC只能采0~3.3V的单极性信号。怎么办?加一个直流偏置,把信号整体抬升到1.65V中心点。
偏置电压的精度直接影响电流零点。我曾经在一个项目里,用了普通的电阻分压给偏置,结果温漂太大,零点飘了50mV,换算成电流误差就是0.2A——对于低速无感启动来说,这误差足以让电机抖得像筛子。
注意:偏置电压必须用高精度基准源,别图省事用电源分压。TL431或者REF3033都是不错的选择。偏置电压的温漂,直接决定了电流采样的零点稳定性。
4.2.3 低通滤波
PWM开关频率通常是10kHz~20kHz,这些高频分量必须滤掉。但滤波也不能太过——相位延迟太大会影响电流环的带宽。
我一般用一阶RC滤波,截止频率设在开关频率的1/10左右。比如开关频率20kHz,截止频率就设2kHz。RC时间常数算一下:τ = 1/(2π×2000) ≈ 80μs,R取1kΩ,C取82nF(接近标称值)。
// 一阶低通滤波截止频率计算
// fc = 1 / (2 * π * R * C)
// 已知:R = 1kΩ, C = 82nF
// fc = 1 / (2 * 3.14159 * 1000 * 82e-9)
// fc ≈ 1940 Hz
// 相位延迟估算(在1kHz处)
// φ = -arctan(f/fc) = -arctan(1000/1940) ≈ -27°
// 这个延迟在电流环中是可以接受的
4.3 ADC配置要点
信号调理好了,接下来就是ADC采样。ADC配置得好不好,直接决定了你看到的是真实电流还是噪声。
4.3.1 采样时刻对齐
这是最容易被忽视的一点。三电阻采样,必须在PWM的下桥臂导通时刻采样。为什么?因为只有下桥臂导通时,电流才流过采样电阻。
具体来说:
- 在PWM周期中间点触发ADC采样(此时三相下桥臂都导通)
- 采样窗口要避开开关管导通/关断的振荡期(通常避开200ns~500ns)
- 使用定时器的触发功能,硬件自动触发ADC,不要用软件延时
关键:ADC采样时刻的抖动,会直接转化为电流噪声。用硬件触发,别用软件定时器。我见过有人用DWT循环等待来对齐采样时刻,结果PWM频率一变化,采样点就飘了。
4.3.2 ADC分辨率与采样率
对于电机控制,12位ADC是底线。16位更好,但成本也上去了。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 分辨率 | 12位(最低) | 12位对应4096个码值,对于10A量程,分辨率约2.4mA/LSB |
| 采样率 | ≥2×PWM频率 | 每个PWM周期至少采样2次,用于过采样或双采样 |
| 采样时间 | ≥500ns | 保证采样电容充分充电,尤其是输入阻抗较大时 |
| 转换模式 | 注入组或规则组 | 使用定时器触发,硬件自动完成 |
4.3.3 软件校准
硬件调理电路总有误差。零点偏置和增益误差,可以通过软件校准来补偿。
我的做法是:
- 零点校准:电机静止且不施加电流时,连续采样100次取平均,作为零点偏置值
- 增益校准:注入已知电流(比如1A),计算实际ADC码值与理论值的比例关系
- 实时更新:每次启动时做一次零点校准,因为温漂会改变零点
// 电流采样软件校准示例
typedef struct {
int32_t offset; // 零点偏置(ADC码值)
float gain; // 增益系数(A/LSB)
int32_t raw_adc; // 原始ADC值
float current; // 校准后的电流值(A)
} CurrentSample_t;
void CurrentSample_Calibrate(CurrentSample_t *cs) {
// 零点校准:电机静止时调用
int32_t sum = 0;
for (int i = 0; i < 100; i++) {
sum += ADC_GetValue();
}
cs->offset = sum / 100;
}
float CurrentSample_Get(CurrentSample_t *cs) {
cs->raw_adc = ADC_GetValue();
// 减去零点偏置,乘以增益系数
cs->current = (float)(cs->raw_adc - cs->offset) * cs->gain;
return cs->current;
}
小技巧:零点校准最好在电机上电后、PWM使能前做。这时候电机还没通电,采样到的就是纯偏置。我曾经偷懒没做这一步,结果零点偏了30个码值,低速时电流环一直在震荡。
4.4 常见问题与避坑
做电流采样,坑不少。我踩过的,列几个出来:
- 采样电阻功率不够:别只看阻值,功率也要算。10A电流流过1mΩ电阻,功率是0.1W,但启动瞬间可能有5倍过流,选1W以上的电阻才保险。
- PCB布局不当:采样电阻的走线要用开尔文连接,别让大电流流过信号地。我见过一块板子,采样电阻的焊盘走线太长,引入了0.5mΩ的寄生电阻,电流误差直接5%。
- ADC输入引脚保护:电机驱动是强电环境,ADC输入引脚一定要加钳位二极管和限流电阻。有一次我忘了加,一个浪涌过来,MCU的ADC引脚直接烧了。
- 共模电压过高:差分运放的共模输入范围有限,别超过数据手册的规格。高压电机应用,建议用隔离放大器。
嗯,电流采样和调理这部分,说难不难,说简单也不简单。关键是把每个环节的细节做到位——从采样电阻选型,到调理电路设计,再到ADC配置和软件校准,环环相扣。任何一个环节出问题,你看到的电流数据都是假的,后面调参也就无从谈起。