☰
PT1000与ADS1110高精度温度采集:I2C配置与0.1℃校准实战
2026/9/27 1:54:27 网站建设 项目流程

1. 为什么PT1000配ADS1110是个值得认真对待的组合

PT1000和ADS1110搭在一起做温度采集,在工业测控、实验室设备、恒温箱控制这些场景里非常常见。原因不复杂:PT1000在0℃时阻值1000Ω,温度系数约3.85Ω/℃,信号幅度比PT100大一个数量级,引线电阻和接触电阻带来的相对误差更小;ADS1110是16位ΔΣ ADC,内置PGA和基准,差分输入,I2C接口,SOT-23-6封装,一颗芯片就能把PT1000的微弱电压变化量化到足够细的分辨率。两者组合,硬件成本低,布线简单,但想做到0.1℃的精度,光靠"接上就能用"是不现实的。

我见过太多项目卡在最后一步:电路焊好了,I2C能读到数据,但温度值跳来跳去,或者和标准温度计差个一两度。问题往往不在芯片本身,而在于几个容易被忽略的细节——PT1000的激励电流怎么定、ADS1110的PGA增益和基准怎么配合、I2C上拉电阻选多大、校准到底该用几段拟合。这篇文章就把这些环节一个一个拆开,从I2C底层配置讲到0.1℃校准的完整流程,适合正在做温度采集的嵌入式工程师、硬件工程师,也适合想搞明白"为什么我的ADC读数不准"的开发者。

先说一个反直觉的结论:ADS1110的16位分辨率不等于16位精度。它的有效位数受噪声、基准温漂、PGA失调影响,实际能稳定到14位左右就不错了。而PT1000的非线性、自热效应、引线电阻,每一个都能吃掉你辛苦攒下的精度。所以整个系统的精度天花板,往往不是ADC决定的,而是传感器和校准方法决定的。

2. ADS1110的I2C通信:从时序到上拉电阻的实战细节

2.1 ADS1110的I2C地址与寄存器结构

ADS1110的I2C从机地址是固定的0x48(7位地址),写操作地址0x90,读操作地址0x91。它没有地址选择引脚,所以一条I2C总线上只能挂一颗ADS1110。如果你需要多路采集,要么用I2C多路复用器,要么换ADS1115这类带地址选择的型号。这一点在项目规划阶段就要想清楚,不然后期改板很麻烦。

ADS1110内部只有一个可访问的寄存器,但它的读写行为不同:写的时候写入的是配置字节,读的时候读出的是转换结果(3字节:2字节数据+1字节配置回读)。配置字节的位定义如下:

位名称功能
7ST/DRDY写1启动单次转换,读时表示数据就绪
6-5保留固定写0
4SC单次转换模式选择
3-2DR1:DR0数据速率选择
1-0PGA1:PGA0增益选择

数据速率有四种:15SPS、30SPS、60SPS、240SPS。增益有四种:1倍、2倍、4倍、8倍。这里有个关键点:ADS1110的满量程输入范围是±2.048V(PGA=1时),增益翻倍,满量程减半。比如PGA=8时,满量程是±0.256V。选增益的原则是让PT1000在最高工作温度时的电压尽量接近满量程,但又不能超。

2.2 I2C上拉电阻的计算:为什么4.7k不是万能答案

热词里有人问"i2c上拉电阻小了不通信",这个问题在ADS1110上特别典型。I2C是开漏输出,必须外接上拉电阻。上拉电阻的取值要同时满足两个条件:上升时间足够快,以及低电平灌电流不超过器件能力。

上升时间公式:tr ≈ 0.847 × R × C,其中R是上拉电阻,C是总线电容。I2C标准模式(100kHz)要求上升时间小于1000ns,快速模式(400kHz)要求小于300ns。假设总线电容是100pF(短线、少器件),400kHz下R最大约3.5kΩ。如果电容到200pF,R最大约1.7kΩ。

灌电流方面,ADS1110的低电平输出能力是3mA(VOL=0.4V时)。如果电源3.3V,上拉电阻R,灌电流约(3.3-0.4)/R。要小于3mA,R要大于约0.97kΩ。

所以4.7kΩ在3.3V、100kHz、短线下是安全的,但在400kHz、长线、多器件时可能太大,导致上升沿变缓,通信出错。我一般这样选:3.3V系统、400kHz、总线电容100pF以内,用2.2kΩ;5V系统、100kHz,用4.7kΩ;如果线长超过20cm或者挂了多个器件,先测上升时间,再决定是否降到1.5kΩ甚至1kΩ。

