4. 单点校准与两点校准:偏移校准、增益校准、两点线性校准公式推导

各位工程师朋友,今天我们来聊聊传感器校准里最基础、也最实用的两个方法——单点校准和两点校准。说实话,我刚入行那会儿,总觉得校准就是调个偏置、拉个斜率,没什么技术含量。直到有一次,一个温度传感器项目死活过不了全温区精度测试,我才意识到:校准这事儿,看似简单,里面的门道可不少。

4.1 为什么需要校准?

先问大家一个问题:你花大价钱买回来的传感器,输出值一定等于真实值吗?

答案是否定的。传感器从晶圆制造到封装测试,每一步都会引入误差。比如一个压力传感器,理想情况下输入0kPa时输出0mV,输入100kPa时输出100mV。但实际呢?可能0kPa时输出2mV,100kPa时输出98mV。这就是我们常说的偏移误差和增益误差。

我做过一个项目,用的某品牌加速度计,常温下精度还不错,但温度一降到-40℃,输出直接漂了5%。当时排查了好久,最后发现是芯片内部的应力释放导致的。嗯,从那以后,我对校准这件事就再也不敢马虎了。

4.2 单点校准:偏移校准

单点校准,说白了就是只修正一个点。最常见的场景就是修正零位偏移。

偏移误差长什么样?

理想输出:V_out = K * V_in
实际输出:V_out = K * V_in + V_os

这里的 V_os 就是偏移电压。比如你给传感器输入0,它输出0.5V,那偏移就是0.5V。

偏移校准怎么做?

很简单,测一次零位,然后减去这个偏移量:

V_calibrated = V_raw - V_os

其中 V_os 是在输入为0时测得的原始输出值。

核心公式:

偏移校准后输出 = 原始输出 - 零位偏移量

我在项目中遇到过一种情况:有些传感器在零位附近噪声特别大,单次测量根本不准。我的做法是采集100次数据取平均,再用这个平均值作为偏移量。你想想看,如果只测一次,万一碰到一个毛刺,整个校准就偏了。

实战小技巧:

做偏移校准时,建议让传感器稳定工作5分钟后再采集零位数据。我刚入行时吃过这个亏——一上电就采集,结果温漂还没稳定,校准完反而更差了。

4.3 两点校准:增益校准

单点校准只能修正偏移,但解决不了斜率问题。比如你的传感器在满量程时输出偏小,这就是增益误差。

增益误差长什么样?

实际输出:V_out = K_actual * V_in + V_os

理想增益是 K_ideal,实际增益是 K_actual。两者不一样,就是增益误差。

两点校准怎么做?

我们需要两个已知的标准输入点,通常选低端和高端。比如:

  • 标准输入1:V_in1,测得输出 V_raw1
  • 标准输入2:V_in2,测得输出 V_raw2

然后我们可以算出实际增益和偏移:

K_actual = (V_raw2 - V_raw1) / (V_in2 - V_in1)
V_os = V_raw1 - K_actual * V_in1

校准后的输出:

V_calibrated = (V_raw - V_os) / K_actual

或者更直观地,直接用线性映射:

V_calibrated = V_in1 + (V_raw - V_raw1) * (V_in2 - V_in1) / (V_raw2 - V_raw1)

核心公式:

两点校准本质就是找到实际输入-输出曲线的斜率和截距,然后反推真实输入值。

我建议大家在选择两个校准点时,尽量覆盖传感器的常用工作范围。比如一个0-100kPa的压力传感器,如果平时主要工作在20-80kPa,那校准点选10kPa和90kPa就比选0kPa和100kPa更实用。为什么?因为传感器在端点附近往往线性度最差,你硬要校准端点,反而可能把中间段的精度搞坏了。

注意:

两点校准假设传感器是线性的。如果你的传感器本身非线性严重(比如某些热电偶),两点校准反而会引入更大误差。这时候就需要多点校准或者查表法了。

4.4 两点线性校准公式推导

