2、传感器选型分析:热敏电阻(NTC)与数字温度传感器(DS18B20)的对比

做嵌入式体温计,第一个要拍板的事就是:用哪个温度传感器?

说实话,这个问题我当年也纠结过。一边是便宜又经典的热敏电阻NTC,另一边是数字接口、即插即用的DS18B20。选哪个?没有标准答案,得看你的项目到底要什么。

这一节,我就把这两个传感器的底裤扒干净。咱们从原理、精度、成本、功耗、抗干扰、开发难度这几个维度,一个一个掰开揉碎了讲。

2.1 热敏电阻(NTC) —— 老将出马,一个顶俩?

NTC,全称是负温度系数热敏电阻。说白了,温度越高,电阻值越小。这个关系不是线性的,而是指数型的。

核心原理:

NTC的阻值与温度的关系,可以用Steinhart-Hart方程来描述:

1/T = A + B·ln(R) + C·(ln(R))³

其中T是开尔文温度,R是当前阻值,A、B、C是器件特有的系数。实际项目中,我们一般用简化版的B值公式:

R = R₀ · exp(B · (1/T - 1/T₀))

嗯,这里要注意:B值不是常数,它在不同温度区间会有微小变化。所以如果你要求高精度,最好用原厂提供的三参数Steinhart-Hart方程。

关键参数:

  • 精度: 普通NTC ±0.5°C ~ ±1.0°C,高精度NTC可达 ±0.1°C(比如我常用的VISHAY NTCLE系列)
  • 测温范围: -40°C ~ +125°C,体温计场景完全够用
  • 响应时间: 取决于封装,玻璃封装的约2-5秒,贴片封装的约5-10秒
  • 成本: 批量价0.05 ~ 0.3元/颗,便宜到令人发指

我的实战经验:

我在做一款医用额温枪时,就选了高精度NTC做参考温度校准。为什么?因为DS18B20的精度在37°C附近只有±0.5°C,而NTC配合精密分压电阻和查表算法,能做到±0.05°C。你想想看,体温计差0.5°C,病人可能就被误诊了。

但NTC有个大坑:它需要额外的ADC通道和分压电路。而且,分压电阻的温度漂移会直接影响测量结果。我曾经在一个项目中,用了普通1%精度的贴片电阻做分压,结果温度一变化,读数就飘。后来换成25ppm/°C的精密电阻,问题才解决。

避坑指南:

我曾经因为NTC的B值匹配问题,整批产品校准不过。后来发现,不同批次的NTC,B值可能有±1%的偏差。解决方案是:要么用同一批次,要么在产线上做单点校准。

2.2 DS18B20 —— 数字化的便利,也有代价

DS18B20,做嵌入式的应该没人不知道。它把温度传感器、ADC、数字接口全集成在一个TO-92封装里。你只需要一根数据线,就能读出温度值。

核心原理:

DS18B20内部有一个带隙温度传感器,通过Σ-Δ ADC转换成数字信号。它使用1-Wire协议通信,每个器件有唯一的64位ROM码,可以多个传感器挂在同一根总线上。

// DS18B20读取温度示例代码
uint8_t ds18b20_read_temp(float *temp) {
    uint8_t data[2];
    
    ds18b20_reset();
    ds18b20_write_byte(0xCC);  // 跳过ROM
    ds18b20_write_byte(0x44);  // 启动温度转换
    
    delay_ms(750);  // 等待转换完成,12位分辨率需要750ms
    
    ds18b20_reset();
    ds18b20_write_byte(0xCC);
    ds18b20_write_byte(0xBE);  // 读取暂存器
    
    data[0] = ds18b20_read_byte();
    data[1] = ds18b20_read_byte();
    
    int16_t raw = (data[1] << 8) | data[0];
    *temp = raw * 0.0625;  // 12位分辨率下,LSB = 0.0625°C
    
    return 0;
}

关键参数:

  • 精度: ±0.5°C(-10°C ~ +85°C),这是出厂校准的,不需要你自己做
  • 分辨率: 9~12位可配置,对应0.5°C ~ 0.0625°C
  • 测温范围: -55°C ~ +125°C
  • 转换时间: 12位分辨率下需要750ms,9位只需要93.75ms
  • 成本: 批量价2 ~ 5元/颗,比NTC贵一个数量级

我的实战经验:

DS18B20最大的优点是省心。你不需要设计模拟前端,不需要做校准算法,甚至不需要考虑线长带来的电阻影响。我做过一个多通道温度采集系统,一根总线上挂了8个DS18B20,每个传感器相隔5米,照样稳定工作。

但它的缺点也很明显。第一,转换时间太长。750ms才能读一次温度,做实时体温监测?不行。第二,精度天花板低。±0.5°C对于工业监控够了,但做医用体温计?差口气。

避坑指南:

我曾经在一个项目中,DS18B20读数偶尔跳变到85°C。查了半天,发现是1-Wire总线上拉电阻选小了,导致信号反射。记住:1-Wire总线的上拉电阻,建议4.7kΩ,线长超过10米时用2.2kΩ。

2.3 正面硬刚:NTC vs DS18B20 全方位对比

对比维度 NTC热敏电阻 DS18B20
精度 高精度型号可达±0.05°C 出厂校准±0.5°C
分辨率 取决于ADC,理论上无限 最高0.0625°C
测温范围 -40°C ~ +125°C -55°C ~ +125°C
响应时间 2~10秒(取决于封装) 750ms(12位分辨率)
接口 模拟输出,需要ADC 数字1-Wire接口
开发难度 高(需要查表、校准、滤波) 低(直接读寄存器)
成本 0.05~0.3元 2~5元
功耗 极低(μA级,取决于分压电阻) 1mA(转换时),待机μA级
抗干扰 差(模拟信号易受干扰) 好(数字信号,抗噪强)
多传感器 每个需要独立ADC通道 一根总线可挂多个
长期稳定性 一般(老化漂移) 好(出厂已校准)

2.4 我的选型建议

说了这么多,到底怎么选?我个人习惯是这样判断的:

  • 做医用级体温计? 选高精度NTC。精度要求±0.1°C以内,DS18B20做不到。配合24位ADC(比如ADS1220)和精密参考电阻,才能达到医用标准。
  • 做消费级体温计? 选DS18B20。开发周期短,不用做校准,成本也能接受。±0.5°C的精度,日常测体温够用了。
  • 做多通道温度采集? 选DS18B20。一根总线挂几十个传感器,布线简单。用NTC的话,每个传感器都要拉两根线到ADC,板子画到你哭。
  • 做低功耗电池设备? 选NTC。DS18B20转换时1mA的电流,对于纽扣电池来说有点大。NTC配合低功耗MCU的ADC,待机功耗可以做到μA级。

我的小技巧:

如果你实在纠结,可以两个都用。我在一个高端体温计项目中,就用DS18B20做环境温度补偿,用高精度NTC做人体温度测量。DS18B20负责监测环境温度变化,NTC负责精确测量体温。两者配合,效果出奇的好。

2.5 本章小结

NTC和DS18B20,没有绝对的好坏。NTC是模拟方案,上限高但开发难度大;DS18B20是数字方案,下限高但天花板低。

选型时,先问自己三个问题:

  1. 我的精度要求是多少?
  2. 我的开发周期有多长?
  3. 我的成本预算是多少?

想清楚这三点,选型就不难了。下一章,我会讲NTC的硬件电路设计,包括分压网络、ADC选型和抗干扰布局。到时候我会分享一个我踩过的坑——分压电阻的温漂问题,差点让整个项目翻车。

咱们下章见。