news 2026/11/5 1:04:00

UART接口ADC实现长距离RTD测温:ADS122U04与STM32F091RC实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UART接口ADC实现长距离RTD测温:ADS122U04与STM32F091RC实战

去年我参与一个洁净室空调系统改造项目,需要监测风管、冷冻水管以及室内回风共十几路温度探头,信号线最长的从机柜拉到吊顶夹层,接近八十米。最初图省事,用了SPI接口的ADC,结果线一长就开始“抽风”——不是时钟和数据错位,就是CS被噪声拉低导致整个总线上设备罢工。后来换成了TI的ADS122U04IPWR,配合STM32F091RC做主机,才把这套测温系统真正跑稳。这篇笔记把当时的选型逻辑、硬件接法、固件驱动以及现场踩过的坑完整写出来,希望能给正在做类似采集方案的朋友省点时间。不管你是准备测HVAC的风管温度,还是工业设备上的轴承温度,这套组合都值得考虑。

ADS122U04IPWR是一个24位Delta-Sigma ADC,封装很小但内置了PGA可编程增益放大器、双通道激励电流源、内部参考电压和内部温度传感器,最关键的是它用UART串口和主机通信。STM32F091RC这边是标准的Cortex-M0主控,外设丰富,跑20SPS的数据采集绰绰有余。两者搭配,既能做高分辨率测量,又能把采集前端放到离传感器更近的位置。

1. 为什么把SPI换成UART:ADS122U04的传输优势与选型逻辑

1.1 长连线和隔离是SPI的老大难

第一次画测温板的时候,我其实是按传统方案来的:STM32的SPI接口直接连一个24位ADC,放在一块小板上。初期测试距离只有二十厘米,一切正常。等到了现场,ADC被挪到传感器箱里,离主机大概三米,SPI时钟只要超过1MHz就完蛋,CS和SCK之间必然出现时序偏差。传感器箱旁边还有变频器、接触器,就算把SPI时钟降到100kHz,仍然会在长线上耦合各种噪声,导致读写丢数据。

SPI这种差分能力弱的同步接口,天生不适合远距离传输。更要命的是隔离:如果现场要求电气隔离,SPI的时钟、片选、MISO、MOSI四根线每一根都得加数字隔离器或光耦。数字隔离器还要考虑传输延迟是否影响时序,光耦速度跟不上又会让时钟上升沿变缓,反正就是越弄越复杂。而UART是异步串口,只有TX和RX两根线,加RS485驱动后跑几百米轻轻松松,隔离也只需要隔离两路信号,成本低一个数量级。

ADS122U04IPWR把高精度测量和UART传输封装在一起,相当于省去了自己在ADC和MCU之间搭逻辑转换的麻烦。在工业分散采集场景中,这种“先把模拟量就地数字化,再通过串口传回主机”的架构,本身就有很强的抗干扰优势。

1.2 ADS122U04的UART通信机制与多设备组网

ADS122U04支持自动波特率检测。上电后主机发送一个特定的同步字节(通常是一个起始位加上8个连续的零),芯片通过测量这个字节的位宽自动锁定波特率,这样就不需要专门的晶振或者额外的波特率校准引脚。实测中我用的9600波特率,发送几个0x00就能稳定唤醒芯片,通信非常省心。手册上标注的波特率范围比较广,低速率意味着更长的传输距离,对于20SPS的温度采集来说完全够用。

更关键的是它支持多设备组网。ADS122U04有一个地址引脚ADDR,通过设置不同的电平状态,可以在同一条UART总线上挂多片ADC。主机在命令帧里带上地址字段,某片ADC收到匹配地址的命令后再响应。这意味着只用一个STM32的UART外设,就能扩展出四通道、八通道甚至更多温度测量点。我在项目里用了三片ADS122U04,一条串行总线搞定十二路PT1000,连线工作量直线下降。

1.3 与SPI/I2C接口ADC的对比表

