4. 传感器故障诊断(二):电流传感器故障模式、偏移/增益故障诊断与标定
各位工程师,咱们接着聊电流传感器。上一章我们讲了传感器的基础故障,这一章我重点说说电流传感器里最让人头疼的两个问题——偏移故障和增益故障。说白了,就是传感器读数不准了,要么整体偏大偏小,要么放大倍数出了问题。
我在项目里遇到过好几次,电机跑着跑着突然抖一下,或者扭矩输出忽大忽小。查到最后,都是电流传感器在“捣鬼”。你想想看,如果电流信号不准,FOC控制算法算出来的电压矢量肯定也是错的,那电机能好好转才怪。
4.1 电流传感器的常见故障模式
先梳理一下,电流传感器到底会出哪些问题。我个人习惯把它们分成三类:
- 硬故障:传感器完全失效,输出卡在电源轨或0V。这种最好诊断,直接看读数是否在合理范围外就行。
- 偏移故障:输出信号整体叠加了一个直流分量。比如实际电流是0A,传感器却读出了0.1A。这种故障最隐蔽,因为电机静止时你很难发现。
- 增益故障:传感器的放大倍数变了。比如实际电流是10A,传感器只读出8A,或者读出了12A。这会导致扭矩控制精度下降。
核心观点:偏移故障影响零位,增益故障影响满量程。两者往往同时存在,需要分别诊断和补偿。
嗯,这里要注意,偏移和增益故障不一定同时发生。我记得有一次,客户反馈某批次EPS(电动助力转向)在低温下助力异常。我们排查了三天,最后发现是电流传感器在-20°C时出现了约2%的增益漂移。温度一恢复正常,增益又回来了。所以环境因素也是诱因之一。
4.2 偏移故障诊断方法
偏移故障怎么诊断?最直接的方法就是看零电流时的输出。
具体做法:让电机处于静止状态,且三相电流都为零。这时候,理想情况下传感器输出应该是0。如果读到了非零值,那就是偏移量。
但问题来了——你怎么确保电机真的处于零电流状态?
我常用的方法是:在PWM占空比为0时采样。这时候逆变器所有开关管都关断,电机绕组里没有电流流过(忽略续流电流)。采样得到的值,就是偏移量。
代码实现也很简单:
// 偏移故障诊断函数
float offset_diagnosis(void) {
float offset = 0.0f;
uint16_t sample_count = 100;
// 确保PWM输出为0
pwm_set_duty(0, 0, 0);
delay_ms(10); // 等待电流衰减
// 多次采样取平均,减少噪声影响
for(uint16_t i = 0; i < sample_count; i++) {
offset += adc_read_current_sensor();
delay_us(100);
}
offset /= sample_count;
// 判断是否超出阈值
if(fabs(offset) > OFFSET_THRESHOLD) {
// 记录故障码
fault_code |= FAULT_CURRENT_OFFSET;
// 返回偏移量,用于后续补偿
return offset;
}
return 0.0f;
}
实战技巧:采样次数不要太多,100次左右就够了。我见过有人采样1000次,结果诊断时间太长,影响了系统实时性。另外,采样间隔要避开PWM开关噪声,建议在PWM周期的中间点采样。
4.3 增益故障诊断方法
增益故障比偏移麻烦一些。因为你需要一个已知的参考电流来比对。
怎么产生这个参考电流?我建议用直流注入法:
- 给电机施加一个已知的直流电压矢量(比如只给d轴加电压,q轴为0)
- 根据电机电阻和电压,计算出理论电流值 I_ref = V / R
- 读取传感器实际测量值 I_meas
- 增益误差 = I_meas / I_ref
但这里有个坑——电机电阻会随温度变化。你想想看,铜线的温度系数大约是0.0039/°C,温度升高20°C,电阻就变了近8%。如果不补偿温度,算出来的增益误差全是错的。
避坑指南:我曾经在台架上测试增益诊断,结果每次结果都不一样。查了两天才发现,是电机温度没稳定。后来我加了一个温度传感器,用查表法补偿电阻变化,诊断精度才上来。
更精确的做法是:利用电机反电动势。让电机以恒定转速空转,此时电流很小,反电动势基本等于母线电压。通过转速和反电动势常数,可以反推出电流传感器的增益。这个方法不受电阻温度影响,但需要知道精确的反电动势常数。
增益诊断的代码示例:
// 增益故障诊断函数
float gain_diagnosis(float motor_resistance, float temperature) {
float v_d_ref = 0.5f; // 注入的d轴电压,单位V
float i_ref;
float i_meas = 0.0f;
uint16_t sample_count = 50;
// 温度补偿电阻
float r_compensated = motor_resistance * (1 + 0.0039f * (temperature - 25.0f));
i_ref = v_d_ref / r_compensated;
// 施加电压矢量
set_dq_voltage(v_d_ref, 0.0f);
delay_ms(5); // 等待电流稳定
// 采样电流
for(uint16_t i = 0; i < sample_count; i++) {
i_meas += adc_read_current_sensor();
delay_us(200);
}
i_meas /= sample_count;
// 计算增益误差
float gain_error = i_meas / i_ref;
if(fabs(gain_error - 1.0f) > GAIN_THRESHOLD) {
fault_code |= FAULT_CURRENT_GAIN;
return gain_error;
}
return 1.0f; // 增益正常
}
4.4 偏移与增益的在线标定
诊断出问题后,下一步就是标定。说白了,就是把偏移量和增益误差补偿回来。
标定流程我一般分两步走:
- 先标偏移,再标增益。因为偏移会影响增益计算的准确性。如果偏移没标好,你算出来的增益也是错的。
- 标定值要存到非易失存储器(如EEPROM或Flash)。每次上电后先读取标定值,再开始正常工作。
偏移标定很简单:把诊断得到的偏移量,在每次采样后减去即可。
// 偏移补偿
float current_compensated = raw_current - offset_calib_value;
增益标定稍微复杂一点:
// 增益补偿
float current_final = current_compensated / gain_calib_value;
嗯,这里有个细节要注意——标定值要加滤波。我习惯用一阶低通滤波,时间常数设0.1秒左右。这样既能滤除噪声,又不会影响动态响应。
重要提醒:标定不是一劳永逸的。传感器会老化,温度循环也会改变特性。我建议每100小时运行时间,或者每次系统上电时,都做一次快速诊断。如果发现偏移或增益变化超过阈值,就触发重新标定。
4.5 知识体系与诊断逻辑
为了让大家更直观地理解,我画了一张流程图。这张图展示了从故障检测到标定补偿的完整链路:
这张图的核心逻辑是:先诊断偏移,再诊断增益。如果发现异常,立即记录误差值并触发标定流程。标定完成后,系统才能进入正常控制模式。
4.6 实战中的注意事项
最后,我总结几个实战中容易踩的坑:
- 采样时序:电流采样一定要避开PWM开关瞬间。我习惯在PWM载波周期的中间点触发ADC,这时候开关噪声最小。
- 温度影响:偏移和增益都会随温度漂移。如果系统工作温度范围宽(比如-40°C到125°C),建议做全温标定,存一个标定表。
- 多相传感器一致性:三相电流传感器,每一相的偏移和增益都可能不同。要分别诊断、分别标定。
- 故障恢复:标定完成后,要清除故障码。但如果连续多次诊断都发现故障,说明传感器可能已经损坏,需要报永久故障。
我的习惯:每次系统上电后,先做一次快速诊断(只检查偏移),然后才开始控制。运行过程中,每隔10分钟做一次完整诊断(偏移+增益)。这样既保证了实时性,又不会漏掉故障。
好了,电流传感器的偏移和增益故障诊断就讲到这里。这些方法我在多个项目中验证过,效果都不错。你可以在自己的代码里试试看,有问题随时交流。
公众号:蓝海资料掘金营,微信deep3321