注意:有些MCU内部有可配置的上拉电阻,但通常阻值较大(几十kΩ),只能作为辅助,不能替代外部上拉。热词里"i2c有外部上拉 是否还需配置内部上拉"的答案是:外部上拉足够时,内部上拉要关掉,否则并联后阻值更小,灌电流可能超标。

2.3 用逻辑分析仪抓I2C波形的正确姿势

调试I2C,逻辑分析仪比示波器更实用。抓ADS1110的波形时,重点看几个地方:起始条件是否干净、地址字节后ACK是否拉低、配置字节写入后转换是否启动、读数据时DRDY位是否置1。

一个常见的坑:ADS1110在单次转换模式下,写配置启动转换后,需要等待转换完成才能读。15SPS时一次转换约67ms,240SPS时约4.2ms。如果你写完立刻读,读到的可能是上一次的结果或者无效数据。正确做法是读配置字节的bit7,判断DRDY是否为1,或者干脆延时足够时间再读。

逻辑分析仪的采样率至少要是I2C速率的10倍。400kHz的I2C,采样率设4MHz以上,才能看清时序细节。解码器选I2C,设置好地址和寄存器,直接看解码结果,比人眼数脉冲快得多。

3. PT1000信号链设计:从激励电流到ADC输入

3.1 PT1000的阻值特性与激励电流选择

PT1000的阻值随温度变化,0℃时1000Ω,100℃时约1385Ω,-50℃时约803Ω。温度系数约3.85Ω/℃,但实际是非线性的,需要用Callendar-Van Dusen方程或者查表法处理。

激励电流的选择是个权衡。电流越大,PT1000上的电压越大,ADC读数信噪比越好;但电流越大,PT1000自热越严重。PT1000的自热系数在静止空气中约0.2℃/mW,在流动液体中约0.05℃/mW。假设激励电流1mA,PT1000在100℃时阻值1385Ω,功耗约1.385mW,静止空气中自热约0.28℃。这已经超过0.1℃的精度目标了。

所以激励电流要小。我一般选0.5mA以下,最好0.2-0.3mA。但电流小了,电压也小:0.3mA × 1000Ω = 300mV,0.3mA × 1385Ω = 415mV。这个电压范围用ADS1110的PGA=4(满量程±0.512V)刚好合适。如果PGA=8(满量程±0.256V),100℃时就超量程了。

激励电流的来源可以是恒流源,也可以用基准电压加精密电阻分压。恒流源更稳,但成本高。我用得比较多的是REF3025(2.5V基准)加一个精密电阻,比如2.5V/0.25mA=10kΩ,但这样电流会随温度略变。更好的方案是用运放搭一个恒流源,或者用ADS1110的内部基准?ADS1110没有输出基准,所以外部基准是必须的。

3.2 差分输入与引线电阻补偿

ADS1110是差分输入,PT1000接在VIN+和VIN-之间。如果是两线制接法,引线电阻直接串在PT1000上,每根线几欧姆到几十欧姆,直接带来误差。比如引线电阻1Ω,对PT1000来说就是约0.26℃的误差。

三线制可以补偿引线电阻,但需要两路ADC或者模拟开关切换。四线制最准,但布线多。对于0.1℃精度,我建议至少用三线制,或者用两线制但校准掉引线电阻。

具体做法:三线制时,PT1000一端接两根线,另一端接一根线。两根线分别接VIN+和VIN-,第三根线接激励电流回路。这样引线电阻在差分输入的两端各贡献一次,共模抵消。但ADS1110只有一路差分输入,所以三线制需要配合模拟开关分时测量,或者用两个ADS1110。

如果项目成本敏感,两线制也能做到0.1℃,前提是引线电阻稳定且已知。校准时把引线电阻测出来,在计算温度时减掉。但引线电阻会随温度变化(铜线温度系数约0.4%/℃),如果环境温度变化大,这个补偿就不准了。

3.3 基准电压与PGA的配合计算

ADS1110的基准是内部的2.048V,但它的精度和温漂直接影响测量结果。数据手册给的初始精度是±0.05%,温漂典型值5ppm/℃。在0-50℃范围内,基准变化约0.0125%,对应温度误差约0.03℃。这个可以接受,但如果要求更高,就需要外部基准或者软件校准。

PGA的选择前面提过,要让最高温度时的电压接近但不超过满量程。以0.3mA激励、-50到150℃为例:

  • -50℃:803Ω × 0.3mA = 241mV
  • 150℃:1573Ω × 0.3mA = 472mV

