ADS122U04+STM32L162:工业温度采集与UART通信实战指南

发布时间:2026/11/5 5:04:46
ADS122U04+STM32L162:工业温度采集与UART通信实战指南

做工业测温和HVAC系统的人,大概都绕不过这样一个场景:传感器线拉出去十几米甚至几十米,沿途经过变频器、电磁阀、继电器这些大功率干扰源,回来还得把微伏级别的信号变成稳定、可用的温度数字。ADS122U04IPWR配合STM32L162ZE这套组合,是我这两年反复在用的解法之一。ADS122U04IPWR是TI那颗24位Δ-Σ ADC的UART版本,自带可编程增益放大器、激励电流源和内部温度传感器;STM32L162ZE则是意法半导体的超低功耗Cortex-M3,串口资源充足、休眠功耗低。两颗芯片凑在一起,能解决工业温度采集里“高分辨率采样+长距离稳定通信+低功耗运行”这三个最关键的问题。

这篇文章打算把整套方案摊开了讲,从系统架构、传感器选型、硬件电路参数计算,到固件寄存器配置和现场抗干扰调试,全部按实战来写。适合正在做工业变送器、HVAC控制器、设备状态监测,或者想用UART接口ADC构建低成本高精度采集链路的人参考。已经做过温度采集但被现场噪声、通信乱码折磨过的朋友,看完也能少走不少弯路。

1. 项目整体设计思路:为什么是这两颗芯片

1.1 ADS122U04IPWR 到底解决了什么痛点

很多人做温度采集喜欢直接上MCU自带的ADC,或者选一颗带SPI接口的ADC芯片。但真正到了工业现场,你会发现问题不止“采到电压”那么简单。热电偶输出的是几十微伏级别的直流信号,PT100在零度附近一个摄氏度的变化也只有零点几欧姆,普通MCU的12位ADC配合外部仪表放大器,想把精度做进0.1℃基本是奢望。另外,SPI接口在长距离和强干扰环境下并不好用,通信时钟容易受串扰,线缆稍微长一点就要降速率、加驱动。

ADS122U04IPWR就是冲着这些痛点来的。一个是分辨率高,24位Δ-Σ架构,满量程输入配合内部PGA,可以把热电偶、RTD这些微弱信号直接放大到ADC可分辨的范围。另一个是它内置了两个可编程激励电流源,做电阻型传感器时可以走比例测量,电流源本身的温漂和绝对精度影响被抵消掉,这一招比用外部恒流源省事得多。再有一个是接口,它走UART而不是SPI,UART在工业现场用两根线就能可靠传输,硬件上做隔离也方便,这对HVAC这种控制器分散安装、通信距离较远的场景特别友好。

1.2 STM32L162ZE 在这里扮演的角色

有了ADC做模拟前端,MCU这边的任务其实是三个:配置ADC寄存器、接收转换结果、把原始码值换算成温度并跑应用逻辑。STM32L162ZE在这三个任务上都有它的优势。这颗MCU基于Cortex-M3内核,市面上的资料和库函数积累非常多,上手快;它属于STM32L1系列,超低功耗特性做得很突出,HVAC设备常年通电,控制板待机电流和运行电流都是硬指标,低功耗MCU能省下不少散热和功耗预算。

更重要的是STM32L162ZE的USART外设足够用。与ADS122U04IPWR通信占掉一个USART,还能剩好几个串口给触摸屏、上位机、协议转换模块使用。加上DMA支持,UART接收数据不需要CPU一个一个字节去处理,可以等整帧转换结果到了再统一处理,这套机制在实时性要求不高的温度采集场合非常省心。

1.3 系统架构预览

整个系统的信号流是这样走的:温度传感器接入ADS122U04IPWR的模拟输入通道,ADC内部PGA将信号放大,经过Δ-Σ调制器和数字滤波器,得到24位转换结果;UART把结果送到STM32L162ZE,MCU基于内部寄存器配置和校准数据,把原始码值换算成摄氏温度;最终温度值通过现场总线、RS-485或者本地显示输出。电源部分如果做隔离,ADC和传感器在隔离侧,MCU在系统侧,中间的UART用数字隔离器跨过隔离带,这是工业变送器非常经典的结构。

