4、信号采集与处理:ADC采样时序、数字滤波算法、信号有效性检查、故障诊断策略
轨压信号进了ECU,第一件事是什么?不是算,是采。采得准不准,直接决定了后面所有控制逻辑的成败。我见过太多标定工程师在台架上调了三天轨压PID,最后发现是ADC采样时序没配好——白忙活一场。
这一节,咱们就聊聊轨压信号从进入ADC引脚,到变成软件里那个可靠的“RailPressure_Phys”值,中间到底经历了什么。
4.1 ADC采样时序:别让CPU抢了ADC的饭碗
ECU里的ADC模块,说白了就是个“电压-数字”转换器。但轨压信号有个特点——它跟喷油、泵油动作强相关。你想想看,喷油器一开,共轨管里的油压瞬间掉一块;高压泵一柱塞供油,压力又冲上去。这些波动频率不低,采样时机不对,采到的值就是错的。
我个人习惯的做法是:
- 同步采样:把轨压ADC触发信号跟曲轴/凸轮轴信号绑定。比如在每缸压缩上止点前30°CA触发一次采样。这样每次采到的都是“同一工况点”的压力,便于做闭环控制。
- 避免CPU抢占:ADC采样期间,CPU不要去读写ADC结果寄存器。我见过一个案例,工程师在ADC采样中途插了个中断服务程序去读结果,读到的全是中间值,轨压曲线像锯齿一样。
- 采样窗口:轨压传感器响应时间一般在1-2ms,ADC采样保持时间建议设置≥3μs。别省这点时间,省出来的都是噪声。
核心要点:ADC采样时序的核心是“在正确的时间点,用正确的方式,采到正确的值”。同步于发动机相位,比异步采样靠谱得多。
4.2 数字滤波算法:去伪存真
ADC采回来的原始值,我一般叫它“RawValue”。这个值里掺杂着各种噪声:电磁干扰、电源纹波、传感器自身抖动。直接拿去做控制,发动机能抖成筛子。
数字滤波就是干这个的——把真信号留下,把假信号滤掉。常用的几种我列一下:
| 滤波算法 | 原理 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| 滑动平均滤波 | 取最近N个采样值的平均值 | 稳态工况,轨压变化缓慢时 | N值设太大,动态响应慢得像蜗牛 |
| 中值滤波 | 取连续采样值的中位数 | 有偶发性尖峰脉冲干扰时 | 计算量大,老ECU扛不住 |
| 一阶低通滤波 | Y(n) = α * X(n) + (1-α) * Y(n-1) | 实时性要求高的闭环控制 | α系数调不好,要么滤不干净要么滞后太大 |
| 限幅滤波 | 相邻两次采样值变化超过阈值则丢弃 | 传感器断线或短路时的保护 | 阈值设太严,正常波动也被滤掉了 |
实际项目中,我很少只用一种滤波。通常是“限幅+滑动平均”组合拳:先用限幅干掉明显异常值,再用滑动平均平滑曲线。代码大概长这样:
/* 限幅滤波 + 滑动平均滤波 */
#define FILTER_WINDOW_SIZE 8
#define LIMIT_THRESHOLD 50 /* 单位:0.1bar,即5bar变化 */
uint16_t g_RawBuffer[FILTER_WINDOW_SIZE];
uint8_t g_BufferIndex = 0;
uint16_t RailPressure_Filter(uint16_t newRawValue)
{
static uint16_t lastValidValue = 0;
uint32_t sum = 0;
uint8_t i;
/* 第一步:限幅检查 */
if (abs((int16_t)newRawValue - (int16_t)lastValidValue) > LIMIT_THRESHOLD)
{
/* 变化太大,用上次有效值替代 */
newRawValue = lastValidValue;
}
else
{
lastValidValue = newRawValue;
}
/* 第二步:写入环形缓冲区 */
g_RawBuffer[g_BufferIndex] = newRawValue;
g_BufferIndex = (g_BufferIndex + 1) % FILTER_WINDOW_SIZE;
/* 第三步:滑动平均 */
for (i = 0; i < FILTER_WINDOW_SIZE; i++)
{
sum += g_RawBuffer[i];
}
return (uint16_t)(sum / FILTER_WINDOW_SIZE);
}
小技巧:滤波窗口大小建议设为2的幂次方(如4、8、16),这样除法可以用移位操作替代,省CPU时间。ECU里时间就是金钱。
4.3 信号有效性检查:别让坏数据骗了ECU
滤波之后的数据就能直接用了吗?不一定。传感器可能老化、线束可能进水、接插件可能松动。这些情况下,数据看起来“正常”,但实际已经偏离真实值了。
我一般做三层检查:
- 范围检查:轨压传感器输出有物理极限。比如0.5V对应0bar,4.5V对应200bar。ADC值超出这个范围,直接判无效。
- 变化率检查:轨压变化有物理限制。一毫秒内从50bar跳到150bar?不可能,除非爆震了。变化率超限,说明信号有问题。
- 合理性检查:轨压跟发动机转速、喷油量、泵油量之间有关系。转速2000rpm、喷油量0,轨压却只有20bar?不合理,大概率传感器坏了。
注意:有效性检查的阈值不能设得太死。我曾经把变化率阈值设得太严,结果发动机急加速时轨压快速上升,被误判为传感器故障,直接切了跛行回家模式。车主投诉说“一踩油门就限扭”,查了两天才发现是阈值问题。
4.4 故障诊断策略:ECU的自我保护机制
信号有效性检查发现问题后,ECU不能傻等着。它得做出反应——这就是故障诊断策略干的事。
轨压传感器相关的故障诊断,我归纳为四类:
| 故障类型 | 诊断方法 | 故障响应 |
|---|---|---|
| 信号超上限 | ADC值 > 4.75V对应值,持续2s | 记录DTC,切备用值,点亮MIL灯 |
| 信号超下限 | ADC值 < 0.25V对应值,持续2s | 记录DTC,切备用值,点亮MIL灯 |
| 信号不合理 | 轨压与转速/喷油量逻辑矛盾 | 记录DTC,降功率运行 |
| 传感器供电故障 | 5V参考电压异常 | 记录DTC,禁止相关功能 |
诊断策略里有个关键参数——故障确认时间。不是一出现异常就报故障,得持续一段时间。为什么?因为干扰可能就一瞬间。我一般设2-3秒的确认时间,既避免误报,又不至于让故障一直藏着。
还有一个容易被忽略的点:故障恢复策略。故障消失后,ECU不能立刻切回正常模式。得有个“滞回区间”——比如故障在200bar以上触发,那得等到轨压降到180bar以下才恢复。不然信号在阈值附近来回跳,ECU会反复切模式,那画面太美我不敢看。
总结一下:信号采集与处理这条链路,从ADC采样到故障诊断,每一步都是在跟“不确定性”作斗争。采样时序解决“什么时候采”,滤波解决“怎么去噪”,有效性检查解决“数据可信吗”,故障诊断解决“出问题了怎么办”。四步走完,轨压信号才算真正可用。
嗯,这一节的内容就到这儿。下一节咱们聊聊轨压的闭环控制策略——那才是真正考验标定功夫的地方。