PGA=4时满量程±512mV,472mV在范围内,且用了92%的量程,分辨率利用充分。PGA=8时满量程±256mV,150℃时超了。所以PGA=4是正确选择。

这里有个细节:ADS1110的输入范围是差分电压,但共模电压也有要求。VIN+和VIN-的共模电压要在GND-0.1V到VDD+0.1V之间。如果PT1000一端接地,另一端接激励,共模电压就是PT1000上的电压,约240-470mV,没问题。但如果用恒流源从上方拉电流,共模电压可能偏高,要注意。

4. 从ADC原始码到温度值:转换与非线性处理

4.1 ADC码值与电压的换算

ADS1110的输出是16位有符号数,范围-32768到32767。满量程对应PGA=1时±2.048V,PGA=4时±0.512V。换算公式:

V = (code / 32768) × VFSR

其中VFSR是满量程电压。比如PGA=4,VFSR=0.512V,code=16000,则V=16000/32768×0.512=0.25V。

但要注意,ADS1110的输出格式是二进制补码,负电压时code是负的。PT1000的电压始终为正,所以code始终为正,范围0-32767对应0到VFSR。

实际代码里,我一般这样写:

int16_t raw = (buf[0] << 8) | buf[1]; float voltage = (float)raw / 32768.0f * 0.512f;

然后根据激励电流算电阻:

float resistance = voltage / EXCITATION_CURRENT;

4.2 PT1000的Callendar-Van Dusen方程

PT1000的阻值-温度关系用Callendar-Van Dusen方程描述:

  • T ≥ 0℃:R(T) = R0 × (1 + A×T + B×T²)
  • T < 0℃:R(T) = R0 × (1 + A×T + B×T² + C×(T-100)×T³)

其中R0=1000Ω,A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。

从阻值反推温度,T≥0℃时可以直接解二次方程:

T = (-A + sqrt(A² - 4B(1 - R/R0))) / (2B)

T<0℃时没有解析解,需要用迭代法或者查表法。我一般用二分法迭代,10次就能到0.001℃精度。

float pt1000_resistance_to_temp(float r) { float r0 = 1000.0f; float A = 3.9083e-3f; float B = -5.775e-7f; float C = -4.183e-12f; float ratio = r / r0; if (ratio >= 1.0f) { float disc = A*A - 4*B*(1-ratio); return (-A + sqrtf(disc)) / (2*B); } else { float t_low = -200.0f, t_high = 0.0f; for (int i = 0; i < 20; i++) { float t_mid = (t_low + t_high) / 2; float r_mid = r0 * (1 + A*t_mid + B*t_mid*t_mid + C*(t_mid-100)*t_mid*t_mid*t_mid); if (r_mid > r) t_high = t_mid; else t_low = t_mid; } return (t_low + t_high) / 2; } }

4.3 自热效应与滤波策略

前面算过,0.3mA激励下自热约0.08℃(静止空气),这个已经接近0.1℃的边界。如果要求更高,要么降低电流,要么改善散热。降低电流到0.1mA,自热降到0.009℃,但电压也降到100-157mV,需要PGA=8(满量程±256mV),这时候噪声会相对变大。

滤波方面,ADS1110内部有数字滤波器,但输出速率越低,滤波效果越好。15SPS时噪声最小,240SPS时噪声最大。如果对实时性要求不高,用15SPS,然后软件再做滑动平均,比如16次平均,噪声可以再降4倍。

我实测过:15SPS、PGA=4、0.3mA激励,ADS1110的峰峰值噪声约10个码,对应电压约0.15mV,电阻约0.5mΩ,温度约0.00013℃。这个噪声水平远小于0.1℃,所以噪声不是瓶颈,瓶颈在基准漂移和PT1000本身的精度。

5. 0.1℃校准全流程:从单点修正到分段拟合

5.1 校准前的准备工作

校准不是拿个标准温度计对比一下就完事。首先要保证整个系统处于热平衡状态。PT1000和标准温度计要放在同一个温场里,且温场要稳定。我一般用恒温水槽或者干体炉,稳定度至少±0.02℃。

标准温度计的精度要高于目标精度一个数量级。要校0.1℃,标准温度计至少0.01℃分辨率,且经过溯源校准。普通酒精温度计、热电偶都不行,至少要用二等标准铂电阻或者高精度数字温度计。

