ADS122U04+PIC18F45K80通用温度采集方案设计 做工业温度采集或者暖通空调HVAC控制系统的时候大家基本都会碰到同一个麻烦现场传感器五花八门PT100铂电阻、K型热电偶、NTC热敏电阻都要支持信号从传感器拉到控制板动不动就十几米旁边还有变频器、压缩机这类强干扰源。我最近基于TI的ADS122U04IPWR搭配Microchip的PIC18F45K80做了一套通用温度采集方案一个前端基本覆盖了RTD、热电偶和NTC三种主流传感器。ADS122U04这颗24位高精度ADC比较特别的点是带UART接口直接和MCU的串口对接省掉了SPI片选和时钟线的麻烦PIC18F45K80则是带CAN控制器和增强型UART的8位工业级MCU组网能力强外设也够用。这篇文章把整套方案的选型逻辑、硬件电路、固件算法、标定流程和现场踩坑记录完整写一遍给准备做类似测温度量板的朋友一个可以直接参考的底稿。1. 整体设计与器件选型思路1.1 ADS122U04IPWR在这里扮演什么角色很多工程师对TI的ADS1220系列比较熟悉——一颗24位delta-sigma ADC带PGA、内部基准和可编程激励电流源专门为传感器小信号测量设计的。ADS122U04IPWR可以理解成把里面的SPI改成UART的版本这个改动在工业板卡上非常好用。传统SPI ADC接MCU至少占三根线SCLK、MOSI、MISO还得单独控制片选CS有些MCU的SPI外设已经挂了大容量Flash或者数码管驱动资源紧张得很。而ADS122U04只需要DIN和DOUT两条线直接接PIC18F45K80的TX和RX一片小封装芯片就把信号调理、24位转换、激励电流源、温度传感器全部打包了。ADC内部集成的PGA最高支持128倍增益意味着毫伏级别的热电偶信号可以直接进ADC不再需要额外搭仪表放大器。可编程IDAC电流源用来给RTD和NTC提供激励省了外部恒流源电路。再加上内部精密基准和温度传感器外围BOM数量比分立方案少了三分之一还多。这种高集成度对量产成本非常友好对可靠性也是加分项毕竟每一个焊点都是潜在的故障点。实际项目里我用它同时接了PT100和K型热电偶硬件上只在输入通道前端做了切换固件里改配置重新标定完全不用动电路板。1.2 为什么搭PIC18F45K80而不是随便用个STM32很多朋友看到这个项目会问怎么选了一颗8位MCU温度测量本身是一个慢变量采样速率20SPS到20kSPS就已经足够了数据量不算大PIC18F45K80的8位算力完全够用。真正让我选它的原因是三样CAN控制器、内置EEPROM和工作温度范围。K80系列是Microchip带ECAN模块的产品线64KB Flash、3.6KB RAM、1KB Data EEPROM属于8位机里外设比较齐全的型号。HVAC系统和楼宇自控设备很多走CAN总线温度采集板可以直接把温度数据打包成CAN报文发出去不用额外挂一颗CAN收发控制器。另一个实用点是PIC18F45K80内置EEPROM校准系数、器件序列号、冷端补偿参数都可以直接存进去掉电不丢量产的时候每块板子单独校准的数据能跟着板子走。这在工业设备里太重要了因为我装到现场之前校准好的增益和偏移值存在Flash里一旦重新标定或者更换传感器马上能更新。如果换成某些ARM芯片可能要外挂一颗EEPROM或者操作Flash模拟EEPROM麻烦不少。工作温度范围方面K80系列做到汽车级规格在环境恶劣的工业现场更让人放心。我在实际项目中有一块板子放在电控柜里靠近变频器安装柜内温度高的时候超过60摄氏度这颗MCU长时间运行没有出现过热死机的问题。1.3 传感器怎么定RTD、热电偶、NTC谁适用什么场景一套前端要覆盖三种传感器首先要明白各自的特点和适用场景选型才不会跑偏。PT100铂电阻是工业过程测量的首选温度范围一般在-200到650摄氏度线性度好、长期稳定性高但价格相对贵响应速度也慢一点。HVAC里冷冻水供水回水温度、风管送风温度工业上换热器进出口温度大多用PT100或者PT1000。PT1000的优势是阻值大、导线电阻影响小允许更长距离的信号传输缺点是比PT100贵一点。热电偶适合高温和快速变化的温度K型热电偶测到1000摄氏度以上很常见价格便宜、探头可以做得极小。但它的信号非常弱几十摄氏度温差对应的电压才几毫伏而且一定要做冷端补偿不然误差大得没法看。HVAC系统里压缩机排气温度、电机绕组温度这些应用我一般用K型热电偶。NTC热敏电阻就是空调、冰箱里最常见的温度传感器常温下阻值在1k到100k之间阻值随温度变化很快灵敏度高、价格成本可以压到非常低。缺点是线性度差、一致性不如铂电阻高温下阻值可能漂移。HVAC的室内温度传感器、回风温度传感器大量使用NTC精度要求通常在正负0.5摄氏度左右便宜的方案完全够用。ADS122U04的输入通道可以配置成差分输入或者单端输入PGA增益、IDAC电流、参考源都能软件配置改成不同类型传感器主要就是重新配寄存器再换标定表。这就是高集成度ADC带来的便利不需要为每种传感器单独做一套硬件。2. 硬件电路设计信号链和关键参数2.1 RTD比例式测量接法与参数计算RTD测量最容易踩的坑是激励电流漂移。很多入门设计用恒流源给PT100供电然后用ADC去测PT100两端的电压表面看起来没问题实际上恒流源本身受温度影响有漂移根本没法保证高精度。正确做法是用比例式测量让ADC的参考电压和输入信号来自同一个电流环路。我的接法是这样的IDAC1引脚输出可编程恒流源先流过一颗精密参考电阻R_REF再流过PT100最后回到模拟地。R_REF两端电压接到ADC的REFP和REFN作为参考电压VREFPT100两端电压接到AIN0和AIN1作为输入信号VIN。因为两个电压的电流是同一个IDAC给出来的转换结果就是R_PT100 R_REF × (VIN / VREF)电流I在分子分母里完全抵消了激励电流再怎么漂移都不影响最终结果。参考电阻R_REF是关键中的关键必须选低温漂、高精度的精密电阻实际项目中我用的是0.05%精度、5ppm温度系数的电阻单颗成本高一点但完全值得。参数计算我用一组调试过的数值IDAC电流设成250μAR_REF选3.3kΩVREF就是0.825V。PT100在0摄氏度时是100Ω压降只有25mV这时候PGA设成16倍进入ADC的信号是0.4V。在100摄氏度时PT100阻值约为138.5Ω压降34.6mV经过PGA放大后是0.554V大约是VREF的67%动态范围利用得很合理。自热效应方面250μA流过100Ω电阻功耗只有6.25μW对PT100探测头的自热影响几乎可以忽略。需要提醒的是三个细节。第一PGA增益不是越大越好增益越高噪声会被放大得越明显信号接近满量程的同时噪声也爬上来反而得不偿失。第二R_REF两端的走线一定要靠近ADC的REFP和REFN引脚走线越长拾取的干扰越多参考电压越不稳。第三PT100的探头如果是两线制导线电阻会直接串进测量回路每米几十毫欧长线下来误差不小。条件允许的话用三线制或者四线制接法把电压采样回路和高阻抗输入分开导线电阻的影响就基本消除了。2.2 热电偶输入、冷端补偿与保护热电偶的电压信号有多弱K型热电偶在常温附近温度每变化1摄氏度只产生大约41μV的变化在全量程范围内也只有几十毫伏所以PGA我直接设成64倍信号才能被ADS122U04充分利用。和RTD不同热电偶不需要IDAC激励只要把热电偶的正负端接到AIN0和AIN1软件里把测量模式配置成差分输入把PGA增益调到64或者128事情就完成了一半。另一半是冷端补偿这也是热电偶测量最容易出错的地方。热电偶测出来的是热端和冷端的温差而不是绝对温度。想要得到热端温度必须知道冷端温度再把冷端温差换算成热端温度。我用的方案是ADS122U04内部自带的温度传感器它可以直接读出芯片附近的环境温度作为冷端参考。这个方法简单、省钱但内部温度传感器的精度大约在正负1到2摄氏度直接用它做补偿显然不够。实际项目里我外接了一颗高精度NTC贴在接线端子附近用NTC作为冷端温度参考精度能做到正负0.3摄氏度以内。信号保护这一块在工业现场省不了。热电偶暴露在设备上探头金属部分直接接触被测对象和强电部件之间有可能存在感应电压设备短路故障时还可能窜入危险电压。我的输入端串联了100Ω限流电阻同时在AIN引脚对地并了肖特基二极管和TVS管把输入电压限制在安全范围内。另外ADS122U04内部有一个烧断检测功能可以向热电偶输入引脚注入微小电流如果传感器断线ADC就能检测到异常码上位机就可以提示“探头故障”而不是显示一个离谱的温度值。这个功能在HVAC系统里用来判断传感器开路非常实用。2.3 NTC分压方案和参数估计NTC的测量方法我偏用分压法结构最简单。NTC一端接激励电压另一端和固定电阻串联到地ADC检测它们连接点的电压。选分压电阻的时候要保证目标温度范围内电压落在ADC参考电压的合理区间常用的做法是把NTC放在高端、分压电阻放低端这样温度升高时NTC阻值下降检测点电压反而上升。我的HVAC室温传感器用的是10kΩ NTCB值3435。分压电阻选10kΩ激励电压用3.3V。0摄氏度时NTC阻值大约32.6kΩ检测点电压是3.3×10/(1032.6)大约0.77V25摄氏度时NTC阻值等于10kΩ检测点电压1.65V50摄氏度时阻值约3.6kΩ电压2.42V。这个电压范围对ADS122U04的内部参考2.048V来说就超了所以我把ADC的参考电压配置成了外部参考或者把分压电阻改小。实际板子上我加了参考电压切换电路在NTC模式下用AIN外部参考给满量程留够余量。这样做的目的是让0到100摄氏度的整个范围都能覆盖避免在高温端过早进入饱和区。NTC的非线性是另一个麻烦。虽然可以查到温度对应的标准阻值表但HVAC系统里我直接用B值方程算1/T 1/T25 (1/B) × ln(R/R25)T25取298.15KR25是25摄氏度时的标称阻值10kΩ。这个公式在0到100摄氏度的范围内误差大概在正负0.5摄氏度左右对暖通空调的应用来说已经可以接受。如果对精度要求更高就得用Steinhart-Hart方程3个系数拟合出来计算量稍大一点但精度能到0.05摄氏度通常用在工业仪表上。2.4 电源、基准和PCB布局的经验ADS122U04的模拟电源和数字电源我一开始没分开处理结果数据跳动非常明显。后来改成模拟供电AVDD单独接一个低噪声LDO数字供电DVDD再单独接一颗LDO中间用磁珠隔离问题立刻缓解。温度测量系统的信噪比瓶颈往往不在ADC本身而在电源和参考电压的噪声这组电源隔离电路算是性价比最高的改善手段。AD引脚的输入滤波要用RC低通一般取10Ω电阻加100nF电容截止频率大约160kHz滤掉板上的高频干扰。有一个细节是热电偶输入这种高阻抗源的滤波电容不宜选太大太大影响delta-sigma ADC内部开关电容的建立时间反而会让ADC读数变差。这一点很多人不知道见到ADC读数不稳就往输入滤波电容上加容值加到微法级别结果稳定度更差原理就在于信号源驱动能力和ADC采样电容的电荷注入平衡被破坏了。PCB布局上我的原则是R_REF和去耦电容必须紧贴ADS122U04模拟输入走线尽量短不同的模拟通道中间用接地过孔隔离。AGND和DGND在ADC底下用0Ω电阻单点连接避免数字信号回流跑到模拟区域里去。参考电阻的地线也单独走一条线回到ADC的地引脚不让它在主电源的大电流通路上产生微小压降。这些小细节平时看不见真到了批量测试的时候板子之间的读数一致性全靠它们保证。2.5 PIC18F45K80与ADS122U04的连接PIC18F45K80和ADS122U04的连接非常简单一共三根线PIC的TX脚接ADS122U04的DINPIC的RX脚接ADS122U04的DOUT/DRDY再加上一根共同地线。DRDY引脚实际是数据就绪通知和数据输出复用MCU可以通过它判断ADC有没有新的转换结果。因为ADS122U04是UART接口不需要片选信号不用时钟线这对于8位MCU来说非常省资源EUSART模块直接搞定通信。电平匹配也要注意。PIC18F45K80工作电压我给的是3.3VADS122U04同样3.3V供电逻辑电平一致不需要电平转换。如果板子上MCU用5V供电那RX/TX线上串电阻限流或者加一颗电平转换芯片都可以。调试的时候我给UART的TX、RX引脚预留了串电阻焊盘方便调整信号质量。波特率我通常设成19200bps。ADS122U04支持从低速到高速多档波特率对于5到20SPS的采样速率19200bps完全足够留出比较大的余量。高速波特率对线缆长度和抗干扰要求更高工业现场没必要冒这个风险。我实际调试中发现9600bps和19200bps下的通信误码率差别不大但在一个距离很长的HVAC系统测试中19200bps更没有出现超时。3. 固件开发从寄存器配置到温度算法3.1 MCU的UART初始化和ADS122U04控制流程PIC18F45K80这边的初始化主要是配置系统时钟和EUSART模块。我把内部振荡器配置在16MHz外部接一颗16MHz晶振用于更高精度UART波特率误差控制在0.1%以内。温度采集系统对时间精度不是特别敏感但对UART通信的波特率误差有要求误差超过2%就可能出现乱码。下面这段代码是EUSART初始化的一部分只用来示意配置思路具体寄存器命名以Microchip数据手册为准。void UART1_Init(uint32_t baudrate) { // 关闭外设先配置寄存器 TXSTA1 0; RCSTA1 0; // 8位数据、使能发送和接收 TXSTA1bits.TXEN 1; TXSTA1bits.BRGH 1; RCSTA1bits.SPEN 1; RCSTA1bits.CREN 1; // 计算SPBRG16MHz时钟下19200bps // 高速模式 SPBRGH:SPBRG Fosc / (4 * (SPBRG1)) SPBRGH 0; SPBRG1 (uint8_t)((__XTAL_FREQ / (4 * baudrate)) - 1); // 中断接收使能发送用轮询 PIE1bits.RC1IE 1; INTCONbits.PEIE 1; INTCONbits.GIE 1; }ADS122U04的使用流程按“复位-配置-读取”这套走。芯片上电后先发送RESET命令让寄存器回到默认值然后按需求写配置寄存器设置输入通道、PGA增益、数据速率、参考电压、IDAC电流这些参数。温度应用我不追求高采样率5SPS到20SPS足够使用噪声水平也更低。配置写完后等一段时间让ADC完成第一次转换再从DRDY引脚判断数据是否就绪。void ADS122U04_Init(void) { uint8_t buf[2]; ADS_UART_SendByte(CMD_RESET); __delay_ms(10); // 寄存器0AIN0-AIN1差分输入PGA16 buf[0] 0x00; buf[1] 0x40; // 具体位定义参考数据手册 ADS_WriteRegister(0, buf, 2); // 寄存器2IDAC1 250uA参考电压外部或内部 buf[0] 0x02; buf[1] 0x10; ADS_WriteRegister(0, buf, 2); // 开启连续转换 ADS_UART_SendByte(CMD_START); }寄存器里的具体位定义我不在这里逐一展开不同版本芯片可能会有差异核对数据手册是必须的。重点在于理解这套命令链先复位回到已知状态再配置每一个功能模块启动转换以后不断查询数据就绪。把这条流程固化成函数以后切换传感器类型只需要改配置参数主程序不用大改。3.2 读取ADC数据并换算成电压或电阻ADS122U04转换结果是24位数据保存为三字节有符号数。由于PGA增益、参考电压和输入量程都是已知的电压换算公式是V_IN code × VREF / (2^23 - 1) / PGA这里code是读到的原始数VREF是ADC参考电压PGA是当前增益。我做了一个通用函数来读取转换结果并且在数据就绪后才读取避免拿到不完整的帧。实际固件里我用的是查询加超时保护如果MCU在50ms内没有收到有效数据就报通信错误重新初始化ADC。int32_t ADS122U04_ReadData(void) { uint8_t raw[3]; uint8_t cmd CMD_READ_DATA; int32_t code; ADS_UART_SendByte(cmd); for (uint8_t i 0; i 3; i) { raw[i] ADS_UART_ReceiveByte(); } code ((int32_t)raw[0] 16) | ((int32_t)raw[1] 8) | raw[2]; // 24位有符号扩展 if (code 0x800000) { code | ~0xFFFFFF; } return code; }RTD模式下拿到电压以后还要转电阻。由于采用比例式参考直接按这一行计算R_RTD R_REF × code / (2^23 - 1)参考电阻R_REF的值在编译的时候用宏定义换一块板子标定不换电阻时改掉宏重新编译就行。3.3 温度算法PT100线性化、热电偶冷端补偿、NTC查表PT100的电阻值和温度并不是严格线性工业上最常用的计算方法是Callendar-Van Dusen方程0到850摄氏度范围内简化为 R R0 × (1 A×T B×T^2)系数A取3.9083e-3B取-5.775e-7。反过来根据电阻求温度可以用迭代法解这个方程或者做分段线性插值表。在PIC18F45K80这种8位机上跑浮点是可以的但速度偏慢。我建议存一个0到400摄氏度每10摄氏度间隔的R-T表RAM紧张时甚至可以只存电阻表温度用二分查找后线性插值误差控制在0.1摄氏度以内执行速度还非常快。热电偶算法则要分成三步。第一步从外部NTC读出冷端温度第二步用K型热电偶分度表把冷端温度换算成对应的热电势第三步把ADC读到的热电势加上冷端热电势得到总热电势再反查分度表得到热端温度。这个流程看起来简单但查表公式一定要用对K型热电偶在0到50摄氏度的冷端范围内每摄氏度对应的热电势在39μV到42μV之间不能用一个固定塞贝克系数直接算否则温度一高偏差就出来了。float Thermocouple_Convert(float v_total_uv, float T_cold) { // 1. 根据冷端温度查表得到冷端热电势 float v_cold Ktype_TempToUV(T_cold); // 2. 总热电势 测量热电势 冷端热电势 float v_total v_total_uv v_cold; // 3. 反查K型分度表得到被测温度 float T_hot Ktype_UVToTemp(v_total); return T_hot; }NTC的计算我用B值方程前面已经提过。在HVAC项目里我一般把0到50摄氏度对应的NTC阻值和温度做成一张表存在MCU Flash里查表加线性插值算下来速度比直接算对数快很多。实测下来查表法和B值方程法的差异在正负0.2摄氏度以内对于室温控制完全够用。3.4 软件滤波和参数掉电保存原始ADC数据直接拿去用一定是不稳的。工业现场干扰随时都有传感器自身也有噪声。我自己用一级滑动平均加一级中值滤波滑动窗口长度取8中值窗口取3次。这种组合的好处是中值滤波先把粗大脉冲干扰剔除掉滑动平均再把随机噪声压低温度本身的真实变化速率很慢不会因为滤波丢掉有效信息。实测数据在20SPS采样、20次平均后读数峰峰抖动可以控制在0.02摄氏度以内。滤波参数是对PIC18F45K80的3.6KB RAM精打细算的。如果每个通道都开20个点的滑动平均窗口8个通道加起来就要几百字节RAM反而影响其他功能。所以现场调试时先看看噪声水平够用就行别一味堆滤波深度。校准系数和冷端补偿系数放在哪答案是PIC18F45K80的数据EEPROM。每块板子在出厂前做两点标定零点偏移和增益误差存进EEPROM上位机可以通过串口命令重新触发标定并更新存储数据。这样做的好处是批量生产时每块板子的原件差异被校准掉了到现场更换探头以后还能通过RS485或CAN接口下发命令重新标定不需要拆板子回厂。4. 装调与标定过程实录4.1 上电先后顺序和基本自检流程焊完板子第一次上电千万不要急着接传感器。我的调板顺序是先裸板上电用万用表测AVDD、DVDD电压确认没有短路和异常发热再用示波器看电源纹波纹波大于50mV就要排查LDO和电容然后短接ADC输入通道看读出来的码是否接近零点最后才接传感器否则一旦通信或者配置有问题很容易误判是传感器的问题。通信自检这一步也很关键。MCU程序烧进去以后先发一个读取ADC寄存器值的命令如果收到的寄存器内容和默认值一致说明UART通信通了波特率设置也没问题。再往后才是配置PGA和IDAC。我调试时遇到过一个问题ADC配置后一直读不到数据后来用示波器抓DIN和DOUT波形发现发送命令时序不对芯片收到了乱码命令卡在某个状态。解决办法是发送任何命令之前先发RESET把状态机拉回已知状态再重新配置。这条经验后来写进了固件每次上电后初始化都自动复位ADC。4.2 零点和跨度标定的具体操作温度标定有两个层次。第一个层次是ADC零点和增益校准第二个层次是传感器探头本身的标度偏差。ADC零点是芯片本身的问题比如输入失调可以通过寄存器自校准命令做掉但工程上最简单的还是零点补偿。我会把ADC输入短接读出码值作为零点偏移后面所有读数减掉这个值。探头标定要用已知温度源。实验室有条件就用干井炉和标准铂电阻温度计没有条件就用冰水混合物做0摄氏度参考点沸水温度参考当地大气压下的沸点但误差比较大不推荐做高精度标定。我的做法是把PT100探头连同标准温度计一起放进干井炉设到0摄氏度稳定10分钟以后记录ADC原始码和标准温度然后再设到100摄氏度同样记录一组数据。根据这两点算出增益修正系数和偏移量写进EEPROM。不同温度范围最好再加一个中间点比如50摄氏度做二次修正温度响应曲线会更准。HVAC系统如果只测室温标定点选0摄氏度和50摄氏度就够了如果探头要测冷冻水供水温度可能还会用到10摄氏度和40摄氏度两组数据。关键是标定时探头要和标准温度计处于同一热环境中稳定时间足够长不要看到温度不变就急着记录探头内部热传导要时间。4.3 一组实测数据与误差分析我用这套系统在实验室做了一组PT100测量数据参考温度计用的是经过计量校准的干井炉精度等级比较高。记录了一组实测结果截取其中几个点设定温度摄氏度标准读数摄氏度本板读数摄氏度误差摄氏度00.020.120.102525.0125.140.135050.0049.87-0.137575.0275.180.1610099.98100.210.23从数据来看全量程误差在正负0.25摄氏度以内对于HVAC应用已经超过需求。误差来源主要有三块R_REF电阻本身的标称误差、ADC积分非线性、探头自身的标称误差。如果还想继续压精度一是换成精度更高、温漂更小的参考电阻二是做多点标定修正非线性三是选用更高精度的A级PT100探头。工业仪表级方案想做到正负0.1摄氏度这三件事都得做成本也会明显上去。热电偶的实测误差会大一些K型热电偶本身的分度误差、冷端NTC测量的误差、ADC PGA漂移都会累加。我在同样的设备上测试0到200摄氏度范围内冷端补偿标定以后误差基本控制在正负1摄氏度以内作为设备排气温度监测是足够用的。5. 现场问题排查与经验汇总5.1 温度读数乱跳排查思路现场极典型的故障是温度读数上下乱跳幅度好几度肉眼都能看到数字跳变。遇到这类问题我习惯按“电源→输入→软件”三个层面排查。先看电源纹波开关电源在满载时纹波会明显变大如果ADC供电和继电器驱动供电共用一路电源继电器动作的瞬间温度读数就跳一下这就是典型的地线回流干扰必须做电源隔离或者分开供电。电源没有问题再看输入前端。PT100长线在变频器或者压缩机启动的瞬间会感应出很大的共模电压虽然ADS122U04差分输入能抑制一部分共模但超范围时也会饱和。解决办法是输入并一个10nF到100nF的差模电容把高频共模干扰拉低。PGA增益太高也会让噪声显得很大尤其是热电偶64倍增益下输入轻微抖动被放大得很夸张这时候适当降低增益、提高数据速率再用软件滤波读数稳定性立刻改善。5.2 UART通信不稳定的处理ADS122U04在UART模式下偶尔出现通信超时或者乱码这个现象通常和波特率误差、干扰、状态机跑飞有关。我在调试中遇到过最隐蔽的问题是PIC18F45K80用内部振荡器做UART时钟内部振荡器在温度变化时频率会漂移冷态和热态的波特率差好几个百分点长时间运行后偶尔乱码。换用外部晶振后问题消失。所以工业板卡如果要跑UART时间比较长不要省那颗外部晶振。状态机跑飞是另一个常见问题。可能在发送命令的瞬间UART接收中断被打断ADC输出的数据没读完芯片内部就进入了一个不对的状态然后后续所有命令都得不到响应。我这里采用的防护是固定命令间延时、每次读取前检查DRDY、超时自动复位ADC。复位虽然会丢掉配置但重配一遍就行换来的是长时间运行的可靠通信。5.3 热电偶测量不准的翻车案例有一次项目反馈K型热电偶测出来温度偏差特别大现象是低温偏差小、高温偏差越来越大。第一反应怀疑热电偶分度表查错了后来发现不是。把接线端子打开一量发现热电偶正负极接反了虽然数字还在变化但热电势的符号不对高温端偏差自然特别夸张。这还是小事更多时候问题是冷端补偿。探头装在室外30摄氏度的环境控制板在室内恒温25摄氏度如果冷端温度用控制板温度代替那一上来就是5摄氏度误差。所以冷端温度传感器必须贴在热电偶接线端子上而不是放在PCB远离端子的地方。还有一次是热电偶屏蔽层两端都接了设备地结果现场地电位差导致回路电流流进屏蔽层和信号线之间读数出现了0.5℃以上的波动。把屏蔽层改成传感器端单点接地后干扰立刻消失。5.4 HVAC现场常见的干扰场景处理HVAC现场和纯工业过程控制还不太一样干扰集中在几个场景变频器启动、电机会产生大电流谐波压缩机启动和停机瞬间母线电压掉得厉害还有电磁阀的动作会产生脉冲干扰。这些干扰通过电源线和空间辐射都可能进入温度采集板。我在这套系统上做了四层防护电源入口处用EMI滤波器加TVS管ADC模拟电源和数字电源分开用LDO模拟输入口加RC低通滤波加钳位二极管机壳接地点做单点基础设施。实测下来在最靠近变频器出线端的位置干扰依然能压住温度读数没有明显毛刺。软件层面的防护也不能省。在HVAC控制系统中传感器断线会直接导致控制逻辑走错方向。我固件里对每种传感器都做了合理范围判断PT100不在-100到300摄氏度范围就报故障K型热电偶不在-50到800摄氏度就报故障NTC不在-40到150摄氏度就报故障。故障状态下输出给控制器的不是突变数据而是保留上一有效值并置标志位。这套机制帮我处理了好几起探头端子松动的现场事故。5.5 问题速查表整理一张常见问题速查表方便大家现场对照排查。现象可能原因处理建议读数乱跳幅度大电源纹波大、输入共模干扰、PGA过高检查LDO输入输出电容加输入RC滤波适当降低PGA并增加软件滤波读数缓慢漂移参考电阻温漂大、探头自热、基准不稳定换低温漂R_REF降低IDAC电流确认参考电阻紧贴ADC引脚通信超时乱码波特率误差内部振荡器、地电位差、命令时序错换外部晶振检查双方共地加超时复位逻辑热电偶偏差随温度增大冷端补偿不准、热电偶接反、分度表查错冷端温度计靠近接线端子检查极性用已知温度点复核传感器断线无提示未使能烧断检测开启ADC内部烧断检测固件判断超范围后上报故障批量板卡读数不一致R_REF精度差异、PCB布局不一致统一用高精度R_REF每块板出厂单独标定摆弄这套方案几个月下来我最深的体会是测量精度不是单靠ADC的位数堆出来的参考电阻的温漂、冷端补偿的位置、PCB布局的细节、固件的滤波策略哪一个环节放松了24位也救不回来。而ADS122U04和PIC18F45K80这套组合恰好把信号采集、转换、处理和输出这几个环节都照顾得比较省心。最后再分享一个小技巧如果你也要做多传感器混测的板子建议把每种传感器的配置参数和标定表都固化成独立的数据结构切换传感器时只要改一个索引号这样调试、量产、现场维护都能少掉很多麻烦。