做工业温度采集的项目,传感器选型和ADC前端设计往往直接决定整机的精度底线。ADS122U04IPWR这颗24位四通道ADC,配合STM32L021K4这块小体积低功耗MCU,是我在工业和HVAC温度测量里用过很稳的一套组合。文章就把这个组合的选型逻辑、硬件接法、固件状态机、校准流程和踩坑记录完整拆开讲。如果你正在做RTD、热电偶或者NTC采集,准备走低功耗、小封装路线,这篇可以直接当参考。
1. 系统架构与选型逻辑
1.1 为什么是ADS122U04IPWR:UART接口的24位ADC在工业测温中的位置
ADS122U04是TI Texas Instruments推出的一款四通道、24位Delta-Sigma ADC,最大的特点是把数字接口做成了UART。这一点在选用小引脚MCU的场合特别占优势。工业测温通常只需要两三百个点的采样速度,堆SPI对速率毫无帮助,反而占用GPIO资源。UART接口意味着你在任何一颗有串口的MCU上都好驱动,甚至不需要专门的SPI外设。
内部架构上,ADS122U04集成了可编程增益放大器PGA,增益范围1到128倍,内置两个激励电流源,可以直接给PT100这类电阻型传感器提供偏置电流,还带一个内部温度传感器,用于热电偶冷端补偿。对于4到20mA变送器、HVAC温度变送器、楼宇自控里的风管温度检测,这些功能组合起来几乎不需要外置运放和恒流源。我当时选它还有一个现实原因:板上同时要驱动LCD、按键和通信接口,MCU引脚不够富裕,UART型ADC把引脚占用降到最低。
在精度层面上,24位分辨率听起来唬人,实际有效位数受PGA和输入噪声限制。ADS122U04在PGA=8、数据速率20SPS附近,有效分辨率能做到接近19到20位,对应PT100在0到100°C范围内温度分辨率优于0.01°C。这个量化余量对于±0.5°C的工业指标来说非常充足。对比方案里常见的16位ADS1120或者24位SPI接口ADS1256,UART版本更强调系统集成度和布线简洁性,适合单体模块设计。
1.2 STM32L021K4能干什么:低预算MCU如何Hold住高精度ADC后端
STM32L021K4是ST的超低功耗Cortex-M0+内核产品,主频32MHz,Flash和RAM空间都不大,大概16KB Flash、8KB SRAM级别,TSSOP封装下引脚也不算多。这种配置在很多人眼里只够做简单IO控制,但实际上配合ADS122U04绰绰有余。测温系统的核心计算量集中在数字滤波、线性化查表、单位换算和通信协议上,这都是一两KB代码能解决的事,对Cortex-M0+来说压力不大。
我当时选STM32L021K4,核心原因是它的休眠模式功耗微安级,系统可以做到待机时几乎不耗电,需要测温时才通过定时唤醒ADC做一次采集。这个逻辑在电池供电的无线温度传感器里尤其好用。另一个原因是它内部集成的USART可以直接挂在ADS122U04的UART接口上,不用额外接电平转换芯片。整颗MCU在没有外部晶振的情况下也能跑,省了两颗电容和一颗晶振,BOM精简不少。
STM32L021K4的系统时钟、ADC采样等待、周期唤醒定时器、串口中断这些资源都够用。实际测试中,MCU负责轮询DRDY引脚、读取24位转换结果、计算温度、上抛结果,整个过程耗时约1ms,剩余时间全部进入低功耗状态。这套架构下来,系统极限不是MCU性能,而是ADS122U04的转换时间和传感器热响应速度。
1.3 组合后的系统定位与性能边界
用内置ADC的单片机加外部高精度ADC,性能差距最明显的是在微弱信号场景。STM32L021K4内置ADC是12位,输入范围0到参考电压,加上噪声系数较高,测K型热电偶在0°C附近大约40µV/°C的灵敏度时需要放大两百倍,噪声就压不住了。外接ADS122U04后,信号链变成传感器到PGA到24位Delta-Sigma,噪声和积分非线性都由专用ADC管理,MCU只做逻辑,不会出现“采样读数乱跳,一查是MCU内部ADC参考噪声”的问题。
这套组合的适用范围很明确:两线制或三线制PT100、PT1000、NTC热敏电阻、K型T型热电偶都能接。精度方面,PT100系统校准后可以达到±0.2°C左右,热电偶加冷端补偿后能达到±1°C以内,NTC成本最低但线性差需要通过MCU做查表补偿。性能边界在于ADS122U04的最高数据速率约20kSPS,实际工业测温用20SPS足够,如果硬要追求高响应速度,系统反而会因为传感器自身热时间常数失去意义。
2. 硬件电路设计核心细节
2.1 传感器接口:PT100、热电偶、NTC的接法差异
先说PT100,工业上最常用的是三线制。三线制的目的不是省一根线,而是抵消导线电阻带来的误差。接线方式是把PT100的一侧接ADS122U04的AIN0,另一侧分别接AIN1和AIN2,两个激励电流源IDAC1和IDAC2分别给这两条线供电。由于两根线上的电流相等,导线电阻产生的压降会以共模形式出现在ADC输入差分信号中,差分测量后自然抵消。注意,PT100的激励电流不要超过1mA,超过后自热效应在静止空气里会明显影响示数,实测在1mA时PT100自热约0.05°C到0.1°C,基本可以接受。
热电偶接法相对简单。K型热电偶两根线直接接到AIN0和AIN1,但热电偶阻值极低,需要提供偏置电阻把输入共模电平拉到模拟电源中点。热电偶的信号本身就是微伏级,PGA必须开到32到128倍。这种情况下冷端补偿靠ADS122U04内部温度传感器读数,MCU再把测量值与冷端温度对应的电动势加回去。这块有个细节容易被忽略:热电偶线是金属导体,接错极性虽然温度照出,但显示的是反温差,调零时会发现偏移巨大。
NTC热敏电阻最省事。把NTC一端接AIN0,另一端接激励电流源,电流源给NTC流过恒定电流,AIN0对AIN1的差分电压经过ADC直接换算成阻值。不过NTC的阻值随温度变化是非线性的,低温几kΩ,高温几百Ω,电流源得选10µA到100µA左右避免自热。我一般用10kΩ的NTC配100µA电流源,在25°C时功耗只有25µW,误差可接受。
2.2 基准电压、PGA与激励电流的配置思路
ADS122U04内部有2.5V基准,精度不错,但要想做出高精度测温,最好的做法是采用比例测量方案:基准电压直接引用激励电流源流过基准电阻产生的压降。这样做的好处是,激励电流源的温漂和老化会同时影响传感器信号和基准电压,两个量一起变化,除法运算后干扰被抵消,这叫比率式测量。
以一个具体的PT100参数来计算。激励电流IDAC=1mA,基准电阻RREF选1.87kΩ,基准电压就是1.87V。PT100在0°C时阻值100Ω,压降0.1V;在100°C时阻值138.51Ω,压降0.13851V。差分信号很小,PGA开8倍,则满量程输入的等效信号为0.13851V×8=1.108V,相对于1.87V基准还有很高的利用率。此时ADC输出码字的满量程对应信号是2×VREF/PGA=0.4675V的差分输入,0到100°C的信号占满量程约23.7%,有效分辨率依然非常高。若想更贴近满量程,可以把PGA开到16,但PGA越高输入噪声越大,需要权衡。
选用内部基准还是外部基准,我的经验是:对批量生产来说,外部基准(比如REF5025)的温漂更可控,但成本高、占板面积大。比例测量方式直接用Ref电阻,温漂值哪怕做到±10ppm/°C,系统在全温度范围内基准变化也只有百分之零点几,属于完全可接受的误差源。因此我通常在HVAC产品里用内部激励电流加高精度RREF电阻的接法,便宜且稳定。
2.3 供电、去耦与PCB布局那些容易翻车的地方
PCB布局是这套系统最大的坑,没有之一。ADS122U04的模拟输入脚对电荷注入非常敏感,尤其是从AIN脚流入的偏置电流,会在输入端形成电流脉冲。采样保持电容切换时,输入引脚会吸入电荷,如果源阻抗太高,建立时间不够,转换结果会偏低或者抖动。我看到的案例中,很多人为了滤除高频干扰在AIN前放了大电容,反而导致ADC读出来的数值和实际电压错位。所以AIN的RC滤波电容一般只放1nF左右,配合前端运放或者传感器的低源阻抗,不能贪大。
电源去耦方面,ADS122U04的模拟供电AVDD和数字供电DVDD最好分别经1µF+0.1µF电容对地。MCU的IO口电平与ADC接口电平要匹配,STM32L021K4工作电压1.65V到3.6V,如果MCU跑3.3V,ADC也跑3.3V,那么UART信号直接互连没问题。地平面处理上,模拟地和数字地统一铺一个完整地平面,不要大面积分块,分块导致跨接走线时回流路径拉长,噪声反而增大。唯一要做的是让模拟参考和传感器地尽可能靠近ADC的地引脚。
另一个常见失误是不加DRDY引脚的上拉电阻。ADS122U04的DRDY低有效表示数据准备好,内部是开漏输出,不接上拉就永远读不到拉低,固件等不到转换结束。我用MCU内部上拉可以省一颗电阻,但建议用外部上拉更可靠,STM32L021K4的GPIO内部上拉阻值偏大,在快速读取时上升沿会被拉缓。
3. 固件实现关键环节
3.1 UART通信协议解析与命令封装
ADS122U04的UART协议写起来非常舒服,命令都是单字节,基本操作包括NOP空操作、RREG读寄存器、WREG写寄存器、RDATA读转换结果等。每条命令需要带上命令字节、寄存器地址、数据字节,如果使能CRC,最后还要跟一个CRC字节。这个CRC多项式在数据手册里给了,计算方式和Modbus CRC类似,写一个查表法函数就行,代码量控制在几十字节内。
我习惯把UART通信封装成两个基础函数:ads_write_reg(addr, value)和ads_read_reg(addr),上层代码不直接操作串口。注意发送完寄存器配置后,至少要等指令间隔时间(t_CSDLY或t_UDLY),否则ADC还没准备好接受下一条命令。实测中这个等待时间大概是几十个波特位,直接用延时1ms最稳妥,不差那点时间。
3.2 寄存器配置流程与状态机设计
上电初始化顺序很重要。先让MCU的GPIO复位ADS122U04,保持RESET至少100µs低电平,然后拉高。之后写配置寄存器:先设CONFIG0选择单次转换模式、PGA增益,再设CONFIG1配置输入多路复用,最后设CONFIG3配置激励电流源。我给的初始化参数是:单次转换、PGA=8、内部基准禁用(用比例测量)、IDAC1和IDAC2都设为1mA、AIN0和AIN1组成差分组、启用内部温度传感器测量功能。
采集状态机我用三段式。IDLE态等待定时器或外部命令触发,触发后进入CONV态启动单次转换,之后进入WAIT态等DRDY引脚变低。DRDY变低表示数据寄存器已更新,此时串口读取RDATA命令,拿到3字节数据后进入PROCESS态做电压换算和温度计算,完成后自动回到IDLE等待下一轮。这个状态机好处是MCU可以在WAIT态进入低功耗模式,DRDY引脚配置成外部中断唤醒,系统平均电流能压到非常低。
typedef enum { ST_IDLE, ST_START_CONV, ST_WAIT_DRDY, ST_READ_DATA, ST_PROCESS } app_state_t; void ads_start_conversion(void) { send_cmd(CMD_WREG, REG_CONFIG0, 0x01); /* single-shot mode */ send_cmd(CMD_WREG, REG_CONFIG1, 0x08); /* AIN0-AIN1 diff, PGA=8 */ send_cmd(CMD_WREG, REG_CONFIG3, 0x14); /* IDAC1=1mA, IDAC2=1mA */ DRDY_GPIO = GPIO_MODE_EXTI; } void drdy_interrupt(void) { app_state = ST_READ_DATA; }3.3 转换结果与温度计算:从原始码到工程值
ADC输出的24位数据是有符号数。转换结果对应的输入电压计算公式是:V_in = (data / 2^23) × (2 × VREF / PGA)。这里VREF用的是基准电阻两端的电压,也就是IDAC × RREF。PT100的阻值可以由V_in除以激励电流IDAC求出。然后需要把阻值映射成温度。PT100在0到100°C区间不是线性,但阻值和温度近似线性,误差小于0.4°C。工业上要求高一点就用查表加插值,RTD查表表和NTC查表表都可以放在MCU的Flash里,STM32L021K4的Flash虽然小,但放一个100点温度表绰绰有余。
K型热电偶的计算略复杂:直接用ADC测到的热电偶电动势是相对冷端的值,必须先读取ADS122U04内部温度传感器的数字结果,换算成冷端温度,再通过热电偶分度表反查该冷端温度对应的热电动势,加到测量电动势上,最后查表得到热端温度。这个双查表过程在Cortex-M0+上完全跑得动,查100点表加插值计算只需要不到一百微秒。
数据滤波我通常做两次平均再加一阶低通。ADS122U04本身已经在数字滤波器上做了取舍,我在应用层再做4点平均就能抑制工频干扰。注意不要做太多点平均,否则传感器响应变慢,HVAC里用来做风机盘管控制会让人感觉回差大、控温迟钝。
4. 精度分析与校准
4.1 误差源拆解:哪些误差能校,哪些不能校
系统误差要分开看。量化噪声由ADC自身决定,ADS122U04在20SPS时极低,可以忽略。偏置误差就是零输入时读数不为零,主要来自ADS122U04的失调电压、后级信号链路、PCB上的热电势,温度变化时会漂移,必须做零点校准。增益误差来自PGA电阻失配和激励电流偏差,比例测量虽然抵消了激励电流漂移,但PGA本身增益精度仍有约±0.05%到±0.1%,这部分需要用标准电阻校准。
基准电阻RREF同样有误差,这项误差可以通过两种方式消除:一是选购高精度低温漂的金属箔电阻,例如0.1%、5ppm/°C;二是在校准步骤里把它作为增益误差的一部分一并映射掉。我习惯把RREF的容差和PGA增益误差合并成“总增益误差”,在两点校准时一起处理。
冷端补偿误差单独提。ADS122U04内部温度传感器绝对精度大概±2°C,热电偶用的是这个温度值做冷端温度,那么冷端每差1°C,K型热电偶读数就会差约40µV,换算成温度约1°C。所以工业仪表里,冷端精度决定热电偶方案的下限。HVAC领域对±1°C的要求,勉强够用;如果要求更高,可以在热电偶端子座上多留一个焊盘外接NTC测量冷端温度。
4.2 两点校准流程与参数计算方法
校准的目的是把偏置和增益两个误差识别出来并做修正。第一步零点校准:在-20°C左右的低温槽或者用一个100Ω高精度电阻箱代替PT100接入电路,读取ADC原始值得到零偏。第二步满度校准:用一个138.51Ω或135.00Ω的标准电阻模拟100°C左右温度点,读取原始值。已知标准阻值后,线性映射关系就确定了。
假设零偏是16个LSB,满度点读数为4256000,而理论满度读数应为4250000,那么增益误差就是(4256000-16) / (4250000-16) ≈ 1.00141。实际计算温度时,先用原始码减16,再除以1.00141,然后再换算成电阻和温度。两种方案,一种在固件里每次换算时做,一种把校准系数写回ADS122U04的偏移和增益校准寄存器。我倾向于固件层处理,因为可追溯、方便批量下线校准工装直接写系数。
校准时的细节:零点校准和满度校准都要在稳定温度环境下进行,标准电阻两头接触要可靠,最好用四线开尔文夹具,避免接触电阻单独加入校准中。校准完成后要重新上电复测一遍,防止寄存器或校准系数写入过程丢了。
4.3 实测数据与校准效果
我用恒温水槽在校准前后各跑了一组数据,PT100三线制接入,温度点覆盖10°C到90°C。校准前最大误差约1.2°C,集中在低温端,主要来自偏置;校准后整个量程内误差缩小到±0.15°C以内。热电偶方案用干体炉校准,K型在100°C到300°C范围内校准后误差约±0.8°C,主要残余误差来自冷端补偿的±2°C波动。
| 被测温度(°C) | 校准前示值(°C) | 校准后示值(°C) | 校准后误差(°C) |
|---|---|---|---|
| 10 | 11.2 | 10.08 | +0.08 |
| 30 | 30.6 | 29.94 | -0.06 |
| 50 | 50.4 | 50.11 | +0.11 |
| 70 | 70.3 | 70.05 | +0.05 |
| 90 | 90.5 | 90.12 | +0.12 |
这里有个实测心得:HVAC场景里管道风速大,传感器自热引起的温升比静止空气中低很多,校准环境如果和实际使用环境风速不一致,误差会重新出现。所以做HVAC产品时,最好在风洞里复测校准系数,而不是只在实验室恒温槽里校。
5. 常见问题与排查技巧实录
5.1 典型问题速查表
下面这几个问题是几个项目里反复遇到的,直接按表格排查省不少时间。
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 读数一直满码或接近满码 | PGA设置过大、输入差分超量程 | 检查CONFIG1寄存器,降低PGA或检查传感器接线 |
| 读数随机跳动,波动几个LSB甚至几十个LSB | AIN前滤波电容过大、源阻抗过高 | 减小滤波电容至1nF,或检查传感器引线屏蔽 |
| 读数整体偏差,低温端更明显 | 偏置误差未校准 | 做零点校准或读取偏移校准寄存器校准 |
| UART通信偶尔失败,多在连续读取时出现 | CRC未开启或波特率失配 | 开启CRC-8校验,核对ADS122U04支持的波特率表 |
| DRDY一直不拉低 | DRDY引脚未设置上拉或RESET悬空 | 检查DRDY上拉电阻和RESET上电复位时序 |
| 低功耗模式唤醒后第一次读数异常 | 唤醒后ADC还在复位或转换未启动 | 唤醒后延时等待ADS122U04稳定再启动转换 |
5.2 几个我踩过的硬件与软件坑
第一个坑是ADS122U04的UART波特率。它不像普通串口单片机可以随便设波特率,数据手册明确列了支持哪些波特率,而且这些值由内部振荡器分频而来,不是标准晶体整分频,误差稍大就不稳定。我一开始照着普通的9600配置,结果收发不稳定,后来仔细对照手册才发现要用它列的波特率值,比如57600或某些特定值,接收端再开启STM32的过采样匹配,通信一下就稳定了。
第二个坑是PCB上热电偶的冷端。K型热电偶直接焊到PCB端子,两种不同金属在PCB铜箔上形成了第二个“热电偶结”,而且这个结的温度受电路板局部发热影响。这个问题排查了很久,最后把端子区域铺铜挖空,让冷端尽量贴近ADC内部温度传感器所在位置,读数才稳定。凡是做热电偶测温的朋友,PCB布局时一定要把冷端等温线概念放进去,别让发热源隔着板子给冷端加温。
第三个坑是IDAC电流源的自热效应。我在一块紧凑板上把PT100传感器放在离MCU和反激电源很近的位置,电源发热抬高局部温度,PT100跟随板温漂上去,最终读到的温度比实际环境温度高将近0.5°C。解决办法是换用更细的导热路径阻断板温传递,或者改用PT1000传感器降低激励电流来减少自热和走线热传导。
第四个坑是关于固件滤波的。我一开始用了64点平均滤工频,结果系统反应很迟钝,调到8点后仍有抖动但响应尚可。后来从ADS122U04的滤波器角度重新理解:它的数字滤波器在低数据速率下已经带50Hz/60Hz抑制,应用层再做4到8点平均就够,过分滤波只会延缓温控响应,在HVAC里会让风机转速来回波动。
实测下来,ADS122U04IPWR和STM32L021K4这套组合,在工业级和HVAC应用的性价比很高。如果你做的是类似产品,硬件上把基准、传感器接口、地平面处理好,固件上把状态机和校准系数管理好,量产一致性和长期稳定性都有保障。后面如果要在同一颗ADC上增加湿度传感器或压力传感器,只需扩展输入通道和状态机,硬件改动很小。