2. 传感器选型解析:热电偶、RTD 还是 NTC

2.1 三类温度传感器的应用边界

温度传感器选型决定了整个ADC配置方向。工业现场最常见的是热电偶和RTD,HVAC系统里NTC热敏电阻也用得不少。热电偶测量范围宽,能到上千摄氏度,但输出信号小且需要冷端补偿;RTD线性度好、重复性好,适合-200℃到850℃的中低温测量,但需要激励电流源;NTC便宜、响应快,但非线性严重,只适合窄范围测量。

我做项目时会先问三个问题:测量范围是多少、现场有没有剧烈振动、系统需不需要长期标定。以前做过一个锅炉排烟温度监测,温度范围从常温到600℃,这时就只能用K型热电偶,因为PT100到不了这么高,NTC更不用想。另一个HVAC冷冻水管温度测量,范围只有5℃到35℃,首要要求是稳定和精度,这种就老老实实用PT1000,选它是因为信号比PT100更强,在长线上抗干扰更好,而且HVAC系统里水流振动不会对铂电阻造成什么问题。

2.2 热电偶通道的冷端补偿设计

热电偶的痛点在于只能测温差,热端和冷端的温度差对应电动势,如果冷端温度飘了,读数就跟着飘。常见做法是在冷端位置放一个温度传感器,测到冷端温度后,在软件里查表修正。ADS122U04IPWR内部集成了一颗温度传感器,把内部温度读出来就能当冷端补偿用。

实际操作时要注意一点:ADC内部温度传感器测的是芯片结温,不是PCB上冷端那根铜线的温度。如果芯片和热电偶冷端之间隔得太远,或者芯片附近有发热元件,直接用内部温度做CJC会产生几摄氏度的误差。我做产品时倾向于在外接冷端位置放一颗高精度热敏电阻,接到ADC的另一个输入通道,软件里把冷端电压换算成温度。对于精度要求没那么高的HVAC项目,直接读ADC内部温度传感器、做好热设计也够用,关键是让ADC芯片和冷端接线端子待在同一个等温区域里。

2.3 RTD 比例测量原理与激励电流

RTD测量的核心是比例测量。激励电流从IDAC流出,一路流过RTD产生电压信号,另一路流过外部精密参考电阻产生参考电压。ADC最后的转换结果不是绝对电压,而是RTD电压与参考电压的比值。由于两路使用同一个激励电流源,电流的波动和温度漂移在比值里互相抵消了。这样一来,即使IDAC电流随温度变化了百分之二,对最终温度读数几乎没有影响。这一点非常关键,因为恒流源的长期稳定性想要做到很高,成本是很贵的,而比例测量用普通精度就能达到很好的效果。

ADS122U04IPWR有两个IDAC输出,可以把一个接到AIN0、另一个接到AIN3,也可以两个并联。我一般推荐把IDAC电流设到0.5mA到1mA之间。电流太小,RTD上的信号幅度不够,容易被噪声淹没;电流太大,RTD自身发热会造成额外的测量误差,铂电阻的I²T发热效应会直接反映到温度值上。0.5mA对PT100来说,0℃时信号只有50mV,再乘以PGA增益后被ADC采样,性能表现很理想。

3. 硬件电路设计与关键参数计算

3.1 电源、参考电压与滤波电容的布置

ADS122U04IPWR的数字电源AVDD和DVDD建议分开处理,模拟电源用低噪声LDO供电,数字电源可以共用系统的3.3V,但中间用磁珠串一下。参考电压引脚附近是模拟性能的生命线。使用比例测量时,外部参考电阻Rref两端电压直接作为ADC的参考源,这个参考电阻的温漂系数必须选好的,25ppm/℃以下的金属箔电阻或者精密薄膜电阻比较稳妥,阻值精度不影响最终精度,只是影响满量程范围,但温漂一定要低。

每个电源引脚附近都放一个0.1μF陶瓷电容加一个10μF钽电容这样的组合,数字隔离器两侧的电源也要单独退耦,UART跨隔离屏障时,隔离器前后的地和电源必须严格分开,不能图省事连在一起。以前我在一个HVAC控制器上把隔离后的地和MCU数字地共了,结果串口数据每一帧都有错位,后来把两地彻底分开才恢复正常。