好,我们来手推一下两点线性校准的公式。别怕,其实就是初中数学——两点确定一条直线。

已知条件:

标准输入 原始输出
x₁ y₁
x₂ y₂

推导过程:

假设输入x和输出y满足线性关系:

y = kx + b

代入两个已知点:

y₁ = kx₁ + b
y₂ = kx₂ + b

两式相减:

y₂ - y₁ = k(x₂ - x₁)
k = (y₂ - y₁) / (x₂ - x₁)

然后求b:

b = y₁ - kx₁

现在,对于任意一个原始输出y_raw,我们可以反推出校准后的输入x_cal:

x_cal = (y_raw - b) / k

把k和b代入:

x_cal = (y_raw - (y₁ - kx₁)) / k
      = (y_raw - y₁ + kx₁) / k
      = x₁ + (y_raw - y₁) / k
      = x₁ + (y_raw - y₁) * (x₂ - x₁) / (y₂ - y₁)

这就是我们最终的两点线性校准公式。

最终公式:

x_cal = x₁ + (y_raw - y₁) * (x₂ - x₁) / (y₂ - y₁)

这个公式在嵌入式系统里特别好用,因为只需要做一次减法和一次除法,计算量很小。我曾经在一个8位MCU上实现过这个算法,整个校准流程跑下来不到50微秒。

4.5 单点 vs 两点:怎么选?

我给大家一个简单的判断标准:

  • 只用偏移校准:当你的传感器增益很准,只是零位有偏移时。比如某些高精度运放,增益误差只有0.01%,但输入偏置电压可能有几毫伏。
  • 需要两点校准:当传感器既有偏移又有增益误差时。绝大多数工业传感器都属于这一类。

还有一种情况我特别想提醒大家:如果你的传感器在低端和高端表现不一致(比如低端偏大、高端偏小),两点校准反而会放大误差。这时候我建议你考虑分段校准——把量程分成几段,每段单独做两点校准。

避坑指南:

我曾经在一个气体传感器项目里,直接用两点校准覆盖全量程,结果中间段的误差达到了8%。后来改成三段校准(0-30%、30-70%、70-100%),误差直接降到了1%以内。所以,别迷信两点校准,它只是工具,不是万能药。

4.6 实战代码示例

最后,给大家一个C语言实现的两点校准函数。这个代码我在好几个项目里都用过,稳定可靠:

// 两点校准结构体
typedef struct {
    float x1;  // 标准输入1
    float y1;  // 原始输出1
    float x2;  // 标准输入2
    float y2;  // 原始输出2
} TwoPointCal_t;

// 两点校准函数
float TwoPointCal_Process(TwoPointCal_t *cal, float raw_value) {
    // 防止除零
    if (cal->y2 == cal->y1) {
        return cal->x1;  // 输出不变,返回默认值
    }
    
    // 线性插值
    float result = cal->x1 + 
                   (raw_value - cal->y1) * 
                   (cal->x2 - cal->x1) / 
                   (cal->y2 - cal->y1);
    
    return result;
}

// 使用示例
void main() {
    TwoPointCal_t cal = {
        .x1 = 0.0f,    // 0 kPa
        .y1 = 0.5f,    // 原始输出0.5V
        .x2 = 100.0f,  // 100 kPa
        .y2 = 4.5f     // 原始输出4.5V
    };
    
    float raw_adc = 2.5f;  // ADC采集到的原始值
    float pressure = TwoPointCal_Process(&cal, raw_adc);
    // pressure ≈ 50 kPa
}

这个代码我建议大家在工程中直接使用。注意我加了一个防除零的判断——别笑,我真见过有人因为两个校准点选得太近,导致分母为零,整个系统直接挂掉的案例。

好了,关于单点校准和两点校准,今天就聊到这里。下一章我们会讲更高级的多点校准和温度补偿,到时候你会看到,今天的这些基础公式会反复出现。所以,务必把这两个公式吃透。