ARTICLE DETAIL

资讯详情

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

PT1000与ADS1110高精度温度采集:I2C配置与0.1℃校准实战

PT1000与ADS1110高精度温度采集:I2C配置与0.1℃校准实战 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从机地址是固定的0x487位地址写操作地址0x90读操作地址0x91。它没有地址选择引脚所以一条I2C总线上只能挂一颗ADS1110。如果你需要多路采集要么用I2C多路复用器要么换ADS1115这类带地址选择的型号。这一点在项目规划阶段就要想清楚不然后期改板很麻烦。ADS1110内部只有一个可访问的寄存器但它的读写行为不同写的时候写入的是配置字节读的时候读出的是转换结果3字节2字节数据1字节配置回读。配置字节的位定义如下位名称功能7ST/DRDY写1启动单次转换读时表示数据就绪6-5保留固定写04SC单次转换模式选择3-2DR1:DR0数据速率选择1-0PGA1:PGA0增益选择数据速率有四种15SPS、30SPS、60SPS、240SPS。增益有四种1倍、2倍、4倍、8倍。这里有个关键点ADS1110的满量程输入范围是±2.048VPGA1时增益翻倍满量程减半。比如PGA8时满量程是±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Ω。如果电容到200pFR最大约1.7kΩ。灌电流方面ADS1110的低电平输出能力是3mAVOL0.4V时。如果电源3.3V上拉电阻R灌电流约(3.3-0.4)/R。要小于3mAR要大于约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时一次转换约67ms240SPS时约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。假设激励电流1mAPT1000在100℃时阻值1385Ω功耗约1.385mW静止空气中自热约0.28℃。这已经超过0.1℃的精度目标了。所以激励电流要小。我一般选0.5mA以下最好0.2-0.3mA。但电流小了电压也小0.3mA × 1000Ω 300mV0.3mA × 1385Ω 415mV。这个电压范围用ADS1110的PGA4满量程±0.512V刚好合适。如果PGA8满量程±0.256V100℃时就超量程了。激励电流的来源可以是恒流源也可以用基准电压加精密电阻分压。恒流源更稳但成本高。我用得比较多的是REF30252.5V基准加一个精密电阻比如2.5V/0.25mA10kΩ但这样电流会随温度略变。更好的方案是用运放搭一个恒流源或者用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 241mV150℃1573Ω × 0.3mA 472mVPGA4时满量程±512mV472mV在范围内且用了92%的量程分辨率利用充分。PGA8时满量程±256mV150℃时超了。所以PGA4是正确选择。这里有个细节ADS1110的输入范围是差分电压但共模电压也有要求。VIN和VIN-的共模电压要在GND-0.1V到VDD0.1V之间。如果PT1000一端接地另一端接激励共模电压就是PT1000上的电压约240-470mV没问题。但如果用恒流源从上方拉电流共模电压可能偏高要注意。4. 从ADC原始码到温度值转换与非线性处理4.1 ADC码值与电压的换算ADS1110的输出是16位有符号数范围-32768到32767。满量程对应PGA1时±2.048VPGA4时±0.512V。换算公式V (code / 32768) × VFSR其中VFSR是满量程电压。比如PGA4VFSR0.512Vcode16000则V16000/32768×0.5120.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³)其中R01000ΩA3.9083e-3B-5.775e-7C-4.183e-12。从阻值反推温度T≥0℃时可以直接解二次方程T (-A sqrt(A² - 4B(1 - R/R0))) / (2B)T0℃时没有解析解需要用迭代法或者查表法。我一般用二分法迭代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需要PGA8满量程±256mV这时候噪声会相对变大。滤波方面ADS1110内部有数字滤波器但输出速率越低滤波效果越好。15SPS时噪声最小240SPS时噪声最大。如果对实时性要求不高用15SPS然后软件再做滑动平均比如16次平均噪声可以再降4倍。我实测过15SPS、PGA4、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上实现。具体步骤在0℃、25℃、50℃、75℃、100℃五个点采集ADC码值每个点采100次取平均。用标准温度计读出实际温度值。把ADC码值和实际温度值配对形成五个校准点。在相邻两点之间做线性插值得到分段线性函数。把分段线性函数的系数存到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[i1].adc_code) { float ratio (float)(code - cal_points[i].adc_code) / (cal_points[i1].adc_code - cal_points[i].adc_code); return cal_points[i].temp ratio * (cal_points[i1].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不通是最常见的问题。我的排查顺序是先用万用表测SDA和SCL的对地电压。空闲时应该是高电平上拉电阻拉高。如果是低电平说明总线被拉死可能是某个器件故障或者地址冲突。用逻辑分析仪抓波形。看起始条件、地址字节、ACK位。如果地址字节后没有ACK说明从机没响应检查地址是否正确、器件是否供电。如果ACK有但数据不对看上升沿是否太缓。上升时间超过1μs400kHz下就会出错。这时候减小上拉电阻。如果波形正常但读不到数据检查ADS1110的配置字节是否写对。特别是ST/DRDY位写1才启动转换。我遇到过一次上拉电阻4.7kΩ线长30cm400kHz通信时好时坏。抓波形发现上升沿约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和基准不行也白搭。我在实际项目中的体会是PT1000ADS1110做到0.1℃是可行的但需要认真对待每一个环节。I2C上拉电阻要算激励电流要小校准要分段自检要有。最容易被忽略的是热平衡和标准器精度很多人校准不准问题不在电路而在校准方法。最后分享一个小技巧校准前先用冰水混合物和沸水做个粗校确认系统大致正常再用恒温槽精校这样能省很多时间。
返回列表