3.2 模拟前端滤波与输入保护

ADC虽然是24位Δ-Σ架构,但模拟输入前端的处理仍然不能马虎。差分输入引脚之间并联一个100nF到1μF的电容,能显著抑制射频干扰和共模噪声。对于热电偶这种高源阻抗的信号,还要在输入端串接RC低通滤波,截至频率设在几百赫兹到几千赫兹之间,滤掉高频干扰的同时不影响直流测量。

输入保护同样重要。工业现场的传感器线可能接错线、可能被雷击浪涌打一下,ADC输入引脚耐压有限,必须要做保护。常见做法是在输入端串接限流电阻,再在对地和对电源之间接TVS管,或者用低漏电的钳位二极管把输入电压限制在电源轨附近。以前在风机盘管控制器上,没有加TVS管的结果是,一台现场设备因为附近电焊操作烧掉了ADC输入通道,焊机的感应电压看似不大,但尖峰能量足够打穿CMOS输入结构。

3.3 典型PT100测温通道的参数计算

以一个PT100的四线制比例测量方案为例,完整走一遍参数计算。假设IDAC电流I=0.5mA,参考电阻Rref=1620Ω,参考电压Vref=I×Rref=810mV。这个参考电压不高,所以需要PGA把小信号放大。PT100在0℃时阻值100Ω,信号电压Vs=I×100Ω=50mV,选择PGA增益GAIN=16,则ADC输入端的差分电压为50mV×16=800mV,仍然小于810mV满量程,不会过载。

当RTD阻值变化ΔR时,ADC的数字输出码D满足下面这个关系:

D = (I × Rrtd × GAIN) / (I × Rref) × 2^23 = (Rrtd × GAIN / Rref) × 2^23

可以看到I被约掉了,这就是比例测量。把GAIN=16、Rref=1620代入,Rrtd=120Ω时,D=120×16/1620×8388607≈9944320,对应温度约51.6℃。实际项目中我在固件里直接建立一张RTD阻值-温度的分度表,线性插值求温度,比用复杂公式省时间且不易出错。需要说明的是,这套参数是从工程实践中验证过的典型组合,具体增益和参考电阻值请以传感器量程和ADC参考电压范围为基准做最终确认。

4. 固件实现:UART通信与寄存器配置实战

4.1 ADS122U04IPWR 的寄存器配置框架

ADS122U04IPWR有四个配置寄存器,从Config0到Config3,分别管输入多路选择、PGA增益、数据速率、转换模式、参考电压来源、IDAC电流和传感器检测。基于ADS1220系列寄存器位域一致的设计基础,项目里我通常先把转换速率设为20SPS,这个速率下内置的50Hz/60Hz工频抑制效果最好;转换模式按现场需要选择连续转换或单次转换,跑电池供电时用单次转换更省电。

配置时最需要想清楚的是参考电压设置。如果做RTD比例测量,参考源要选“外部参考”,也就是用Rref两端的电压做参考;如果做热电偶测量,可以直接选内部2.048V参考。下表是我常用的配置参考组合,实际使用时需要逐项对照数据手册确认。

工作模式MUX输入PGA增益IDAC电流参考源典型用途
PT100四线制差分AIN0-AIN1160.5mA外部Rref工业冷热水温度
PT1000三线制差分AIN0-AIN180.25mA外部RrefHVAC回风温度
K型热电偶差分AIN0-AIN132无内部2.048V锅炉排烟温度
NTC直接测电压单端AIN0-GND1无内部2.048V空调环境温度

配置完成之后,启动一次转换,等待DRDY信号拉低,再通过UART读取24位转换结果。整个流程用状态机管理,避免在等待转换期间把CPU占死。

4.2 UART命令帧的标准交互流程

ADS122U04IPWR与MCU之间的UART通信以命令帧为基础。主机发送命令字节、寄存器地址和写数据,从机返回状态和读取数据。实际调试时最影响稳定性的就是帧格式和校验。我曾经一味追求省事,只发数据不做校验,结果在实验室一切正常,到了现场变频器一启动,通信就直接乱掉。后来在帧尾增加CRC校验,单片机对收到的每一帧做校验,校验失败就丢弃并从新的一帧重新同步,这才彻底解决了问题。

