4、电流检测与调理:相电流采样电阻选型、差分放大电路设计、偏置电压与参考电压、ADC采样时序与触发、软件滤波与校准
电流检测,说白了就是电机控制的「眼睛」。眼睛看不清,后面算法再牛也白搭。我见过不少项目,FOC 调了半天跑不起来,最后发现是电流采样噪声太大,或者偏置电压漂了。嗯,这章咱们就把这块彻底讲透。
核心要点:相电流检测的精度和实时性,直接决定了堵转检测的可靠性。一个设计良好的电流检测链路,能让你的保护动作快 10 倍。
4.1 相电流采样电阻选型
采样电阻,也叫 shunt 电阻。选型时我习惯先看三个参数:阻值、功率、寄生电感。
- 阻值:通常选 5mΩ ~ 20mΩ。太小了信号弱,太大了发热严重。我个人习惯先估算:
R = V_sense_max / I_peak,其中 V_sense_max 一般取 50mV ~ 100mV。 - 功率:
P = I_rms² × R,再留 2 倍余量。比如 10A 有效值,5mΩ 电阻,功率是 0.5W,选 1W 的稳妥。 - 寄生电感:这个容易被忽略。高频 PWM 开关时,寄生电感会产生尖峰电压,轻则干扰 ADC,重则烧运放。我一般选低电感类型的电阻,比如金属箔或锰铜合金的。
| 参数 | 推荐范围 | 我的经验值 |
|---|---|---|
| 阻值 | 5mΩ ~ 20mΩ | 10mΩ(通用) |
| 功率 | 2× I_rms² × R | 1W ~ 3W |
| 精度 | ±1% 或更高 | ±0.5% |
| 温漂 | < 50 ppm/°C | 25 ppm/°C |
| 寄生电感 | < 5 nH | < 2 nH |
小技巧:采样电阻的 PCB 布局要用开尔文连接(Kelvin connection),把电流路径和电压检测路径分开。我踩过这个坑——第一次画板子直接把检测线连在焊盘上,结果 50A 电流时测出来全是噪声。
4.2 差分放大电路设计
采样电阻两端的电压是共模电压很高的差分信号。直接用单端放大器?不行,共模抑制比(CMRR)不够,PWM 开关噪声会直接串进来。
我推荐用仪表放大器或差分运放。C2000 系列内部有 PGA(可编程增益放大器),但外部电路还是得搭。
一个典型的差分放大电路:
// 电路结构(以 INA240 为例)
// 输入:采样电阻两端(SENSE+, SENSE-)
// 输出:Vout = (V_sense+ - V_sense-) × Gain + Vref
// 增益设置:Gain = 20, 50, 100, 200(取决于型号)
// 偏置电压:Vref = 1.65V(单电源 3.3V 系统)
设计时注意几点:
- 共模电压范围:要覆盖母线电压的一半。比如 48V 系统,共模电压约 24V,选能承受这个范围的运放。
- 带宽:至少 1MHz,否则 PWM 边沿的细节会被滤掉。我习惯选 2MHz 以上的。
- 输出摆幅:轨到轨输出最好,不然 ADC 的满量程用不满。
注意:差分放大器的输入阻抗要匹配。我曾经用两个独立电阻搭差分电路,结果共模抑制比只有 40dB,后来换成集成仪表放大器,直接干到 100dB 以上。
4.3 偏置电压与参考电压
电机电流是双极性的(正负都有),而 C2000 的 ADC 只能测 0~3.3V。所以需要加一个偏置电压,把双极性信号抬到单极性范围。
偏置电压怎么选?我一般取 ADC 参考电压的一半。比如参考电压是 3.3V,偏置就设 1.65V。这样正负电流都能测到。
参考电压的来源:
- 内部参考:C2000 内部有 3.3V 参考,精度一般,温漂约 50 ppm/°C。
- 外部参考:比如 REF3033,精度高,温漂低(15 ppm/°C)。我习惯用外部参考,尤其是做堵转检测时,电流阈值需要很准。
偏置电压的生成:
- 用电阻分压 + 运放缓冲。分压电阻要选 0.1% 精度的,不然偏置误差会吃掉 ADC 的动态范围。
- 或者直接用精密参考芯片输出 1.65V。成本高一点,但省心。
我的经验:偏置电压的噪声要控制在 1mV 以内。否则小电流时,信号会被偏置噪声淹没。我曾在 1A 以下电流时发现 ADC 读数乱跳,查了半天,原来是偏置电源纹波太大。
4.4 ADC 采样时序与触发
C2000 的 ADC 采样时机很关键。你想想看,PWM 开关管在导通和关断时,电流波形上有很大的尖峰。如果在尖峰时刻采样,那数据根本没法用。
正确的做法:在 PWM 周期的中间点采样。这时候电流波形最平缓,噪声最小。
C2000 的 ePWM 模块可以产生 ADC 触发信号。我一般这样配置:
// ePWM 配置示例(以 EPWM1 为例)
// 时基周期:TBPRD = 1000(对应 100kHz PWM)
// 触发点:在 CMPA 和 CMPB 的中间位置
// 设置 CMPA = TBPRD/2 = 500
// 设置 CMPB = TBPRD/2 = 500
// 使能 ADC 触发:EPWM1 在 CMPA 和 CMPB 事件时触发 ADC
// 注意:三相电流需要同时采样
// 使用 EPWM1 的 SOCA 和 SOCB 分别触发两路 ADC
// 或者用 EPWM1 触发一次,然后 ADC 连续转换三路
采样时序的要点:
- 采样窗口:C2000 的 ADC 采样窗口可调,我一般设 10~15 个 ADC 时钟周期。太短了采样电容充不满,太长了浪费时间。
- 触发同步:三相电流要同时采样。C2000 支持多个 ADC 模块同步触发,或者用单 ADC 模块的序列采样。
- 死区时间:PWM 死区期间不要采样。我遇到过死区期间采样,结果读到的是续流二极管的反向恢复电流,完全不对。
避坑指南:我曾经在 PWM 频率 20kHz 时,把 ADC 触发点设在 PWM 边沿,结果读到的电流值比实际大 30%。后来改成在 PWM 中间点触发,数据才正常。记住:采样时机比采样精度更重要。
4.5 软件滤波与校准
硬件电路再完美,也免不了有噪声。软件滤波是最后一道防线。
我常用的滤波方法:
- 均值滤波:连续采 4~8 次,取平均。简单有效,适合低频噪声。
- 中值滤波:采 3~5 次,取中间值。能有效去除脉冲噪声。
- 一阶低通滤波:
y[n] = α × x[n] + (1-α) × y[n-1]。α 取 0.1~0.3,适合实时性要求高的场景。
校准也很重要。每块电路板的采样电阻、运放、偏置电压都有误差。我一般在产线上做两步校准:
- 零偏校准:电机不转时,采集 ADC 值,记为 offset。以后每次采样都减去这个 offset。
- 增益校准:通一个已知电流(比如 1A),采集 ADC 值,计算实际增益。然后软件里做增益补偿。
// 软件滤波与校准示例
// 定义结构体
typedef struct {
int32_t offset; // 零偏值
float gain; // 增益系数
float filter_alpha; // 滤波系数
int32_t last_value; // 上次滤波值
} Current_Cal_t;
// 初始化校准参数
void CurrentCal_Init(Current_Cal_t *cal, float alpha) {
cal->offset = 0;
cal->gain = 1.0f;
cal->filter_alpha = alpha;
cal->last_value = 0;
}
// 执行校准和滤波
int32_t CurrentCal_Process(Current_Cal_t *cal, int32_t raw_adc) {
// 1. 减去零偏
int32_t biased = raw_adc - cal->offset;
// 2. 增益补偿
float compensated = (float)biased * cal->gain;
// 3. 一阶低通滤波
float filtered = cal->filter_alpha * compensated
+ (1.0f - cal->filter_alpha) * (float)cal->last_value;
cal->last_value = (int32_t)filtered;
return (int32_t)filtered;
}
注意:校准参数要存储在非易失性存储器(如 Flash 或 EEPROM)中。我遇到过产线校准完,下次上电参数丢了,结果电流检测全乱套。后来加了 CRC 校验,确保参数完整性。
4.6 知识体系总览
下面这张图把整个电流检测链路串起来了。从采样电阻到 ADC 读数,每一步都有讲究。
嗯,这一套走下来,电流检测基本就稳了。我当年做第一个电机驱动项目时,就是按这个链路一步步调的。刚开始采样噪声大得离谱,后来发现是差分放大器的输入阻抗不匹配。换了集成仪表放大器,再配合软件滤波,电流波形干净得像教科书一样。
记住:电流检测是堵转检测的基础。基础打牢了,后面的保护策略才能发挥作用。