ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PT1000+ADS1110实现0.1℃高精度测温的完整实战方案

PT1000+ADS1110实现0.1℃高精度测温的完整实战方案 做工业校准设备的那段时间被“0.1℃精度”折磨得够呛。手里的DS18B20和NTC温度传感器在0.5℃级别的场合用着没毛病可一到客户要求“你给我拿出0.1℃的实测数据”时全都露馅了。后来我把方案换成了PT1000铂电阻加ADS1110这颗16位ΔΣ ADC自己搭了一套I2C测温链路才算真正把高精度测温这件事从“玄学”变成了“工程”。这篇文章就把我踩过的坑、算过的数、调过的时序全部写出来给想做高精度测温的嵌入式同行一个能直接抄的作业。1. 200块钱做好一套0.1℃测温方案背景和选型逻辑1.1 NTC和DS18B20为什么撑不住0.1℃的局先说清一个概念0.1℃精度不是0.1℃分辨率。分辨率只是“能看出变化”精度是“测出来的值和真实温度之间的偏差足够小”。NTC热敏电阻的B值离散性非常大同一批次不同个体之间在25℃下可能偏差好几百欧换算成温度就是1~3℃的差别。即便你在产品出厂时做单点校准它的阻值-温度曲线非线性也做不到全温段都保持0.1℃。DS18B20的出厂精度是±0.5℃天生就在0.1℃这个量级之外。所以要做0.1℃精度第一步是换传感器。PT1000铂电阻的优势在于0℃时标称阻值1000Ω温度系数约3.85Ω/℃在-50℃~150℃范围内线性度非常好。铂电阻的阻值-温度关系在国内标准里是有明确分度表的溯源性强适合做计量级设备。相对于PT100PT1000阻值更高相同激励电流下能获得更大的电压信号对ADC的输入噪声容忍度更高而且几乎没有自热问题。PT1000也不是没缺点主要是0℃时的标准阻值和实际阻值存在制造公差这是后话标定阶段能解决。1.2 ADS1110这颗ADC的定位ADS1110是TI推出的一颗内置I2C接口的16位ΔΣ ADC。我第一次看到它的数据手册时感觉这芯片就是为精密测温量身定做的16位分辨率内部参考电压2.048V自带可编程增益放大器PGA增益可选1/2/4/8。内置振荡器不需要外部时钟I2C从机地址可以通过地址引脚配置一条I2C总线上最多可以挂多片。转换速率最高240SPS测温场景下完全够用而且速率调低后噪声明显下降。当初我没有选ADS1115它更出名四通道是因为ADS1110在单通道应用下占用的PCB面积更小而且内部基准精度标称值在测温这个场景下更好控制。当然如果你要同时测多路温度直接换ADS1115或购买外部基准的方案也合理核心逻辑是一样的。1.3 整套方案的成本和后续扩展算一笔账PT1000探头工业铠装或者贴片式十几块到四十块不等ADS1110大概三五块钱加上一个精密参考电阻、上拉电阻、去耦电容物料总成本一般不超过五十块。哪怕再把PCB打样、焊接工时算进去也完全在200元以内。比买一台成品高精度温度采集模块动辄上千块要划算得多。这套方案的主控我用的是STM32F103的I2C1外设换成ESP32、Arduino或者树莓派也没问题因为ADS1110暴露出来的就是标准I2C接口逻辑分析仪能看到的就是SDA和SCL两条线上的电平变化。2. 模拟前端设计分压电路参数计算和噪声预算2.1 恒流源 vs 分压器——我为什么选分压把PT1000的阻值变化转换成电压常见两种做法恒流源激励和分压器。恒流源的好处是电压与电阻严格线性关系但恒流源本身低温漂的设计比较复杂很多廉价恒流芯片在0.1℃精度面前根本不合格。分压器就简单多了一个参考电阻加上PT1000直接用ADC测量PT1000上的端电压原理清晰成本极低。分压器的缺点是PT1000端电压会受总激励电压VDD波动的影响。解决办法有两个一是给整个电路用高精度LDO供电把VDD稳定在3.3V±10mV以内二是在同一个ADC上增加一个通道去采VDD电压如果主控还有多余ADC通道做完归一化后再算电阻。我最终选择的是LDO加校准因为ADS1110内部基准是2.048V它测的是PT1000两端电压而不是比例值所以VDD波动确实会叠加进误差后面标定环节也会把它补偿掉。2.2 电阻选型和电压值的完整计算参考电阻R_ref我选了10kΩ的精密电阻。选10kΩ的原因是想让PT1000工作在较低的激励电流水平减小自热效应。具体计算如下以3.3V供电为例激励电流I VDD / (R_ref R_pt) 3.3 / (10000 1000) ≈ 0.3mAPT1000自身功耗P I² × R_pt ≈ (0.0003)² × 1000 ≈ 0.09mW这个功耗水平下自热引起的温度误差通常在0.005℃到0.02℃的量级可以接受。再看0℃和50℃两个点的端电压0℃时R_pt 1000ΩV_pt 3.3 × 1000 / 11000 0.300V50℃时R_pt ≈ 1193.97ΩV_pt 3.3 × 1193.97 / 11193.97 ≈ 0.352V温度变化0.1℃对应的阻值变化约0.385Ω换算到50℃附近电压变化dV/dR VDD × R_ref / (R_pt R_ref)²代入dV/dR ≈ 3.3 × 10000 / (11193.97²) ≈ 0.000264V/Ω所以0.1℃对应的电压变化约0.000264 × 0.385 ≈ 0.000102V也就是102μV。ADS1110在PGA1时LSB 2.048V / 65536 ≈ 31.25μV102μV大概是3.3个LSB能分辨但余量不大。我把PGA设为4输入范围变成0.512VLSB变成7.8μV102μV对应的ADC码值大约是13个LSB。这样0.1℃在数字域有十几倍的余量完全够用后续软件滤波还能再压掉一部分噪声。2.3 去耦和PCB布局的关键细节ADS1110的供电脚一定要加0.1μF的陶瓷电容而且要尽量靠近芯片引脚电容与芯片之间的走线要短粗。我第一版PCB就是因为电容放得太远电源线上带上了一堆高频噪声导致ADC低几位疯狂抖动。后来把电容挪到芯片旁边同时给模拟地做了单点接地噪声毛刺立刻小了一个数量级。如果你是用洞洞板飞线调试那务必做好以下几点PT1000的两根引线要差分走线尽量靠近避免形成环路。数字信号线SDA、SCL不要和PT1000的模拟信号线平行长距离走线。给每个IC的VDD都单独加一个0.1μF去耦电容。3. 让ADS1110正常工作的I2C细节3.1 接线图和I2C上拉电阻的真正难点ADS1110的接线不复杂四根线就够VDD、GND、SCL、SDA。VDD我接3.3VSCL和SDA分别通过上拉电阻接VDD。我踩过最大的一个坑就是I2C上拉电阻的取值。网上的教程大多说“4.7kΩ”但这个值在高速模式下和数据线电容较大的场景下会出问题。一个基本规律是上拉电阻和总线电容共同构成RC常数电阻越大上升沿越缓太快的数据速率下时序就不满足了电阻太小灌电流过大芯片可能拉不低总线。我实测下来上拉电阻电平状态通信结果10kΩ上升沿明显变缓100kHz下能通400kHz下偶发超时4.7kΩ波形正常最稳妥1kΩ电平幅度偏小芯片IO灌电流大从机无响应这个“太小了不通信”的现象让不少人困惑实际上是因为过小的上拉电阻会让总线低电平无法降到VIL阈值以下主机读不到有效的低电平通信自然崩溃。如果你用的是3.3V供电4.7kΩ是首选。3.2 用逻辑分析仪读I2C时序别靠猜接入逻辑分析仪把采样率设到1MHz以上抓一次启动和停止条件。很多人第一次看到I2C波形会懵其实只需要确认四件事SDA在SCL低电平期间跳变这是正确的数据位。启动条件是SCL为高时SDA由高变低。停止条件是SCL为高时SDA由低变高。地址字节的第8位是读/写位随后从机要回一个ACK低电平。我调试时遇到过一次设备“找不到”的情况从波形上看地址0x90发出后第九个时钟周期SDA一直保持高电平说明没收到ACK。排查了一圈发现是ADS1110的地址引脚悬空芯片默认地址并非手册里的0x90而是0x98的变种。把地址引脚接法重新确认后问题解决。3.3 从机地址和读写方向的心得ADS1110的I2C地址由配置寄存器和地址引脚决定实际使用中建议先用I2C扫描程序把所有地址扫一遍。STM32上写一个简单的扫描函数对0x08到0x77逐地址发送看哪个地址有ACK响应。这比对着手册猜要快得多。I2C通信过程中的细节也值得说一句读数据前要确保芯片已经完成一次转换否则读回来的可能是上一次的旧数据。可以用连续转换模式也可以读配置寄存器里的转换完成标志位。很多人在首次上电读到的数据是0x0000就是因为没等第一次转换结束。4. 拿到ADC码值后滤波、换算和修正4.1 STM32 I2C读取代码ADS1110的转换结果由两个字节组成最高位是符号位对于单端正电压来说不会用到。配置寄存器则控制增益、转换速率和模式。以STM32的HAL库为例读一次数据的核心流程如下uint8_t buf[3]; uint16_t adc_raw; int16_t adc_signed; // 读取3个字节高字节、低字节、配置寄存器 HAL_I2C_Master_Receive(hi2c1, (0x90 1) 1, buf, 3, 100); adc_signed (int16_t)((buf[0] 8) | buf[1]); adc_raw (uint16_t)adc_signed; // 配置寄存器示例PGA415SPS连续转换 uint8_t cfg 0x0C; HAL_I2C_Master_Transmit(hi2c1, (0x90 1) 1, cfg, 1, 100);注意HAL库的I2C地址要左移一位ADS1110的7位地址0x48对应到HAL库的参数就是0x90。我第一次就是在这里栽的跟头总是地址不匹配。4.2 从ADC码值换算回电阻假设PGA增益为4ADC输入范围是±0.512VLSB为7.8125μV那么测量电压V_pt adc_raw × 0.512 / 3276816位有符号数然后反推PT1000电阻R_pt (V_pt × R_ref) / (VDD - V_pt)这里的VDD不是3.3V的理论值而是实际测得的供电电压。你可以用万用表把VDD测准然后在代码里写死这个值。比如我实际测得VDD 3.312V那计算时就用3.312而不是3.3。这一步看着微不足道但对精度的影响可以到零点几度。4.3 软件滤波方法高精度测温和高速采集是两码事我的建议是把ADS1110的转换速率配到15SPS或30SPS内部ΔΣ调制器的噪声在低速率下最小。应用层再做一次滑动平均或中值滤波我取了16次滑动平均。滤波窗口不宜过大否则对温度变化的响应会明显变慢做温度曲线测试时会看到滞后。实测下来16次平均后ADC原始数据的峰峰值抖动从原来的±8个LSB降到±1个LSB附近对应到温度就是0.01℃级别的稳定性。4.4 查表法还是计算法PT1000的阻值与温度关系可以查标准分度表也可以根据IEC 751公式直接算温度范围-200℃到0℃R_t R0 × (1 A×t B×t² C×(t-100)×t³)温度范围0℃到850℃R_t R0 × (1 A×t B×t²)其中A 3.9083×10⁻³B -5.775×10⁻⁷C -4.183×10⁻¹²。在单片机上直接算多项式不划算我采用了查表加线性插值的方法把0℃到100℃按每0.5℃建一个电阻表用二分查找定位区间再做线性插值。这样既省内存精度也足够逼近标准公式。5. 标定流程和0.1℃精度的验证5.1 冰点是每个人都会踩的误区标定高精度温度传感器第一个标定点通常选0℃也就是冰水混合物。听起来简单但很多人直接把冰块丢进水里就开测这就错得离谱了。正确的冰水混合物做法是用纯水制作的冰块而不是自来水。把冰块敲碎成冰水混合态水呈冰泥浆状。把PT1000探头插进冰水混合物并充分搅拌等待温度平衡。搅拌的作用非常重要。冰水混合物在一个大气压下稳定在0℃但如果不搅拌探头周围可能存在微小的温度梯度造成的偏差可能达到0.05℃以上直接吃掉一半的精度预算。5.2 三点标定的实施步骤只标定一个零点还不够分压电路存在增益误差你还需要第二个点甚至第三个点。我在实际项目中用了三个点0℃冰水、50℃恒温槽、90℃恒温槽。其中50℃用于修正增益90℃用于验证线性度。标定步骤稳定0℃后读取ADC码值记录为adc_zero。把探头放入50℃恒温槽等示数稳定后读取adc_50。根据两个点的实测值和理论电阻值计算修正系数 gain (R_理论50 - R_理论0) / (R_实测50 - R_实测0) offset R_理论0 - gain × R_实测0将gain和offset写进系统的校准参数区。这样每台设备都有自己的校准系数就不用依赖PT1000的出厂精度了。5.3 验证0.1℃精度需要什么样的参考设备你要验证自己做到0.1℃不能拿另外一个同样的PT1000方案来对比得用一个更高精度的参考源。我用的是一个可溯源的铂电阻温度计配精密数字测温仪不确定度约0.03℃。如果手头没有这种设备至少也要用经过第三方校准的工业温度计来对比。我的最终误差测试结果如下参考温度系统显示温度偏差0.02℃0.01℃-0.01℃25.13℃25.17℃0.04℃50.06℃50.10℃0.04℃90.22℃90.30℃0.08℃90℃那个点的偏差略大主要是PT1000的B值非线性在高温段表现更明显如果想进一步压下来可以增加更多插值点或者直接上二次多项式修正。6. 几个坑和我的最终看法6.1 电源抖动是整个链路最大的隐患在做连续测试时我遇到过一次诡异现象白天温度数据正常到了晚上同一温度点测出来的值偏高0.2℃左右。排查了很久发现问题出在晚上厂区的大型设备启动市电波动导致LDO输出电压发生变化进而改变了激励电流和分压比。后来我在LDO前面加了共模电感和LC滤波同时把采样和计算逻辑改为周期性地测量VDD电压把这个动态误差压下去了。用ADC测量供电电压时不需要额外硬件直接用ADS1110的另一个通道对电源分压后测量或者用主控内部ADC采一下VDD然后实时更新换算公式里的VDD参数。这个方法简单有效强烈推荐加进去。6.2 I2C调试最容易被忽视的其实是时序余量很多人认为I2C慢速通信无所谓时序实际在高阻态总线、加上拉电阻、再加长距离引线的情况下上升沿可能严重拖尾。我用逻辑分析仪分析波形时看到SCL上升沿几乎变成了一个斜坡而ADS1110对SCL上升时间是有上限要求的一旦超了就可能采样错误。解决办法是换4.7kΩ上拉或者把I2C时钟降到一个保守值比如50kHz。硬件能改就改硬件不能改就把时序放宽。另外提醒一下调试时要区分“没有ACK”和“有ACK但数据全为0xFF”的区别。前者是从机没上班或者地址不对后者是通信协议没问题但从机还没准备好转换结果还是要回到配置和转换使能上去查。这两种问题用串口调试助手打印原始数据最容易看出来。6.3 0.1℃精度的本质是系统工程整套方案做下来我最大的体会是0.1℃精度不是某颗芯片决定的而是传感器、供电、基准、ADC、PCB布线、标定流程和软件滤波共同作用的结果。ADS1110只是一颗好用的ADCPT1000也只是一个好探头但它们组合在一起能不能达到0.1℃取决于你愿不愿意把每个环节的误差都认真算一遍。最后分享一个我保留到现在的习惯每一版硬件改动后都重新跑一遍0℃和50℃两点标定并且记录标定系数。这样一旦数据异常回头查硬件改动记录很快就能定位原因。测温项目最怕的不是精度不够而是精度不稳定——稳住整个系统才是真正的硬功夫。
返回列表