这里给出一个简化但实用的帧结构:起始位固定0xAA,命令字节,数据字节(按命令可变),CRC低位,CRC高位。收到数据时用状态机先找起始字节,再按帧长收完整帧,最后验CRC。这个思路不局限于ADS122U04IPWR,所有长距离UART通信都适用。

4.3 温度转换算法的软件实现

原始24位码值转换为温度,是整个固件中最需要用心的一步。对RTD,先把码值换算成电阻值,再查分度表;对热电偶,先换算成热电势,再叠加冷端温度对应的补偿电动势,最后查热电势表得到热端温度。ADS122U04IPWR内部温度传感器读出的值可以作为冷端温度,但软件里要对它做滤波处理,一般连续采样64次取平均,再放进查表函数。

下面是一段RTD测量的C语言框架代码,演示了从原始码到电阻再到温度的核心换算思路:

static int32_t adc_read_conversion(void) { uint8_t rx_buf[3]; /* 通过UART发送读取转换结果命令,然后接收3字节24位数据 */ uart_send_cmd(CMD_READ_DATA); uart_receive_bytes(rx_buf, 3); return ((int32_t)rx_buf[0] << 16) | ((int32_t)rx_buf[1] << 8) | rx_buf[2]; } static float raw_adc_to_resistance(int32_t raw, float rref, float gain) { float ratio = (float)raw / 8388608.0f; /* 24位码,符号位前移 */ return ratio * rref / gain; } /* 查表线性插值:根据电阻值找对应温度 */ static float resistance_to_temp(float resistance, const float *table, int table_len);

这个代码框架里有一个关键点:24位ADC的原始值是二进制补码格式,正满量程对应0x7FFFFF,负满量程对应0x800000,转换成float时要先除以2^23而不是2^24,否则幅值会差一倍。这个坑我踩过,做过一次测试时读到的电阻值整体偏小,查了半天才发现是这里的问题。

4.4 STM32L162ZE侧的低功耗与DMA配合

STM32L162ZE的功率管理策略对整个系统长期运行很关键。温度采集不需要高速连续跑,我可以让MCU进入睡眠模式,由外部定时器周期性唤醒,唤醒后通过UART向ADC发送单次转换命令,等待DRDY信号到来,再读取转换结果,处理完温度换算后再次入睡。这种间歇式工作方式下,系统平均电流可以降到微安级别,特别适合需要电池供电的无线温度节点。

UART接收建议用DMA配合空闲中断。ADS122U04IPWR确实不需要编译器参与每个字节的中断,尤其当数据帧长度较短时,DMA接收整帧数据后统一解析,CPU休眠时间更长。这里有个细节:DMA传输完成中断和UART空闲中断要配合好,防止只收到半个帧就误判成完整帧。我在代码里用超时机制兜底,收到部分帧后超过一定时间没有新数据就清掉缓冲区,等待重新同步,这是在现场通信噪声大时的保命手段。

5. HVAC与工业现场的抗干扰实战

5.1 干扰源到底从哪里来

把实验室里调试好的设备搬到现场,最常出现的问题是:读数跳动、通信乱码、偶尔死机。工业现场有几个典型的干扰源:变频器产生的强烈谐波干扰,通过电源和空间辐射两条路径进入信号链路;大功率电磁阀通断时产生的瞬态电流,在线缆上感应出尖峰电压;还有强电线路和信号线束走同一个线槽时,50Hz工频磁场在传感器回路里感应出工频噪声。

HVAC场景有它的特殊性,空调主机、风机、水泵都在附近,几台变频器同时运行的情况非常常见,而传感器线往往跟着动力电缆一起走。这种情况下,单靠ADC内部的数字滤波是不够的,还需要从系统层面做抑制。

5.2 关键布线策略:屏蔽、隔离与单点接地

温度传感器的屏蔽层要正确处理。屏蔽层应该在电源一侧单点接地,不要两端都接地,否则屏蔽层里会形成地环路电流,反而把干扰耦合进信号回路。如果现场传感器线和强电线路实在无法分开敷设,至少要让传感器线穿金属管,金属管做好接地,这一条能达到非常可观的干扰屏蔽效果。

