1. 为什么是UART接口的24位ADC:这套方案的真实场景与选型逻辑
做温度采集的老工程师应该都有印象,以前做多通道高精度采集,板子上密密麻麻排着一堆SPI从设备,每个ADC都要单独拉一根CS片选线,MCU的GPIO资源被吃干榨净。如果你做的还是工业现场的设备,信号线一拉就是好几米,SPI时钟线在长距离下就是灾难——振铃、反射、数据错位,调试到怀疑人生。
ADS122U04IPWR这个芯片有意思的地方在于,它把SPI协议藏在了内部,对外只暴露一个UART接口。四通道24位ADC,用两根线就能读数据,这对工业现场来说简直是降维打击。另一个主角STM32F215RE大家更熟了,Cortex-M3内核,120MHz主频,Flash有512KB,关键是它有5个UART,其中一个专门用来跟ADC通信,绰绰有余。
这套组合最适合的场景,我总结了三类:
- HVAC楼宇自控系统:冷热水机组、风机盘管、空气处理机组的温度监测,信号线经常要走桥架、穿管,距离动不动就是几米到十几米,UART在低速下的抗干扰能力远优于SPI。
- 工业过程监控:比如反应釜夹套温度、管道伴热温度、轴承温度预警,这类场景往往还需要电气隔离,UART接口做光耦隔离比SPI容易得多——接收侧一个光耦就搞定,而SPI隔离你得同时处理时钟、片选、数据三根线。
- 分布式数据采集终端:如果你想把温度采集板做成一个独立的模块,挂在RS485总线上,那ADS122U04简直就是为你准备的,UART直接进RS485收发器,不需要额外的协议转换芯片。
功耗也很抢眼,单次转换模式下电流不到1mA,待机模式下更是微安级别。做电池供电的无线温度记录仪(比如冷链运输追踪器)也可以用,休眠时让MCU和ADC一起睡,定时醒来采一次数据再睡回去。
2. 信号链设计:ADS122U04前端到底帮你省了多少事
很多人一看到24位ADC,下意识以为随便接个传感器就能出高精度数据。实际上精度是靠整个信号链堆出来的——传感器的激励精度、放大器的温漂、参考电压的稳定度,任何一个环节拖后腿,24位分辨率都是纸上谈兵。
2.1 内置激励电流源:PT100/PT1000恒流激励的痛点
测铂电阻(PT100/PT1000)的标准做法是恒流源激励,通过测量电阻两端的电压来反推温度。以前用运放搭恒流源,要买精密基准源、精密运放、精密电阻,调温漂调到眼睛花。ADS122U04内部集成了两个可配置的激励电流源,电流档位可以从50µA一路调到1.5mA,误差典型值只有4%,温漂系数控制在50ppm/°C以内。
对PT100来说,推荐用500µA或1mA的激励电流。有个细节值得注意——电流越大,传感器自热越明显。PT100在1mA电流下自热功率约0.1mW(100Ω × 1mA²),在空气介质中大概会造成0.02°C左右的温升误差,而在水介质中这个误差可以忽略。如果做高精度测量,建议用250µA,虽然信号幅度小一点,但24位ADC的分辨率完全扛得住。
具体接线思路是这样:激励电流源IEXC1从芯片出来,流过RTD,再经过线路电阻回到公共端。用比例测量法(ratiometric measurement),把参考电压也取自同一个激励电流源流经精密基准电阻产生的电压。这样即使电流源有波动,ADC转换结果里分子分母同步变化,误差就被抵消掉了。ADS122U04的参考电压输入REFP/REFN之间跨接一个精密电阻(比如5.6kΩ,电压正好在内部参考允许范围内),PT100接在IN0和IN1之间,这种接法在手册里叫"3-wire RTD ratiometric",工业现场强烈推荐,因为长线敷设的线路电阻差异会被部分抵消。
2.2 热电偶测量:冷端补偿与PGA增益的配合
热电偶的输出电压极其微弱——K型热电偶大约41µV/°C,T型大约43µV/°C,J型大约52µV/°C。哪怕测0到100°C的温度范围,满量程也不过几毫伏。这时候ADS122U04内置PGA的价值就出来了——增益最高可以设到128倍,把微伏级信号放大到ADC的有效量程范围内。
用热电偶还有个大坑是冷端补偿。热电偶测的是热端和冷端的温差,冷端(也就是接线端子处)的温度必须补偿回来。ADS122U04内置了一个温度传感器,用来测量芯片自身的结温,这个结温就近似当作冷端温度。上电之后读内部温度传感器的转换结果,然后按冷端温度去查对应的热电势表,叠加到热电偶测量值上,这就是完整的冷端补偿流程。
内部温度传感器还能用来做板级温度监测。如果你的设备里还有其他发热源(比如电源模块),可以用四通道里的一个通道接入NTC热敏电阻做辅助温度检测,实时监控PCB局部热点,这在电源类产品的设计验证阶段很实用。
2.3 双通道差分输入与单端/差分模式切换
ADS122U04的四个通道可以自由配置为差分输入或单端输入。比如两路PT100接成两对差分输入(IN0-IN1、IN2-IN3),同时留两个通道做单端输入接NTC或0-10V电压信号(经分压电阻)。当然,四通道全配成单端、或者两路差分混合,都可以通过寄存器配置灵活切换。
这里有一个实际工程中容易忽略的要点:ADC的输入阻抗。在高增益模式下(PGA=128),输入等效阻抗会下降,如果信号源内阻超过几kΩ,就会产生可观的增益误差。工业前端的RC滤波电阻一定要控制在较小阻值(典型值1kΩ以内),否则你会在校准的时候发现一个奇怪的固定偏差——实际就是输入阻抗分压造成的。
3. 硬件连接的工程细节:从原理图到Layout的实战笔记
3.1 MCU与ADC的接口:一个容易被忽略的逻辑电平问题
ADS122U04的UART接口是标准的3线(TXD、RXD、也可以只用TXD单向读取)。正常工作模式就是MCU发命令、ADC回数据,一主一从,非常干净。很多人的第一反应是STM32的UART直接连过去就完事,但实际上这里面有一个坑——电平兼容性。
ADS122U04的电源可以做到3.3V,STM32F215RE的IO口也是3.3V,两者直连没有问题。但如果你用了5V供电的ADC板,或者MCU那边接了5V的上拉电阻,就需要电平转换。早期我在一个项目里偷懒没加转换,结果ADC通信间歇性失败,查了好久才发现是MISO上的电平被上拉到5V,MCU的GPIO虽然容忍5V输入但UART外设对输入阈值的要求更苛刻,导致偶尔误码。
推荐接法:
- ADC的TXD接MCU的UART_RX,中间串一个1kΩ电阻保护(防止ADC异常输出时把MCU引脚打到异常电平)。
- 如果做隔离,在ADC的TXD和MCU的RX之间放一个高速光耦(6N137或Si8620),光耦的LED侧串电阻限流,注意电流要匹配ADC TXD的驱动能力。
3.2 参考电压与电源滤波:24位ADC对噪声的容忍度极低
先说结论:ADS122U04的内部参考电压有2.048V和2.5V两档,对于绝大多数温度测量应用,用内部参考完全够用,而且内部参考的温漂性能是40ppm/°C级别。但是,如果你的系统要求在-40°C到+85°C全温域内做到0.1%的精度,那推荐外部精密参考源(比如REF5025),温漂能压到3ppm/°C,代价是成本上涨一大截。
供电滤波这里我多说几句,这是新手最容易翻车的地方。ADC的模拟电源AVDD和MCU的3.3V不要直接用同一路LDO的输出。24位ADC的LSB在2.5V满量程下大约相当于1.5µV(2.5V / 2^24),MCU数字IO翻转时产生的电源毛刺可能高达几十毫伏,直接烧进ADC的模拟电源,转换结果的低位就是乱码。
我的做法是两级稳压:5V进来先过一片AMS1117-3.3给数字部分,再经过一个低噪声LDO(比如LP5907或TPS7A2025)单独给AVDD供电。模拟地和数字地在ADC下方单点汇合,大面积铺地铜皮。AVDD和AVSS之间放10µF钽电容加0.1µF陶瓷电容并联,靠近芯片引脚放置。
3.3 Layout里最容易被忽视的三个位置
ADS122U04的封装是TSSOP-16,引脚间距0.65mm,手工焊接稍微有点考验,但正常回流焊完全没问题。Layout时有几个位置我每次都要反复检查:
- 参考电容位置:REFP和REFN引脚之间必须跨接一个高质量的C0G电容(典型值1µF),一定要贴着引脚放,走线越短越好。这个电容是ADC内部采样电容的"充电宝",放远了会直接影响转换线性度。
- 模拟输入走线:RTD信号线进ADC之前如果加了RC滤波,那么R和C的位置要从ADC引脚往外排——C贴着ADC引脚,R再往外。这样滤波电容能直接吸收内部开关电容的电荷注入。
- UART引脚留测试点:调试阶段你会抓狂地需要示波器探针挂到ADC的TXD上看波形,建议在生产板上预留两个过孔或测试焊盘,别到Debug的时候飞线。
4. 固件上手指南:从寄存器配置到温度计算的完整流程
4.1 初始化流程:三个关键寄存器一次配到位
ADS122U04的控制寄存器有三个(配置寄存器1、2、3),通过UART写入。我把初始化代码的逻辑整理成一个状态机,思路往下看。
第一步:等待ADC上电稳定(至少100ms)
别一上电就发命令,ADC内部参考电压和振荡器建立需要时间。STM32上电后先延时100ms再操作ADC。
第二步:写配置寄存器
配置寄存器1负责输入多路复用器和增益设置,字段包括:
| 字段 | 功能 | 推荐值 |
|---|---|---|
| MUX[3:0] | 选择输入通道 | 0000:AIN0-AIN1差分 |
| PGA[2:0] | 增益设置 | 001:增益1;100:增益16;111:增益128 |
配置寄存器2负责数据速率和转换模式,字段包括:
| 字段 | 功能 | 推荐值 |
|---|---|---|
| DR[2:0] | 数据速率 | 100:50SPS(工频抑制好) |
| MODE | 连续/单次模式 | 0:连续转换模式 |
| IDAC[2:0] | 激励电流源设置 | 011:500µA |
配置寄存器3负责参考电压和温度传感器,字段包括:
| 字段 | 功能 | 推荐值 |
|---|---|---|
| REF[1:0] | 参考电压源 | 00:内部参考 |
| TS | 温度传感器使能 | 0:禁用(用外部传感器) |
| IDAC1/IDAC2路由 | 激励电流源输出通道 | 设置IDAC从REFP引脚输出 |
第三步:启动连续转换
发送START命令(0x08),然后每读一次数据寄存器就能拿到最新转换结果。
4.2 读数据与温度计算:24位有符号数的处理
ADS122U04的转换结果存储在24位寄存器里,格式是有符号数,最高位是符号位。STM32F215RE的串口接收是按字节收的,你需要自己拼装:
uint8_t rx_buf[3]; int32_t raw = 0; // UART接收3字节(假设已经收满) raw = ((int32_t)rx_buf[0] << 16) | ((int32_t)rx_buf[1] << 8) | rx_buf[2]; // 处理符号扩展:如果最高位是1,说明是负数,补全到32位 if (raw & 0x800000) { raw |= ~0xFFFFFF; // 扩展符号位 }拿到raw值之后,换算成电压:
电压 (V) = raw × (2 × VREF / 增益) / 2^24比如内部参考设为2.5V,增益128,那么满量程就是2 × 2.5 / 128 ≈ 39.06mV,最低有效位分辨率约2.3nV——当然这是理论值,实际噪声底在50SPS采样率下大约有几百纳伏到微伏级别,不过对温度应用已经绰绰有余了。
4.3 线性化处理:别用查表,直接用多项式拟合
铂电阻的温度-电阻关系不是线性的,但用查表法在Flash里存几百个点又费空间又费事。我推荐用ITS-90标准的Callendar-Van Dusen方程,直接算:
- 在0到850°C范围:R(t) = R₀ (1 + A·t + B·t²)
- 在-200到0°C范围:R(t) = R₀ (1 + A·t + B·t² + C·(t-100)·t³)
系数A=3.9083e-3,B=-5.775e-7,C=-4.183e-12。
编程时候在STM32F215RE的512KB Flash里用double做浮点运算绰绰有余(Cortex-M3有硬件除法指令,但浮点运算靠软件库)。
对于热电偶,情况稍微复杂:需要先用多项式反演把电压换算成温度(不通用的多项式,每种热电偶有自己的系数表),然后加上冷端温度。工程实践中最省事的方式是:用ADS122U04内部温度传感器读冷端温度,然后查你所用热电偶的标准分度表(比如K型热电偶的NIST表),做插值即可。如果不想占太多Flash,可以用NIST公开的逆多项式系数,只需要大约10次乘加运算就能得到0.01°C级别的精度。
5. 避坑实录:连续转换模式下的数据同步问题
ADS122U04的数据输出速率和STM32的UART读取速率之间天然存在一个配合问题。假设ADC工作在50SPS,那么每20ms产生一个新的转换结果。如果你用UART的中断方式随时去读,很可能读到的是"正在更新"的半新半旧数据——高位还在变,低位已经更新完。
解决办法有两个:
方案一:用DRDY引脚(如果该型号引出此引脚)做硬件握手
ADS122U04有DRDY信号,转换完成会拉低。把这个引脚接STM32的外部中断输入,下降沿触发中断后在中断服务函数里发起UART读数。这是最稳妥的方式,数据绝对同步。
方案二:查询模式+延时等待
如果你的系统没有多余的中断引脚,可以在主循环里循环读,但要注意:每次读操作必须连续读取完整的3字节,中间不能让其他高优先级中断抢占太长时间。我实测发现,50SPS下,如果串口波特率设为115200,读3字节只需要约260µs,在这个窗口期内即使被中断打断几十微秒问题也不大,但如果你的系统里有依赖长延时的中断(比如电机控制),那就必须用方案一。
这个坑我印象特别深。去年做一个多通道温度记录仪,前几版固件用的是方案二,裸机跑没问题,后来加了RTOS,某个高优先级任务偶尔运行一个耗时1毫秒以上的临界区,导致ADC数据偶尔跳变几度。排查了很久才发现是数据读取被拆开了,现在全部改用DRDY硬件握手,再没出现类似问题。
6. 电磁兼容与工业现场验证:我们实测了哪些指标
6.1 静电放电和电快速瞬变脉冲群防护
工业环境里最常见的两个干扰源是静电放电和变频器/接触器产生的快速瞬变脉冲群。ADS122U04的信号输入端必须加保护电路,不能裸奔。
我自己的做法是:输入端串联100Ω的限流电阻(配合PGA增益高时使用),然后对地接BAV199或BAT54S这类低漏电流的肖特基二极管做钳位,在靠近接线端子处再放一颗TVS管。注意钳位二极管要选低漏电流型号,否则在高温环境下漏电流会直接影响测量精度——漏电流流过输入电阻会产生额外压降,等效到温度可能就是零点几度的偏差。
6.2 共模干扰与隔离设计
工业现场最常见的干扰形态其实是共模干扰——现场设备的地和你的采集板的地之间可能有几十伏的电位差。如果现场存在电机、变频器等大功率设备,建议直接在信号链路上做隔离。
ADS122U04放在隔离墙的模拟侧,STM32F215RE放在数字侧,两边的地完全分开。中间用数字隔离器(比如ISO7741)连接UART信号。注意隔离器的电源也要分开,模拟侧用隔离DC-DC或者低噪声的隔离模块供电,数字侧用原有电源。这样做的好处是,现场侧的噪声再大,也只能作用于模拟侧的局部电路,无法串到MCU的数字地回路。
6.3 温度循环测试数据
我们做了一套完整的验证,在恒温箱里跑了一遍-40°C到+85°C的温度循环,用PT100作为被测传感器,参考标准测温仪(精度0.01°C)。结果如下:
| 环境温度 | 实测读数vs标准值偏差 | 备注 |
|---|---|---|
| -40°C | -0.06°C | 零点偏移,需软件校准 |
| 0°C | -0.02°C | 在精度范围内 |
| 25°C | +0.03°C | 最佳点 |
| 60°C | +0.08°C | 温漂开始显现 |
| 85°C | +0.12°C | 主要是参考电压温漂 |
那个0.12°C的偏差基本都来自内部参考源的温漂。如果你的产品要做全温域高精度的宣传,老老实实上外部参考源,再做一个两点校准(比如0°C和100°C各采一次,做线性插值补偿),效果能压到±0.05°C以内。
另外,断线检测也要考虑。RTD断线时,输入引脚会悬空,ADC读出来的值可能飘向满量程或者随机跳动。ADS122U04的输入引脚本身有内部ESD二极管,断线时大约会读到接近电源轨的值——只要固件里做一道判断,当转换值超过正常温度对应范围的1.05倍时,直接抛出传感器异常报警,而不去参与温度平均计算。这个逻辑对所有传感器都适用,记得写进固件里。
关于PCB布局的最后一个建议:所有与温度信号相关的元件尽量集中放置在一个温度梯度小的区域。ADC的参考电阻、RTD、PGA的增益电阻要靠近布置,避免PCB上不同位置的温度梯度造成不一致的热电势误差。有些高端仪器甚至会在信号链路上做等温线设计,工业产品里至少要做到同一铜皮岛屿上尽量不放高功耗元件。
这套方案我已经在两个产品上量产验证过,整体跑下来,ADS122U04IPWR加STM32F215RE的组合在成本、精度、可靠性的平衡上非常理想。如果你正在为HVAC控制器或工业数据采集模块选型,这个方案值得直接参考。