校准点要覆盖工作范围。如果工作范围是0-100℃,至少校0℃、25℃、50℃、75℃、100℃五个点。如果范围更宽,点要更密。每个点等温至少15分钟,让PT1000和标准温度计充分热平衡。

5.2 单点修正与两点校准的局限

最简单的校准是单点修正:在某个温度点,比如25℃,测出误差,然后整体平移。但PT1000的非线性、ADS1110的增益误差,都不是常数偏移,单点修正只能解决零点误差,解决不了增益误差。

两点校准可以同时修正零点和增益:在低温和高温各测一个点,算出斜率和截距。但PT1000的二次非线性还在,中间点的误差可能仍然超过0.1℃。比如0℃和100℃校准后,50℃的误差可能有0.05-0.1℃,取决于PT1000的个体差异。

所以对于0.1℃精度,我建议至少三点校准,最好五点。用最小二乘法拟合一个二次或者三次多项式,把非线性也修掉。

5.3 分段线性拟合的实操步骤

分段线性拟合比多项式更直观,也更容易在MCU上实现。具体步骤:

  1. 在0℃、25℃、50℃、75℃、100℃五个点采集ADC码值,每个点采100次取平均。
  2. 用标准温度计读出实际温度值。
  3. 把ADC码值和实际温度值配对,形成五个校准点。
  4. 在相邻两点之间做线性插值,得到分段线性函数。
  5. 把分段线性函数的系数存到MCU的Flash里。

代码实现:

typedef struct { int16_t adc_code; float temp; } CalPoint; CalPoint cal_points[5] = { {code_0c, 0.0f}, {code_25c, 25.0f}, {code_50c, 50.0f}, {code_75c, 75.0f}, {code_100c, 100.0f} }; float adc_to_temp(int16_t code) { for (int i = 0; i < 4; i++) { if (code >= cal_points[i].adc_code && code <= cal_points[i+1].adc_code) { float ratio = (float)(code - cal_points[i].adc_code) / (cal_points[i+1].adc_code - cal_points[i].adc_code); return cal_points[i].temp + ratio * (cal_points[i+1].temp - cal_points[i].temp); } } return cal_points[4].temp; }

分段线性拟合的优点是计算量小,缺点是分段点处导数不连续,但温度测量对导数连续性不敏感,所以完全够用。

5.4 校准数据的存储与温度补偿

校准系数要存在非易失存储器里,比如MCU的Flash或者外部EEPROM。存储时要注意字节对齐和校验,防止数据损坏。我一般加一个CRC16校验,读出来先校验,校验不过就用默认系数。

如果环境温度变化大,还要考虑ADS1110基准的温漂补偿。可以在板上加一颗温度传感器(比如DS18B20或者MCU内部温度传感器),测出环境温度,然后根据基准的温漂曲线修正。但ADS1110的温漂典型值5ppm/℃,在0-50℃内变化0.025%,对应温度误差0.06℃,如果要求0.1℃精度,这个补偿是可做可不做的。如果要求0.05℃,就必须做。

6. 实测中的坑与排查链路

6.1 I2C通信失败:从波形到上拉的排查顺序

I2C不通是最常见的问题。我的排查顺序是:

  1. 先用万用表测SDA和SCL的对地电压。空闲时应该是高电平(上拉电阻拉高)。如果是低电平,说明总线被拉死,可能是某个器件故障或者地址冲突。
  2. 用逻辑分析仪抓波形。看起始条件、地址字节、ACK位。如果地址字节后没有ACK,说明从机没响应,检查地址是否正确、器件是否供电。
  3. 如果ACK有,但数据不对,看上升沿是否太缓。上升时间超过1μs,400kHz下就会出错。这时候减小上拉电阻。
  4. 如果波形正常但读不到数据,检查ADS1110的配置字节是否写对。特别是ST/DRDY位,写1才启动转换。

我遇到过一次,上拉电阻4.7kΩ,线长30cm,400kHz,通信时好时坏。抓波形发现上升沿约800ns,接近临界。换成2.2kΩ后稳定。所以长线高速时,上拉电阻一定要算。

6.2 温度值跳变:噪声源定位与抑制

温度值跳变通常有几个来源:电源噪声、基准噪声、PT1000引线干扰、ADC噪声。

先看电源。ADS1110的VDD要干净,最好加10μF和0.1μF去耦,且靠近芯片。如果电源上有开关噪声,加LC滤波或者LDO。