对比项UART接口ADC(ADS122U04)SPI接口ADCI2C接口ADC
传输线数2根(TX/RX)4根以上(SCLK/MOSI/MISO/CS)2根(SCL/SDA)
板间传输距离中等(加RS485后很长)短(30cm内安全)短(1m内)
隔离难度低,只需隔离两线高,每根线都要隔离中,两线但时序复杂
多设备组网支持地址寻址需要多个CS引脚地址有限,速率较低
抗干扰能力异步协议,波特率低时很强同步时钟容易受干扰容易受时钟拉伸影响
适用场景工业现场、分布式采集板级高速采集板级小系统

表格里这种对比很直观。对于需要把传感器放在现场、主控放在控制柜的应用,UART接口ADC的优势几乎是一边倒的。

2. 在TSSOP-16上搭测温前端:RTD与热电偶的硬件接线

2.1 芯片内部架构与外围器件清单

ADS122U04IPWR采用TSSOP-16封装,体积不大,但内部集成了很多测温需要的外围电路。它有四个模拟输入通道(可配置成两路差分或四路单端),一个增益从1到128的PGA,两个可用于RTD激励的电流源IDAC1/IDAC2,一个内部2.048V电压基准,一个内部温度传感器,还有50Hz/60Hz抑制数字滤波器。对于PT100、PT1000、热电偶甚至NTC热敏电阻,几乎都能直接接。

硬件设计时最需要注意的是模拟电源、数字电源和地的处理。我通常把模拟电源和数字电源分别用0.1μF陶瓷电容和1μF钽电容去耦,AGND和DGND在AD转换芯片下方单点连接,避免数字噪声通过地平面串进模拟回路。参考电压对绝对精度影响很大,所以如果需要外接高精度基准电阻,一定要放在靠近REFP/REFN引脚的位置,走线尽量短、避开长距离平行走线。

2.2 RTD比例测量:用同一个激励源消除温漂

RTD(尤其是PT100和PT1000)在工业测温中用得最多。ADS122U04内部带电流源,这让我可以用比例测量法,而不是简单的绝对电压测量。

比例测量的核心思路是:让同一个激励电流IDAC流过RTD和一个精密参考电阻RREF,然后把参考电阻上的压降接到ADC的参考输入。这样ADC输出的原始码,实际上反映的是RTD电阻和RREF电阻的比值。因为两个电压都来自同一个电流源,即使电流源随温度发生漂移,这个比值也几乎不变。也就是说,电流源温漂和增益漂移在比例测量中被天然抵消了。

以PT100为例,我常把IDAC配置为1mA,RREF选1.8kΩ,参考电压就是1.8V。室温下PT100的100Ω电阻上只有0.1V压降,所以需要把PGA增益打到16以上。如果测温范围扩展到300℃,PT100阻值约212Ω,0.212V乘以16就是3.4V,可能会超过参考电压,所以增益要根据实际量程重新算。PT1000我一般把激励电流降到0.5mA,RREF选2kΩ,这样自热更小,参考电压1V,PGA用16也能覆盖宽温度范围。

三线制RTD接线可以消除导线电阻引入的误差。ADS122U04有两个电流源,正好可以把两个相同的激励电流分别加到RTD的两根导线上,再用差分输入测量RTD两端的电压。这样导线电阻上的压降被差分测量抵消,精度能明显提升。四线制当然更好,但现场布线成本高,我用三线制居多。

2.3 热电偶冷端补偿:内部温度传感器与外部NTC怎么取舍

热电偶的输出电压非常小,K型热电偶大约每度变化40μV左右,所以必须开PGA高增益,通常用64倍或128倍。此时ADS122U04的24位分辨率就显出优势来了,即使在128倍增益下,依然能分辨很小的温度变化。

热电偶测量不能绕过冷端补偿。ADS122U04内部有温度传感器,可以直接读出芯片附近的结温,如果热电偶的接线端子就在芯片旁边,用内部温度传感器做冷端补偿是够用的。但如果热电偶是从几米外的接线端子引过来,比如现场工业设备上的K型探头,冷端温度其实是端子排处的温度,不是芯片处的温度,再读内部温度传感器就会引入误差。

