基于ADS122U04与STM32L432的高精度PT100温度采集系统设计与实现
1. 项目概述与方案选型思路做工业温度测量这块的老工程师应该都有同感ADS122U04IPWR这颗芯片在TI的ADC产品线里不算最出圈的但真正用过几轮之后你会发现它其实是性价比相当高的一颗料。最近我在一个暖通空调HVAC项目里把它和STM32L432KC搭在一起做了一套温度采集系统从硬件设计到驱动移植再到产线校准整个流程走下来有不少值得记录的细节分享出来供大家参考。先说清楚这个系统是干什么的。我们需要采集多路温度信号包括风管内的送风温度、回水管的进出水温度、以及压缩机排气温度测温范围从零下十度到一百二十度左右精度要求±0.3℃以内。传感器用的是PT100铂电阻三线制接法。主控选了STM32L432KC这是ST的超低功耗系列芯片Cortex-M4内核主频80MHzFlash 256KBRAM 64KB体积小、功耗低非常适合做这种嵌入式的采集节点。而ADS122U04则承担了所有模拟信号的前端采集任务。ADS122U04IPWR的参数值得先过一遍。这是TI的24位ΔΣ型ADC内置4路差分输入也可以配置成7路单端输入有两个可编程激励电流源一个内部温度传感器带PGA可编程增益放大器增益档位从1到128。它和主控之间走SPI通信速度最高能到10Mbps。为什么选它而不是ADS1220或者ADS1248原因有几个首先是24位的分辨率让低温漂信号的提取变得从容其次内置的激励电流源正好配合RTD的三线制测量省掉了外部恒流源电路再次它的功耗在同级别产品里属于较低水平几微安的待机电流对供电紧张的现场很友好。另外“U”后缀代表的是增强型版本相比不带U的版本在滤波和稳定性上做了些优化实测数据表现也确实更稳。放在HVAC这个场景里这套方案的意义在于能用一颗中低价的ADC搞定多路高精度温度采样同时把主控的资源释放出来做PID控制、通信协议栈和故障诊断。很多做工业仪表的老工程师可能还在用MSP430加ADS1247的老方案但如今MCU的价格和性能都在变化STM32L432KC加上ADS122U04的搭配在成本和性能上找到了一个比较舒服的平衡点。接下来按硬件电路、软件驱动、校准补偿、故障排查这条线逐步展开重点讲实操层面可复现的内容。2. 硬件设计从传感器到MCU的信号链路2.1 三线制PT100的接法与激励电流配置PT100的测温原理是电阻值随温度变化0℃时电阻值100Ω温度每升高1℃电阻约增加0.385Ω。因为变化量很小所以对测量链路里的每一个环节都有苛刻要求。三线制接法是为了消除导线电阻带来的误差。原理是给PT100一端接一根线另一端接两根线三根线的材质、长度、规格保持一致那么两根线上的压降可以相互抵消。ADS122U04内部有两个激励电流源IDAC1和IDAC2可以分别配置输出电流大小可选范围是0mA、10μA、50μA、100μA、250μA、500μA、1mA、1.5mA。对于PT100来说我实际用的是1mA。选择1mA的原因需要展开说一下。激励电流越大传感器两端的电压信号就越强ADC的原始码值分辨率就越高。但电流大了之后PT100自身发热产生的温升误差也会变大尤其是在静止空气中散热条件差自热效应会比较明显。查过PT100的规格书它的自热系数通常在0.05℃/mW到0.1℃/mW之间。用1mA电流在PT100标称300Ω时功耗是I² × R (0.001)² × 300 0.0003W也就是0.3mW引起的自热温升约0.03℃完全在误差预算之内。如果电流加到1.5mA功耗就是0.675mW温升接近0.07℃虽然也不算大但在高精度应用里没必要冒这个风险。接线方式上我倾向于把三根线分别标成红线R1、蓝线R2、黑线R3。其中R1和R2接PT100的两端R3接PT100的其中一端与R1公共节点。接法上R1接入AIN0正输入端R2接入AIN1负输入端R3接入AIN2作为第三个测量通道可以做开路检测用。IDAC1接到AIN0IDAC2接到AIN2。当IDAC1和IDAC2的电流设置相同时流经R1和R2上的电流相同导线电阻引起的压降相互抵消此时AIN0与AIN1之间的电压差就只与PT100自身的电阻有关。2.2 参考电阻与比例测量的设计要点要让测量结果稳定参考基准的选择很重要。我用的方案是比例测量法。在AIN2和AIN3之间接了一个精密参考电阻Rref阻值为3.3kΩ精度0.1%温漂5ppm/℃。IDAC2输出的激励电流流经Rref产生的电压作为ADC的参考电压。这样激励电流的波动被视为参考电压和信号电压共模变化在比例测量中会被自动抵消掉。换句话说我的ADC参考电压不是一个固定值而是跟随着激励电流变化。这就极大降低了对高精度基准源的要求。这个方法的一个隐含好处是ADC的测量范围永远不会超过参考电压输入信号与参考电压同源量程比始终合理。计算过程是这样的1mA电流流经3.3kΩ电阻产生3.3V的参考电压正好落在ADS122U04推荐的参考电压输入范围内最大AVDD - 1.2V左右通常3.3V供电时取2.5V到3.0V更安全。如果用2.5V供电那Rref就要选2.49kΩ保证参考电压约2.49V留出余量给PGA的输入摆幅。注意参考电阻的温漂在工业现场对整机漂移的影响是决定性的。5ppm/℃看起来不错但在环境温度从10℃变化到50℃时Rref的阻值变化约0.02%折合到温度读数约0.05℃这个指标可以接受。如果预算允许用10ppm/℃的普通电阻在HVAC场景也能凑合但品牌件最好选Vishay或者是国产的军工级晶圆电阻别贪便宜用贴片厚膜。2.3 STM32L432KC侧的外围电路STM32L432KC这颗MCU的供电范围是1.71V到3.6V实际项目里用的是3.3V LDO供电因为ADS122U04的模拟电源和MCU的数字电源共用一个3.3V稳压源拓扑上简单。但这里有一个容易踩的坑ADC的模拟电源AVDD和数字电源DVDD都是3.3V没问题但MCU的I/O口输出的SPI信号电平也是3.3V而ADS122U04的数字输入高电平门槛是0.7×DVDD即约2.31V逻辑兼容没有问题不需要额外的电平转换电路。硬件上务必在ADS122U04的模拟电源引脚附近放置去耦电容。我一共放了两种规格一个10μF的钽电容滤低频分量一个0.1μF的陶瓷电容滤高频分量两者并联。摆放位置要尽量靠近电源引脚走线要短回流路径要直。AVID DVDD内部虽然有LDO但不代表电源设计可以随意去耦做不好的情况下24位ADC的高位数码会变成纯噪声你根本分不清是环境干扰还是传感器信号跳变。SPI接口方面我的接法比较常规SCLK 接PB13MOSI接PB15MISO接PB14片选CS接PB12。注意ADS122U04的SPI是只支持Mode 1CPOL0CPHA1的这个很容易配错如果配错成Mode 0也能通信但读回来的数据偶尔会错位。这个细节后面在驱动部分会详细说明。另外还有一个容易被忽略的引脚是DRDY这是转换完成标志。我把它接在PB11上启用外部中断下降沿触发。每次转换完成DRDY拉低主控进中断去读数据这样的方式比轮询省了不少CPU开销。如果你在多任务环境里跑RTOS这个中断方式几乎是必须的否则轮询会占掉一个任务的时间片。3. 驱动开发与SPI通信细节3.1 ADS122U04的寄存器配置ADS122U04的内部寄存器一共有五个每个8位宽。配置的重点在寄存器0、寄存器1和寄存器2。寄存器0控制的是输入多路复用器MUX和PGA增益。MUX选择是4个差分输入之一。要测量AIN0和AIN1之间的差分电压MUX配置就设为001即AINPAIN0AINNAIN1。PGA增益设为1因为PT100在1mA激励下的满量程电压大约是300mV左右不需要放大。如果用的是K型热电偶那PGA就要设为32甚至64把微伏级的信号放大后再进ADC。寄存器1的控制位包括数据速率、工作模式、滤波器设置和激励电流源设置。数据速率我选择了20SPS对应内部数字滤波器的截止频率大约是5Hz左右。为什么选20SPS而不是1000SPS因为在工业HVAC应用里温度变化本身就是一个慢变信号时间常数通常是几十秒到几分钟的量级20SPS已经可以完整重建信号而且速率越低数字滤波器的陷波效果越好。最重要的是20SPS时ADS122U04内置的50Hz/60Hz工频干扰抑制能力最强数字滤波器的同步采样特性会把工频干扰压到极低的水平。实测下来在工业现场有变频器干扰的情况下20SPS的数据跳变峰峰值只有约0.02℃非常稳定。激励电流源的配置在寄存器1的高两位。IDAC1和IDAC2的输出目标引脚分别在寄存器2中配置。我把IDAC1设为1000μA接到AIN0IDAC2设为1000μA接到AIN2。注意这两路电流大小必须完全一致否则三线制的抵消原理就不成立了。TI的寄存器配置里IDAC1和IDAC2的电流值分开设置虽然芯片出厂时内部匹配度很高但软件设置时两个值必须保持一致这一点很容易被忽略。寄存器2配置的是IDAC输出引脚和内部传感器使能。寄存器3和寄存器4用于配置低侧开关和GPIO我在这个项目里基本用默认值。3.2 SPI通信的时序与代码实现ADS122U04的SPI时序有一个不太一样的地方它的MISO线上返回的数据是在SCLK的下降沿输出的主控必须在上升沿采集数据。这在STM32的SPI硬件外设里对应的配置是CPOL0CPHA1也就是SPI Mode 1。如果用的是STM32CubeMX生成初始化代码默认生成的SPI配置可能是Mode 0需要手动改掉。另外片选信号的管理也有讲究。ADS122U04的每个命令帧要拉低CS、发送字节、然后拉高CS。但读数据的时候有的工程师会用CS连续拉低、读取多个字节这个做法在ADS122U04上是可以的但要注意读操作期间不能把CS拉高否则数据指针会复位你就永远只能读到第一个字节。我贴上实际项目中用的核心代码片段基于HAL库实现SPI_HandleTypeDef hspi1; // 写单字节寄存器 void ADS122U04_WriteReg(uint8_t reg_addr, uint8_t reg_data) { uint8_t cmd 0x40 | (reg_addr 2); // 写寄存器命令R/W位1 uint8_t data reg_data; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 10); HAL_SPI_Transmit(hspi1, data, 1, 10); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); }要注意的是ADS122U04写寄存器命令是第一个字节高四位是命令代码0x4X低两位是寄存器地址也就是第二步传地址第三步传数据。如果地址搞错了数据会写进不对的寄存器表现就是配置了但没反应。调试时可以先读回寄存器确认。读数据时发送0x20命令进入读取模式然后连续读取三个字节得到24位转换结果。注意ADC结果是24位有符号数用补码表示int32_t ADS122U04_ReadData(void) { uint8_t cmd 0x20; // RDATA命令 uint8_t buf[3] {0, 0, 0}; int32_t raw 0; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 10); HAL_SPI_Receive(hspi1, buf, 3, 10); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); raw ((int32_t)buf[0] 16) | ((int32_t)buf[1] 8) | buf[2]; // 24位有符号数扩展 if (raw 0x800000) { raw | 0xFF000000; } return raw; }如果数据一直读出来是0xFFFFFF说明ADC在转换过程中出错一般是SPI时序不对或DRDY没有准备好需要检查是不是在DRDY变低之前就去读数据了。正常流程是启动连续转换模式0x02命令后等待DRDY引脚拉低再发RDATA命令读数据。如果CS拉低太早ADC可能还没锁存数据返回的就是上一次或无效值。3.3 DRDY中断与数据同步机制很多工程师第一次调这颗ADC时会直接在while循环里轮询DRDY引脚发现也能读到数据。但在实际项目中我不会这么干。原因是轮询在单任务裸机程序里问题不大但在移植RTOS或者需要同时处理多路传感器、通信协议和显示刷新时轮询会让时间片碎片化无法确定能不能在DRDY有效窗口内及时读取数据。我的做法是把DRDY接到STM32的GPIO外部中断上。配置成下降沿触发中断回调函数里设置一个标志位主循环检测到标志后立刻发RDATA命令读数据。这个流程的时序窗口很充裕因为ADS122U04在DRDY拉低后的数据保持时间足够长只要在下一个转换周期开始之前读走就行。20SPS时转换周期是50ms读取三个字节的SPI传输时间在8MHz时钟下大约3μs不到时间余量非常充足。4. 温度计算、校准与滤波处理4.1 原始码值到电阻值的换算拿到ADC的原始码值是第一步接下来要把码值转成电阻值再转成温度。ADS122U04是24位ADC满量程对应二进制补码范围是-8388608到8388607。假设PGA增益为1参考电压Vref 3.3V即Rref两端电压那么输入电压Vin和码值的关系是[ Vin \frac{raw}{8388607} \times Vref ]用比例测量的关系PT100的电阻值Rpt100就是[ Rpt100 \frac{Vin}{Vref} \times Rref \frac{raw}{8388607} \times Rref ]有意思的地方在于公式里Vref被消掉了实际起作用的只是Rref的阻值和raw码值。这就是比例测量的魔力所在就算3.3V电源电压有波动编码值也不受影响因为信号和参考是同一个源头。用这段代码可以完成转换float Rref 3300.0f; // 单位Ω float Rpt100 (float)raw / 8388607.0f * Rref;4.2 PT100线性化查表法与多项式拟合PT100的电阻-温度特性不是完全线性的0℃时是100Ω100℃时是138.51Ω200℃时是175.86Ω。在0到100℃范围内最大非线性误差约为0.4℃这对高精度应用来说不可接受。因此必须做线性化处理。处理方式有三种选择。第一种是查表法把PT100标准分度表按1℃间隔做成一个静态数组实测电阻值落在哪两个表项之间就用线性插值。这个方法简单可靠查询速度快缺点是占用Flash空间较大如果覆盖-50℃到300℃范围按1℃间隔需要351个点每个点4字节就是1.4KB完全可接受。第二种是多项式拟合法。IEC 60751标准给出了PT100的Callendar-Van Dusen方程用两个方程分别处理0℃以上和0℃以下的范围[ R(t) R0 \times [1 A \times t B \times t^2]t \ge 0℃ ] [ R(t) R0 \times [1 A \times t B \times t^2 C \times (t-100) \times t^3]t 0℃ ]其中R0100ΩA3.9083×10⁻³B-5.775×10⁻⁷C-4.183×10⁻¹²。这个方程的拟合精度在0到850℃范围内优于0.01%完全够用。但反推温度时需要解一元二次方程在MCU上要计算开方会多用一点时间。第三种是分段线性插值法工程上最常用。把测量范围分成几段每段用一次线性公式拟合误差控制在0.05℃以内。优点是查找速度快浮点运算量小适合在STM32L432KC这种不带硬件FPU的单片机上跑。我实际用的是分段线性插值因为代码量少调试直观。分段点我取了六个点-50℃、0℃、50℃、100℃、150℃、200℃每一段分别计算斜率k和截距b存放在表格里。实测下来在-20℃到120℃这个HVAC工作的主要区间内拟合误差不超过0.04℃。如果是新项目并且Flash空间充裕我会建议直接用IEC 60751的公式省去查表的繁琐代码也更规整。但要注意公式中用到的t是以℃为单位的不要当作绝对温度带入。4.3 一阶低通滤波与滑动平均的选择ADS122U04内部数字滤波器在20SPS时已经有了不错的噪声抑制能力但实测数据里仍然能看到约1到2个码的随机跳动这对应的温度波动大约0.1℃左右。在输出给PID控制器之前我习惯在外面再加一级软件滤波把短期抖动抹平。一阶低通滤波的表达式是[ y[n] \alpha \times x[n] (1-\alpha) \times y[n-1] ]其中α的取值由时间常数决定。在20SPS采样率下如果希望滤波时间常数约2秒那么α取值约为0.05。这个滤波对温度的急剧变化会引入滞后但温度系统本身就是一个大惯性环节所以这个范围内没有影响。滑动平均则是取最近N个采样点的平均值。它的好处是线性相位无滞后坏处是内存中要保存N个历史值。在STM32L432KC这种资源充足的芯片上用环形队列实现滑动平均很轻松N取16到32比较合适。我的经验是不要把两种滤波叠加使用。做一次滤波就好叠加只会增加相位延迟对最终控制效果没有收益。而且如果下游PID整定参数是按经验试凑的双重滤波会让响应变钝操作员会感觉温度“跟不上”实际是滤波滞后造成的假象。4.4 产线校准流程一点法与两点法的取舍每个ADC和每个传感器都有个体差异尤其是PT100传感器的互换性误差Class A为±0.15℃和ADC的失调电压最大可到几mV必须在产线校准中补齐。在校准策略上一点法适用于零点和增益都比较准的场景。做法是用精密电阻箱模拟PT100在0℃时的阻值100Ω把实测码值记录下来算出偏移量在算法里减去。这个方法只能校准零位对增益误差无能为力。如果ADC的增益误差已由电阻Rref的精度保证你希望PGA为1且TI芯片的增益误差非常小那么一点法在HVAC应用里是够用的。两点法可以同时校准零点和增益。做法是用两个精密电阻箱分别模拟0℃和100℃两个点记录码值后算出一个斜率系数和一个偏移量。这两个值存入EEPROM或Flash上电时读取。校准后的综合精度可以做到±0.1℃以内。实际操作中要注意在校准前必须等待系统稳定至少10分钟让电路板上的热梯度达到平衡否则校出来的“零点”其实是漂移途中的某个随机值。我踩过这个坑第一版校准程序没有预热延时产线上校出来的设备放一晚上后第二天开机显示温度比标准温度计低了0.15℃。4.5 内部温度传感器与冷端补偿的妙用ADS122U04内部集成了一个温度传感器可以用于测量芯片附近的温度。它的精度有限但是做冷端补偿时可以派上用场。如果你测量的是热电偶而不是PT100那么冷端温度必须知道内部传感器能省掉一个外部NTC。即便只用PT100内部传感器也可以用来做温度漂移补偿的辅助参考观测整机温升对测量结果的影响。在HVAC项目中我把它用作自诊断功能如果内部温度超过85℃说明电路板环境异常高温可能是风道堵了或者设备直晒立刻报警。这个功能在无人值守的控制柜里很有价值比靠ADC读数发现异常更早。5. 长期稳定性与抗干扰工程实践5.1 PCB布局与接地策略ADS122U04属于高精度混合信号器件PCB布局的合理性直接决定了最终实测的噪声水平。我在这块板上用的是四层板顶层走信号第二层是完整地平面第三层走电源底层走低速控制信号。关键的一条规则是模拟地和数字地必须在ADC下方单点连接最好在芯片正下方用一个过孔或短焊盘连接。千万不要把整个地平面割成模拟地和数字地两块再来回跨越。早期试用两层板时我把模拟地、数字地分开敷铜结果SPI数字信号带来的噪声渗入到模拟通道24位ADC最后只剩约18位有效精度。改成单点连接后有效位数直接升到了21位左右。ADC的AVDD引脚上我并联了10μF钽电容和0.1μF陶瓷电容。参考电阻Rref是影响测量精度的最重要器件它两端要各自打一个过孔到模拟地平面不要和数字地共享回流路径。PT100的引线在进入PCB区域后要尽量短走线时做差分对等长处理因为三线制测量导线电阻相等是靠PCB走线对称性来保证的。如果两根走线长度不一致抵消效果就打折扣。5.2 屏蔽与隔离的实战取舍在工业HVAC现场变频器、接触器、电磁阀这类设备工作时会把高次谐波和尖峰脉冲耦合到信号链路上。为此PT100的三根引线在机器内部要走屏蔽线屏蔽层单端接地在MCU板侧接地不要两端都接。两端接地会形成地环路反而引入更大的共模干扰。真正遇到强干扰的场合比如逆变器输出侧的温度采样光耦隔离是常规手段。但在ADS122U04和STM32之间用SPI直连其实风险并不大干扰源主要在传感器侧不在MCU侧。我在实际项目中一开始设计了SPI隔离后来测试发现不加隔离的SPI通信误码率极低去掉隔离后少一个BOM物料成本和失效率都下降了。真正需要加的还是AVDD电源入口处的EMI滤波器一个470Ω的磁珠加一个10μF电容实测下30MHz到100MHz的高频干扰衰减了约40dB。这套组合在通过工业级EFT电快速瞬变脉冲群测试时帮了大忙。5.3 看门狗与异常恢复策略工业设备不能死机这是基本要求。我在STM32L432KC上开了独立看门狗IWDG喂狗周期1秒。但ADS122U04本身的复位策略也要考虑。如果SPI通信突然异常导致ADC进入未知状态最粗暴的方法是硬件复位——把CS引脚拉低并保持几个毫秒ADC就会复位。但ADC没有专门的硬件复位引脚复位方式是通过SPI发送RESET命令0x06。代码层面我加了一个通信超时检测如果连续10次读数据时DRDY都不拉低就重写所有寄存器配置再做一次自校准。这个逻辑放在一个软件状态机里每100ms跑一次实测下来即使遇到极端干扰系统恢复时间不会超过2秒。5.4 长期漂移的实测追踪温度测量设备最怕的是用几个月后精度掉下来。为了确认这套方案的长期稳定性我做了个30天的连续运行测试每天记录一次零漂数据。结果显示在环境温度波动±5℃的情况下零点最大漂移约0.06℃增益漂移约0.03%。这个数据比PT100传感器本身的长期稳定性要好说明漂移主要来自传感器老化而不是ADC和MCU链路。如果要进一步降低长期漂移可以在算法层面对参考电阻Rref做温度补偿。方法是在参考电阻旁边贴一个NTC或者利用ADC内部温度传感器读出板温查Rref的温度系数表做软件修正。这个操作不复杂但前提是你对Rref的温度系数有准确的标定数据不然“补偿”反而引入更大的误差。6. 常见问题与排查技巧实录6.1 典型故障现象速查表故障现象可能原因排查步骤解决方案SPI读回数据恒定0xFFFFFFSPI模式配置错Mode 0/ACS时序不对用示波器抓SCLK、MOSI、CS波形确认CPOL0、CPHA1读数据期间CS不能拉高温度读数明显偏高或偏低PT100接线顺序接错IDAC1与IDAC2电流不相等万用表测AIN0与AIN1间电压是否在预期范围检查寄存器2配置重新核对三线制接法寄存器2中IDAC1/IDAC2电流值设为相同数据跳动超过±0.5℃电源去耦不良参考电阻位置靠近干扰源示波器测AVDD纹波正常应50mV加上10μF0.1μF去耦电容Rref远离电感类器件读数跟随环境温度变化校准后的系数没存入FlashEEPROM读取失败重启设备观察上电后组态值来源检查NVM读写逻辑和校验和偶尔读到错误温度、下一帧恢复正常接触不良或SPI误码CS被外部干扰误拉检查接插件压线质量示波器抓CS引脚干扰尖峰线缆固定CS下拉电阻增大抗干扰能力6.2 排查过程实录一次温度跳变的定位有一次客户反映设备运行几天后温度读数偶尔跳变约5℃。一开始怀疑传感器接线松动到现场拧了一遍接头问题依旧。后来用存储示波器长时间监听DRDY和CS引脚发现跳变发生时CS引脚上出现了一个宽度约2μs的毛刺。分析原因是设备内部有一路220V交流接触器动作时振动导致线缆轻微移动CS线和动力线并行走线寄生电容耦合出尖峰误触发片选。解决方法是把CS引线改为屏蔽线并单独走线远离动力线。同时把CS引脚的下拉电阻从100kΩ改为10kΩ增加抗干扰能力。改完后连续运行40个工作日没有再出现跳变。这个案例说明排查这类问题不能只盯着芯片本身布线、结构、振动、电磁耦合这些工程因素往往才是真正的元凶。仪器仪表开发有一半时间是和环境干扰做斗争这个结论放到今天依然成立。6.3 校准环节容易忽视的细节校准工作看起来简单实际操作中却有几个容易被忽视的细节。第一校准用的精密电阻箱要选四端开尔文结构如果只是两线制的电阻箱接触电阻几毫欧到几十毫欧的漂移换算成温度就是不可忽略的误差。第二校准时电路板要盖上外壳风道保持正常通风状态。如果裸板校准、装机后使用因为风道对电路板散热的影响板温和变换器内部的温度梯度会变化校准值就“错位”了。第三校准系数的存储必须有冗余校验。我通常用两个备份区每次写入交替更新读取时先验证CRC不一致就报错并让设备进入维护模式。这个功能在后期运维中省了很多事毕竟设备安装到现场后很难再安排人去拆壳校准。7. 从方案到产品的扩展思考这套方案目前是单板实现但实际产品化时还能扩展很多方向。比如多通道扩展ADS122U04本身只有4路差分输入如果需要测8路温度可以换用ADS122U08或者用两个ADS122U04并联共用SPI总线片选分开即可。这在硬件上改动很小主要的代价是MCU要多一个GPIO做片选。还有一个考虑是把MCU换成带CAN外设的型号。工业HVAC系统里多个温度采集节点通过CAN总线把数据汇总到控制器是常见架构。STM32L432KC没有CAN我在外扩CAN收发器MCP2515时占用了一个SPI接口导致ADC和CAN共用SPI总线仲裁逻辑复杂了不少。如果重新选型我会考虑STM32L4系列里带FDCAN的型号比如STM32L4A6省掉外扩CAN控制器的钱和代码量。从功耗角度看ADS122U04在低功耗模式下可以做到几十微安的电流消耗配合STM32L432KC的STOP模式整套系统完全可以用电池供电做现场巡检工具。温度巡检仪的电池续航能做到几个月甚至一年以上。这里的关键是测量时要等待ADC稳定后再读读完后立刻进入低功耗否则漏电电流会远远大于芯片自身的低功耗性能。我在开发时实测过如果SPI引脚没有全部下拉MCU睡眠时I/O漏电流可能达到几百微安比正常工作消耗还大。这个坑在低功耗设计中非常常见。我个人在实际操作中的体会是ADS122U04这颗ADC的潜力比它的名气大得多。刚开始用它时我也觉得TI的文档写得不是特别清晰寄存器配置要反复对照参考手册和勘误表但一旦把硬件和驱动跑顺了它的稳定性和精度在同价位产品里确实是第一梯队的。尤其是比例测量加上三线制PT100经过校准后做到±0.15℃的长期精度并不困难这已经超过了很多HVAC行业传感器的需求。最后再分享一个细节技巧在PCB上预留一个两针跳线盒把IDAC1输出到AIN0之间的走线断开跳线帽插上时正常工作拔掉后可以用来测试传感器断线检测功能。这个设计在产线和售后调试中都帮了大忙检查现场布线故障时可以迅速确认到底是传感器问题还是主机问题。小小的改动省下来的排查时间远超想象。