再看基准。ADS1110内部基准对电源敏感,VDD波动会直接调制基准。用示波器看VDD纹波,如果超过10mV,就要处理。

PT1000引线要远离高频信号线,最好用屏蔽线,屏蔽层单端接地。如果PT1000和ADC距离远,用差分走线,且走线尽量短。

ADC噪声方面,降低数据速率、增加平均次数、在输入端加RC滤波(比如1kΩ+100nF,截止频率1.6kHz)都有帮助。

6.3 校准后仍偏差大:检查热平衡与标准器

校准后偏差大,先别怀疑算法,检查热平衡。PT1000和标准温度计如果不在同一位置,温场不均匀,差0.5℃都正常。我一般把PT1000和标准温度计绑在一起,插入恒温槽同一深度,等15分钟以上。

标准器本身也要检查。标准温度计是否在有效期内?分辨率够不够?如果标准器本身有0.1℃误差,校准结果肯定不对。

还有一个容易忽略的点:PT1000的封装。金属封装的热响应快,但容易受安装应力影响;陶瓷封装稳定,但热响应慢。校准时如果PT1000还没热透,读数会偏低或偏高。

6.4 长期稳定性:定期校准与漂移监测

0.1℃精度不是一劳永逸的。PT1000会老化,ADS1110的基准会漂移,焊点会氧化。我一般建议每半年到一年重新校准一次,或者在系统里加一个参考电阻,定期自校准。

参考电阻法:在板上放一个高精度、低温漂的电阻(比如0.01%精度、5ppm/℃的金属箔电阻),阻值接近PT1000在某个温度下的阻值。定期切换到参考电阻,测量其阻值,如果和标称值偏差超过阈值,就触发重新校准或者报警。

这个方法能监测ADS1110和激励电流的漂移,但不能监测PT1000本身的漂移。PT1000的漂移只能通过定期和标准温度计对比来发现。

7. 几个让精度再上一层的细节

7.1 激励电流的换向测量

PT1000的引线电阻和热电动势会影响测量。热电动势在μV级别,对0.1℃(约0.385mV)来说不可忽略。换向测量可以消除热电动势和部分引线电阻影响:正向通电流测一次,反向通电流测一次,两次结果相减除以2,热电动势被抵消,引线电阻也被抵消。

实现上需要H桥或者模拟开关切换电流方向。成本增加不多,但精度提升明显。我实测过,换向测量可以把热电动势带来的误差从0.05℃降到0.005℃以下。

7.2 多点温度平均与空间梯度补偿

如果测量的是一个大体积对象,单点PT1000可能代表性不够。可以在不同位置放多个PT1000,分别采集,然后加权平均。权重根据热传导模型或者实验确定。

空间梯度补偿更复杂,需要建立热模型。对于大多数应用,多点平均就够了。比如恒温箱,放3个PT1000,分别在上中下,取平均,比单点稳定得多。

7.3 固件中的自检与故障诊断

固件里加自检逻辑,能提前发现故障。比如:

  • 读ADS1110的配置寄存器,检查是否和写入一致。
  • 检查ADC码值是否在合理范围(比如PT1000断路时码值会到满量程,短路时到0)。
  • 检查温度变化率,如果超过物理可能(比如1秒变10℃),说明有干扰或者故障。
  • 定期测参考电阻,监测漂移。

这些自检逻辑不复杂,但能避免很多现场故障。我一般会在固件里加一个诊断模式,通过串口输出原始码值、电压、电阻、温度,方便现场排查。

7.4 与ADS1220等更高精度方案的对比

ADS1110是16位,ADS1220是24位,后者精度更高,但成本也高。如果0.1℃不够,要0.01℃,ADS1220是更好的选择。ADS1220内置PGA、基准、激励电流源,集成度更高,但I2C/SPI接口更复杂,配置寄存器更多。

选型时不要盲目追高。0.1℃用ADS1110够了,0.01℃才需要ADS1220。而且ADS1220的24位有效位数也不是全有效,实际能到20-21位就不错了。关键是整个信号链的匹配,ADC再好,PT1000和基准不行,也白搭。

我在实际项目中的体会是:PT1000+ADS1110做到0.1℃是可行的,但需要认真对待每一个环节。I2C上拉电阻要算,激励电流要小,校准要分段,自检要有。最容易被忽略的是热平衡和标准器精度,很多人校准不准,问题不在电路,而在校准方法。最后分享一个小技巧:校准前先用冰水混合物和沸水做个粗校,确认系统大致正常,再用恒温槽精校,这样能省很多时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询