有的工程师为了省成本,把ADC和传感器之间的信号隔离省掉了。在只有一两个测温点的简单场景里,隔离也许可有可无;但在大型HVAC系统中,不同设备的电位差可能高达十几伏,不隔离的话不仅测量不准,还可能烧毁芯片。我在设计中用数字隔离器放在ADC UART输出侧,这样模拟部分和数字部分彻底地分开,通信信号通过隔离器传输,既保证了可靠性又降低了成本。

5.3 现场实测:50Hz工频干扰的抑制效果

在一台带变频器的空调机组上实测过,传感器线走线长度约12米,与变频器输出电缆平行距离15厘米左右。未做任何滤波处理时,ADC原始码值的峰峰值跳动大约是65个LSB,换算成温度约为0.8℃。软件里把数据速率设为20SPS时,内置50Hz抑制生效,跳动降至15个LSB,约0.18℃。前端再加上RC滤波后,最终跳动稳定在6个LSB以内,温度波动小于0.08℃。

这个实测数据说明,数字滤波和模拟滤波不是互相替代的关系,而是互补的。RC模拟滤波负责抑制高频共模干扰,ADC内部数字滤波负责抑制工频和整数倍谐波,两者叠加后效果才有保障。

干扰抑制措施原始码值波动(LSB)等效温度波动
无滤波处理650.80℃
ADC数字滤波20SPS150.18℃
RC滤波+数字滤波60.08℃

6. 常见问题与调试经验速查表

6.1 高频踩坑案例

项目做得多了,几乎每个温度采集项目都会碰到类似的问题。我把它们整理成速查表,供同行直接对照排查。

现象可能原因排查方向
读数整体偏小24位码值除以了2^24而不是2^23检查符号扩展和比例因子
温漂厉害,读数随现场温度变化参考电阻温漂系数太大或IDAC电流设置不合理换低温漂参考电阻,检查激励电流大小
某一路读数异常,其他路正常多路复用器的某个通道接触不良或保护器件损坏测量该通道输入对地电阻,检查TVS管
UART通信间歇性乱码波特率偏差、无校验或地电位不稳用示波器看信号质量,校准波特率,增加CRC校验
读数在变频器启动瞬间跳变电源和信号线受干扰,屏蔽接地不良检查屏蔽层接地方式,加强前端RC滤波

6.2 几个值得记住的经验心得

经验一,做RTD测量时别上来就用最高PGA增益。增益高虽然能提高分辨率,但PGA输出范围有限,如果参考电压偏低,信号稍大一点就会削顶,读数直接卡在满量程。做设计时先计算最大被测温度对应的信号电压,再决定增益,留出20%左右的余量。

经验二,我建议刚开始调试时把ADS122U04IPWR的配置参数打印出来,配合上位机读到的原始码值一起分析。单纯看温度输出,很难判断是传感器问题、配置问题还是通信问题。从原始码值出发排查,能快速定位故障环节。自己写一个简单的串口调试助手,或者用现成的上位机工具,对项目调试帮助很大。

经验三,HVAC和工业温度项目的校准方法不太一样。HVAC现场一般用冰水混合物和恒温水浴做两点校准,工业项目则要按产品的精度等级和量程做全量程校准,通常要采集5到8个标准温度点,用最小二乘法拟合出增益误差和偏移误差系数。这部分校准系数要存到STM32L162ZE内部的EEPROM或Flash里,设备重启后自动加载,不要每次开机都重新校准。


最后再分享一个我在实际项目中坚持的小习惯:给每块板子保留一个调试用的UART接口,哪怕量产时焊不焊这个接口,PCB上也要预留。ADS122U04IPWR和STM32L162ZE的通信问题,有时候用万用表量半天都摸不着头脑,接上调试串口把原始帧打印出来,立刻能看清是ADC没响应、寄存器没写进去,还是数据解析错了。这个习惯帮我省掉的排查时间,远远超过那多画出来的几根走线。温度测量这条路,硬件软件各占一半,哪边偷懒,现场都会加倍还回来。