这种情况下我会在端子排处贴一个NTC热敏电阻,用ADS122U04的另一个通道测NTC阻值,再用STM32读取并换算成冷端温度。冷端温度不需要超高精度,普通B值NTC加一个0.1%电阻分压,做单点校准后就能把整体误差控制在±0.5℃以内。HVAC应用对温度稳定性要求高,但绝对精度通常允许±0.5℃到±1℃,这个方案完全够用。

3. STM32F091RC的UART驱动与温度换算

3.1 自动波特率检测的握手过程

STM32F091RC有多个USART,我用USART2和ADS122U04通信,波特率配9600,8位数据位,无校验,1位停止位。初始化完成后,先延时100ms,等ADS122U04上电稳定,然后连续发送几个0x00。UART空闲时是逻辑高电平,发送0x00信号中会出现一个低电平起始位和八个低电平数据位,芯片就能测量出一个完整位的时间宽度,从而自动识别出波特率。

实际项目里遇到过一个问题:如果上电后忘记做同步握手,直接发配置命令,芯片会完全没有反应。后来我把同步字节放在所有命令之前,并且在每次板子上电后都执行一次,保证通信一定建立起来。这个细节看起来小,但现场无人值守复位时很容易被忽略。

3.2 配置寄存器与读取数据的通信帧结构

ADS122U04的UART通信以命令帧为单位,主机每次发送一个命令字节,后面跟上对应的数据字节。命令字节包含设备地址、读写标志和寄存器地址等字段,具体编码要对照数据手册。我刚入门时吃了不少亏,后来习惯养成了:每次配置都严格按手册上的寄存器表逐位填写,而不是凭记忆拼命令。

配置流程通常是这么几步:

  • 发送写命令,配置输入多路复用器选择通道;
  • 配置PGA增益、数据速率和滤波器模式;
  • 配置IDAC电流源和参考电压来源;
  • 触发一次转换或进入连续转换模式;
  • 延时等待转换完成;
  • 发送读命令,接收ADC数据(通常是3字节)。

关键代码用HAL库写起来很直白。比如发送一个配置命令:

uint8_t wcmd[2]; HAL_UART_Transmit(&huart2, wcmd, 2, 100);

读取转换结果时,先发出读数据命令,然后接收三个字节数据,组装成24位原始码:

