4. 数据采集与标定:标定流程设计、多温度点数据采集、数据预处理与滤波

好,咱们进入正题。压力传感器的温度补偿,说白了就是跟温度这个「捣蛋鬼」斗智斗勇。你想想看,传感器本身是个好同志,但温度一变化,它就「心浮气躁」——零位漂移、灵敏度变化,输出数据就没谱了。

怎么治它?靠标定。

标定不是拍脑袋的事。我做了十几年传感器,见过太多人上来就测数据,测完发现没法用。为什么?流程没设计好。今天我就把压箱底的经验掏出来,跟你聊聊标定流程怎么搭、数据怎么采、预处理怎么做。

4.1 标定流程设计:先搭骨架再填肉

我个人习惯,标定流程分三步走:

  1. 确定温度点:覆盖全温区,不能有盲区
  2. 确定压力点:量程范围内均匀分布
  3. 确定采集顺序:先升温还是先降温?有讲究

先说说温度点。假设你的传感器工作范围是 -40°C 到 85°C,你不能只测 -40、0、25、85 这四个点。为什么?因为传感器的非线性在极端温度下更明显。我建议至少取 7 个点:-40、-20、0、25、50、70、85。如果预算允许,加到 11 个点更好。

压力点呢?一般取 5 个点就够了:0%、25%、50%、75%、100% 满量程。但注意,0% 点(零压力)和 100% 点(满量程)必须测,这是校准的基准。

核心原则:标定数据要能覆盖传感器实际工作的所有工况。少一个点,补偿模型就可能「跑偏」。

采集顺序这块,我踩过坑。有一次我图省事,从低温直接跳到高温,结果数据全废了。为什么?传感器有热惯性,温度没稳定就采数据,误差大得吓人。

正确的做法是:每个温度点至少保温 30 分钟,等传感器温度稳定了再采。升温时从低温往高温走,降温时反过来。每个温度点采完一组压力数据,再切到下一个温度点。

4.2 多温度点数据采集:别让噪声毁了你的数据

数据采集听起来简单——接上传感器,读 ADC 值,完事。但实际做起来,坑多着呢。

我见过一个项目,工程师用万用表直接读传感器输出,结果数据跳得像心电图。为什么?没做滤波。传感器输出本身就有噪声,加上电源纹波、电磁干扰,原始数据根本没法用。

我的做法是:

  • 每个压力点采 100 次,取平均值作为该点的原始值
  • 采样间隔 10ms,太快了数据相关性强,太慢了浪费时间
  • 同时记录温度值,用高精度温度传感器(比如 PT100)监测环境温度

这里有个细节:压力传感器本身也会发热,尤其是桥式传感器,激励电流会产生自热效应。我建议每次采集前先让传感器空载运行 5 分钟,等热平衡了再开始。

小技巧:采集数据时,把传感器放在恒温箱里,用程控压力源加压。这样温度和压力都能精确控制,数据一致性高。

数据记录格式也很重要。我习惯用 CSV 文件,每行记录一个数据点:

温度(°C), 压力(kPa), ADC原始值, 时间戳
-40.0, 0.0, 12345, 2024-01-15 10:00:00
-40.0, 25.0, 13456, 2024-01-15 10:01:00
-40.0, 50.0, 14567, 2024-01-15 10:02:00
...

为什么要加时间戳?因为你可以用它检查数据是否稳定。如果某个点的数据波动大,时间戳能帮你定位问题。

4.3 数据预处理与滤波:把脏数据洗干净

原始数据采回来了,但别急着用。先做预处理,把「脏东西」滤掉。

预处理分三步:

  1. 异常值剔除:用 3σ 准则,把偏离均值超过 3 倍标准差的数据扔掉
  2. 平滑滤波:用滑动平均或中值滤波,去掉高频噪声
  3. 归一化:把 ADC 值映射到 0~1 范围,方便后续建模

异常值剔除这块,我吃过亏。有一次数据里有个点明显偏大,我没在意,结果拟合出来的模型在低温段误差很大。后来一查,是电源瞬间波动导致的。从那以后,我每次必做异常值检测。

代码实现很简单,Python 几行搞定:

import numpy as np

def remove_outliers(data, threshold=3):
    mean = np.mean(data)
    std = np.std(data)
    return [x for x in data if abs(x - mean) < threshold * std]

平滑滤波我推荐中值滤波。为什么?因为滑动平均对脉冲噪声敏感,一个坏点就能把平均值拉偏。中值滤波不一样,它取窗口内的中位数,对异常值有天然的抵抗力。

窗口大小选多少?我一般选 5。窗口太小滤波效果差,太大又会把真实信号抹平。5 是个折中值,够用。

注意:滤波会引入延迟。如果你的系统对实时性要求高(比如汽车发动机控制),滤波窗口不能太大,否则响应跟不上。

归一化这一步很多人忽略,但我觉得很重要。ADC 原始值可能是 0~65535,压力值可能是 0~100kPa,量纲不同,直接建模容易出问题。归一化到 0~1 后,模型训练更稳定,收敛也快。

归一化公式:

normalized_value = (raw_value - min_value) / (max_value - min_value)

其中 min_value 和 max_value 是传感器在全温区、全量程下的最小和最大 ADC 值。注意,这两个值要从标定数据里取,不能拍脑袋定。

4.4 标定数据可视化:一眼看出问题

数据预处理完了,别急着建模。先画个图看看。

我习惯画两张图:

  • 温度-零位漂移曲线:看零压力下,ADC 值随温度的变化
  • 温度-灵敏度曲线:看满量程压力下,ADC 值随温度的变化

如果曲线平滑,说明传感器质量好,标定数据可靠。如果曲线有突变或毛刺,那就要回头检查数据采集过程了。

我曾经遇到一个案例,零位漂移曲线在 50°C 处有个「台阶」,怎么都解释不通。后来发现是恒温箱的温度控制器坏了,50°C 时实际温度波动了 ±5°C。你说这数据能信吗?

所以,可视化不只是为了好看,更是为了发现隐藏的问题

4.5 本章小结

标定这事,看着简单,做起来全是细节。流程设计要周全,数据采集要稳当,预处理要细致。每一步都马虎不得。

嗯,我啰嗦了不少。但这些都是真金白银换来的经验。你按我说的做,至少能少走一半弯路。

下一章咱们聊补偿模型怎么建。不过那是后话了,先把标定数据搞扎实再说。


公众号:蓝海资料掘金营,微信deep3321