uint8_t rxdata[3]; HAL_UART_Receive(&huart2, rxdata, 3, 100); int32_t raw = (rxdata[0] << 16) | (rxdata[1] << 8) | rxdata[2]; if (raw & 0x800000) { raw |= 0xFF000000; // 补码转有符号数 }

这种查询式读取对20SPS的数据率来说完全足够,CPU负载可以忽略不计。如果以后想提高采集路数,再用DMA加空闲中断做后台处理也不迟。

3.3 从原始码到温度:PT100和K型热电偶的计算代码

拿到原始码之后,温度换算是另一个关键点。比例测量下,RTD的电阻值可以直接用比例公式算:

float rtd = r_ref * (float)raw / (pga * 8388608.0f);

其中r_ref是参考电阻阻值,pga是当前PGA增益,8388608对应24位ADC的满量程码值。注意实际数据格式和满量程定义要以芯片手册为准,不同配置下可能分母略有差异。我的做法是先读已知电阻校准,反推实际的分母系数。

得到RTD阻值后,再查PT100或PT1000分度表。可以存一张稀疏表格后用线性插值,也可以用Callendar-Van Dusen公式在线计算。工程上线性插值最简单可靠,表格从-50℃到300℃每隔1℃一个点,浮点运算量很小。对于热电偶,先把原始码换算成电压:

float v_tc = raw * v_ref / (pga * 8388608.0f);

然后查对应热电偶分度表的反函数,把热端电压加上冷端电压换算后的值,得到热端温度。我这里简化了不少细节,但思路就是“原始码→物理量→温度”。所有线性换算逻辑都在STM32F091RC上跑,48MHz主频处理几十路查表毫无压力。

4. 工业现场实测:噪声、校准和断线那些事

4.1 工频干扰与数字滤波器配合

设计了一套能在调试台上稳定工作的系统,和现场稳定运行是两码事。我把板子装到电控柜里,旁边就是变频器。刚开始测风管温度,数据明显比调试台抖得厉害,原本稳定的低位码跳动从几十个增加到几百个。

ADS122U04内置了数字滤波器,数据率配置到20SPS时对50Hz工频有不错的抑制。但这个抑制能力对共模干扰有限,特别是当传感器线从变频器旁边经过时,高频噪声仍然会被检出来。后来我在每一路模拟输入端加了差模RC滤波,电阻100Ω、电容100nF,同时在电源输入端加共模扼流圈。传感器屏蔽层只在ADC端单点接地,另一端悬空。这些措施加上去后,数据跳动降到了个位数。

还有一个容易忽略的问题是地电位差。如果ADC板和传感器现场不在同一个接地点,屏蔽层两端都接地就很容易形成地环流。HVAC项目中吊顶金属管和电柜接地电阻不同,实测中这两端电压差可以达到几十毫伏,足以让热电偶毫伏级信号完全失真。所以屏蔽层单端接地不是可选项,是必选项。

4.2 零点漂移和增益校准的实操流程

数据手册上给出的典型精度再高,也替代不了实际校准。我的校准方法是先做零点,再做增益,全程用精密电阻代替传感器。

零点校准:把一个0.1%、温漂系数很低的100Ω精密电阻接到PT100通道上,让ADC采集一段时间,记录原始码的平均值。这个值理论上应该对应0℃时PT100的100Ω,但因为ADC偏置和内部参考电压存在微小偏差,实际会和理论值略有出入。我把这个偏差作为offset存到STM32的Flash里,后续所有转换结果都先减掉offset。

增益校准:把一个1kΩ的精密电阻接到同样的通道上,采集原始码,计算出实际增益系数。公式很简单:

float pga_actual = r_ref * raw_cal / (r_cal * 8388608.0f);

然后把计算得到的pga_actual替换掉理论增益值。做完这两步,整个链路的线性误差基本被拉平。现场安装后再用冰水混合物做一次零点和用标准电阻箱做一次量程验证,就能把精度控制在比较理想的范围内。

4.3 断线检测与故障报警的实现

温度探头断线是现场不可回避的问题。RTD断线后,激励电流没有了回路,输入端的电压会被拉到某个极限值,原始码往往接近满量程。热电偶断线就更明显,输入悬空时电压漂移会超限。

我在固件里加了一个故障判断逻辑:每当采集到一组原始码,先判断它是否超过传感器可能对应的物理上下限。比如PT1000在-50℃到200℃范围内,电阻值大约在800Ω到1750Ω之间,换算成原始码后是一个区间。如果当前值超出这个区间,且持续三次采样都超限,就判定该通道断线,把状态位置为故障并报警。

这个方法实现简单,但要注意不能把瞬时尖峰误判成断线。所以连续三次确认非常重要。实测中发生过一次接线端子松动,温度值偶尔跳出正常范围,就是靠这个三重确认逻辑正确报了警,避免了长时间采集错误数据。

4.4 HVAC场景下的老化测试结果

整个系统在洁净室项目里连续运行了7天,我把三块ADS122U04板卡放在60℃恒温箱中做老化,同时用一套冰水浴和标准铂电阻做外部参考。结果24小时内最大偏差在0.15℃以内,长时间漂移也没有明显的趋势性变化。

不过老化测试暴露出一个容易被忽视的问题:芯片自身发热会让内部温度传感器读数偏高,如果用这个温度做热电偶冷端补偿,会造成系统性的正偏差。后来在风管温度测量中,因为用的是PT1000,不依赖冷端补偿,所以没有这个问题。热电偶通道就老老实实外接NTC,不贪图省事。

另外,参考电阻的温漂是比例测量中唯一无法被抵消的温漂源。我一开始为了省钱用了普通厚膜电阻,老化后发现温度稍微一变,测量值跟着变。后来换成了25ppm/℃甚至5ppm/℃的精密电阻,才彻底稳定下来。这个钱不能省。

5. 扩展思路:多板级联、RS485远程采集与快速调试工具

5.1 地址配置与多UART总线级联

单个ADS122U04只有四路模拟输入,但通过ADDR引脚的不同电平,可以在同一条UART总线上并联多片。我的做法是给每片ADS122U04设置不同的地址,主机用同一个USART依次访问。

这样带来的最大好处是主控板上几乎没有什么模拟布线,每一片ADC直接和传感器放在一起,传感器线做短一点,数字线反而是长线。对工业现场来说,模拟信号线越短越稳,这个价值比单纯省IO大得多。实际配置的时候要确认每片ADC的地址不同,否则总线冲突会让整个采集系统瘫痪。

5.2 接RS485变成分布式采集节点

如果STM32F091RC所在的控制板还要把数据送到更远的上位机,可以把USART通过MAX3485芯片转成RS485。这样每个采集节点都是独立模块,用双绞线手拉手连起来,最远可以到几百米。数据链路可以自定义简单帧传输,也可以套用Modbus RTU协议,上位机轮询每个节点。

我在第二个项目中就是这么干的:现场放了五个采集节点,每个节点一块STM32F091RC加两片ADS122U04,RS485统一汇总到控制室的触摸屏。这比把所有探头线都拉到控制室省了不知道多少电缆,而且任何一个节点掉线都不会影响其他节点。

5.3 快速验证:USB转TTL先调通ADC

正式写STM32代码之前,我强烈建议先拿USB转TTL模块直接连ADS122U04,在电脑上用串口助手发同步字节、写配置寄存器和读数据。这样做可以不把MCU的问题混进来,先确认ADC硬件工作正常。

有一个注意点:USB转TTL模块如果输出3.3V逻辑电平,而ADS122U04供电是3.3V或5V,逻辑电平兼容性要提前确认。我当时的模块是3.3V电平,芯片也供电3.3V,完全兼容。如果芯片用5V供电,还是老老实实加电平转换,别硬怼。调通之后,再用STM32的同一个USART波特率、同一条命令流去驱动,剩下的基本就是复制粘贴了。

这套方案从选型到落地,用了大概一个半月。现在回头再看,ADS122U04IPWR最大的价值不是“24位分辨率”这个参数,而是把高精度ADC、PGA、电流源和UART传输打成一包,让工业测温的模拟前端变得非常紧凑和可靠。STM32F091RC作为控制核心,反而成了最没存在感的部分,跑跑命令、算算温度和通讯就够了。如果你正在做类似的测温板,我的建议是先别急着写代码,把传感器类型、量程、线缆长度和现场干扰源搞清楚,再决定是用比例测量还是热电偶加冷端补偿,最后才回来抠命令寄存器。这套决策顺序走下来,能少走不少弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 1:03:52

ADS122U04+STM32F334的工业温度采集方案:从PT100到UART总线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:03:20

ADS122U04与ATmega1280工业温度采集方案:选型、电路与校准实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 1:02:25

ADS122U04+STM32多路温度采集方案:RTD/热电偶/NTC全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/4 23:52:38

XUnity AutoTranslator插件教程:三行配置实现Unity游戏实时汉化

1. 为什么一个翻译插件值得单独写一篇教程如果你玩过一些只有英文或日文版本的独立游戏&#xff0c;大概率遇到过这种情况&#xff1a;游戏本身素质不错&#xff0c;但满屏的外文对话让人望而却步&#xff0c;啃生肉啃到一半就弃了。市面上确实有一些翻译工具&#xff0c;但要么…

作者头像 李华
网站建设 2026/11/4 23:45:31

云原生统一观测方案:MCP Server的设计与实践

1. 项目背景与核心价值 在云原生和微服务架构盛行的当下&#xff0c;可观测性已经成为现代系统运维的刚需。但现实情况是&#xff0c;我们往往需要同时使用多种监控工具——Prometheus 擅长指标收集、OpenObserve 专注日志分析、SkyWalking 精于分布式追踪。这种多工具并存的局…

作者头像 李华
网站建设 2026/11/4 23:45:30

Active Directory域渗透测试实战指南

1. 项目背景与核心价值域渗透测试是企业内网安全评估的关键环节。作为企业网络架构的核心&#xff0c;Active Directory&#xff08;AD&#xff09;域环境一旦被攻陷&#xff0c;攻击者往往能获取整个网络的控制权。去年某次企业红队评估中&#xff0c;我们发现超过80%的内网横…

作者头像 李华