ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ADS122U04搭配STM32F407ZG:高精度多通道温度采集方案

ADS122U04搭配STM32F407ZG:高精度多通道温度采集方案

做HVAC控制器和工业温度采集的老兄弟们,应该都有过这种体验:测温点数一多、现场干扰一大,普通12位或者16位ADC根本压不住,读数在屏幕上跳来跳去。工业现场动不动就是热电偶、PT100,信号本身就是微伏级别,没有高分辨率、带可调增益的模拟前端,后端的滤波算法写得再漂亮也白搭。ADS122U04IPWR这块四通道24位Delta-Sigma ADC配上STM32F407ZG,是我在好几个项目里反复验证过的组合,专门用来啃工业和HVAC温度测量这块硬骨头。

ADS122U04IPWR最特别的地方,是把数据接口做成了UART。你没看错,24位ADC不用SPI也不用I2C,而是用异步串口通信。这在HVAC主控板上有个很现实的好处:很多MCU的SPI口已经被Flash、LCD、外部EEPROM占满,I2C又被一堆传感器和存储芯片占用,反而是UART资源最富裕。STM32F407ZG有六个USART,随便匀一个出来就能跟ADC通信,PCB走线也简单,两根线搞定,不抢稀缺的外设资源。这套方案既能测K型热电偶、PT100/PT1000,也能直接挂NTC热敏电阻,非常适合多通道、长周期、抗干扰要求高的场景。

写这篇东西的初衷,是我自己在这条路上踩了不少坑,从UART握手失败到测温值漂移,再到现场电磁干扰导致数据乱跳,每个问题都翻过数据手册、查过社区、反复试过电路才解决。整理出来给正要选型或者正在调这块芯片的朋友做个参考,省得在同一堵墙上撞第二次。

1. 方案选型思路:为什么是ADS122U04加STM32F407ZG

1.1 HVAC和工业测温的真实痛点

HVAC系统听起来简单,无非是温度、湿度、风阀、水阀、压缩机,但真正落地做主控板的时候,痛点很具体。送风温度、回风温度、盘管温度、室外环境温度,一个控制器至少要接四五个温感点。这些传感器可能分布在几十米长的线路上,从配电柜走到风道、水管、室外机。普通MCU内置的12位ADC在这种场景下根本不够看,满量程参考电压3.3V除以4096,一个LSB就是0.8mV左右。对于NTC热敏电阻来说,0.8mV对应好几度的温度误差,这还没算走线引入的噪声和参考电压的温漂。

工业过程测温就更苛刻了。用热电偶测锅炉排烟温度或者压缩机排气管温度,热电势本身就只有几十微伏到几十毫伏。举个例子,K型热电偶在500°C时输出大约20.6mV,如果ADC的噪声是几十微伏,温度误差还能控制在零点几度;但如果噪声到了毫伏级别,温度误差直接飙到几十度,完全没法用。在这种场景下,就需要一个高分辨率、低噪声、带可编程增益放大器的模拟前端,把微伏级的信号先放大,再交给高位数模转换器去数字化。

1.2 ADS122U04IPWR 在这套方案里的定位

ADS122U04IPWR本质上是一款四通道、24位精度的Delta-Sigma型ADC,内部集成了低漂移参考电压源、可编程增益放大器(PGA)和两个匹配的可配置电流源。它最大的亮点在于内置了完整的温度测量链路:PGA可以把热电偶信号放大32倍甚至128倍,内部2.048V基准源不需要外挂高精度参考芯片,两个电流源可以直接驱动PT100进行比例式测量,还有故障检测功能用来判断传感器是不是断线或者短路。

这颗芯片的输入多路复用器可以从四个模拟输入通道里任意选择差分或单端组合,意味着一个芯片就能覆盖四个测温点。对于一块典型的HVAC主控板,基本就是一片ADS122U04搞定送风、回风、盘管、室外四个温度采集,不需要为每个通道单独配信号调理电路,物料成本和PCB面积都省得很明显。

UART接口的价值在系统层面体现得更充分。常规的SPI接口ADC虽然有很高的吞吐率,但SCLK、MOSI、MISO、CS四根线都要占用MCU引脚,且SPI从机还需要片选信号做通道区分。I2C接口虽然省线,但速度慢、地址冲突问题也多。UART是一种异步接口,不需要额外的时钟线,任何一颗MCU都有现成的串口外设可以挂,更适合这种多传感器分散布置、对实时性要求不那么苛刻的应用场景。

1.3 为什么搭配 STM32F407ZG

STM32F407ZG是ST的经典Cortex-M4芯片,主频168MHz,Flash 1MB,RAM 192KB,在工业控制板上可以说是“万金油”级别的存在。选它不是因为算力有多猛,而是外设资源实在太齐:六个USART、三个SPI、三个I2C、两个CAN、上百个GPIO。做HVAC控制器,既要跑触摸屏显示,要控制风机、水泵、压缩机,还要处理Modbus通信,又要兼顾温度采集,F407的资源刚好全部兜住。

更重要的是,STM32F407的USART支持单线半双工模式。ADS122U04的UART接口本身就是半双工协议,DIN和DOUT可以共用一个引脚组,F407把USART配置成半双工之后,只用一根数据线就能完成和ADC的全部通信,连方向切换都交给硬件外设处理,省去了软件模拟的麻烦。配合DMA做数据搬移,即使主循环里在跑显示刷新或者Modbus报文解析,温度采集也不会被卡住。

2. 硬件设计与连接细节:电路板上不能省的功夫

2.1 引脚分配与最小连接方案

ADS122U04IPWR是TSSOP-16封装,引脚不算多,分布也很清晰。模拟部分有AVDD、AVSS(或者接地)、四个模拟输入通道AIN0到AIN3、参考电压输入REFP0和REFN0;数字部分有DVDD、DIN、DOUT、DRDY、RESET。在开始画板之前,先规划好和STM32F407ZG的连接关系,我习惯的做法是先列一张引脚对照表。

信号功能ADS122U04引脚STM32F407ZG引脚说明
半双工数据线DIN / DOUTPA9(USART1_TX)STM32单线半双工模式下PA9复用为双向数据线
数据就绪DRDYPC0下降沿表示新的转换结果可用
硬件复位RESETPC1低电平有效,默认上拉
模拟电源AVDD3.3V经过磁珠单独LC滤波后供电
数字电源DVDD3.3V与MCU同源即可
参考电压正端REFP0悬空或接内部参考使用内部2.048V基准时不接

实际走线的时候,DIN和DOUT连接在一起接到STM32的PA9上。如果没有启用STM32的硬件半双工模式,就需要一个GPIO控制方向,发送数据的时候把DOUT禁用,接收数据的时候把DIN拉低,这套逻辑我也用过,多花一个GPIO而已,也能稳定工作。DRDY引脚建议接到MCU的外部中断引脚,在中断里置位一个标志位,主循环检测到标志再发命令读数据,这样不会错过转换完成的事件。

2.2 电源、基准与去耦策略

ADS122U04的模拟供电和数字供电虽然是独立引脚,但内部参考电压的稳定性直接决定测温精度。理想的供电方案是:从系统的3.3V先经过一颗磁珠或者小阻值电阻,再接一个10uF钽电容和0.1uF陶瓷电容做并联滤波,给AVDD供电。DVDD可以走常规的3.3V供电,同样在靠近引脚的位置放置0.1uF去耦电容。

内部参考电压的初始精度典型值是0.2%左右,温漂系数大约是30ppm/°C。这个参数对绝大多数HVAC和工业应用已经足够。如果项目要求更高精度,可以换成外部参考电压,从REFP0和REFN0引脚接入。使用内部基准时还有一个好处:省去了参考源芯片的成本和面积,在高低温循环环境下,内部基准的温漂特性是经过出厂校准的,一致性比外挂的基准芯片更可控。

关于去耦还要多说一句:ADS122U04的Delta-Sigma调制器对电源噪声比较敏感,高频成分会直接折回基带影响测量精度。所以模拟电源走线要细且短,AVDD引脚旁边的0.1uF电容必须紧贴引脚放置,不能用长走线把电容拉远。我在第一版PCB上就吃过这个亏,电容放得远了10毫米,实测噪声响应明显变差。

2.3 传感器前端设计:热电偶、PT100和NTC

ADS122U04的前端接口可以适配几乎常见的温度传感器类型,但前端电路的结构完全不同,需要根据传感器种类做针对性的设计。

热电偶:热电偶输出的是微弱直流电压,按100倍增益设计,满量程约2.048V / 100 = 20.48mV,对应K型热电偶大约500°C的量程,足够覆盖常规工业应用。热电偶信号到达ADC之前,需要加一个射频干扰滤波器,典型做法是在PGA输入端串联电阻并接高频滤波电容。数据手册建议在AINx引脚和地之间放置一个1nF陶瓷电容,配合输入端的10k电阻形成低通滤波,既抑制高频干扰,又不影响直流信号精度。

PT100/PT1000:这类RTD传感器需要恒流源激励。ADS122U04内置两个匹配电流源(IDAC),可以直接输出250uA、500uA、1mA等档位的激励电流。测量PT100最经典的做法是比例式四线制接法:一个IDAC电流流过PT100和一颗精密参考电阻,参考电阻两端的电压同时作为ADC的参考电压,这样电流源的绝对精度误差和温漂会被完全抵消。没有四线条件时,三线制接法也可以纠正一部分线阻误差。

NTC热敏电阻:HVAC里大量使用的是10kΩ、B值3380或3950的NTC。NTC方案最简单,把NTC和一颗精密电阻串联分压,分压点接到ADC输入,ADC参考电压直接用内部2.048V,然后用B值公式反算温度。不过NTC的非线性很严重,100°C以上的区间测量误差会变大,优点是便宜、响应快、走线长一点也能忍受。

3. 固件侧的关键操作:初始化与数据读取

3.1 ADS122U04 的 UART 握手机制

很多人在ADS122U04上翻车,不是传感器电路设计问题,而是UART怎么都“叫不醒”这颗ADC。ADS122U04的UART不是普通的那种一上电就能发数据就能收的串口,它带自动波特率检测机制。MCU上电后必须先执行一次同步序列,ADC才能锁定波特率进入正常通信状态。

同步序列的操作方法是:先把RESET引脚拉低再拉高,让ADC复位;然后MCU发送一个0x60字节,紧接着发送0x00字节。ADS122U04收到0x60之后会识别为同步请求,再收到0x00后确认波特率,此时从机会回一个响应字节。从这以后,通信就进入正式状态,后面每一次命令都由地址字节加命令字节加数据组成。

我实测过,同步之后如果中间超过一定时间没有通信,ADC会自动进入休眠,下一次通信需要重新同步。所以在固件里最好封装一个“确保唤醒”函数,每次发命令之前检查芯片状态,如果通信异常就重新执行同步序列。这一步看着不起眼,却能把现场偶发的通信丢失问题降低一个量级。

3.2 寄存器配置要点

ADS122U04的配置寄存器一共有4个,所有工作参数都通过它们设定。芯片上电后的默认配置是内部基准开启、连续转换模式、增益为1,这显然不能满足温度测量的需要,所以在初始化阶段必须显式写入寄存器。

寄存器配置功能本文推荐配置
REG0输入多路选择、PGA旁路、增益档位根据通道选择AIN0~AIN3,PGA开启,增益按传感器类型设置
REG1数据速率、滤波器模式20SPS或50SPS,配合工频抑制
REG2转换模式、基准源选择、电流源设置连续模式,内部2.048V基准,IDAC按需开启
REG3IDAC输出通道、故障检测使能按传感器接法设置对应IDAC输出通道

以测热电偶为例,写入REG0把输入通道选为AIN0正输入、AIN1负输入,增益设为32倍,REG1里数据速率选20SPS,数字滤波器会自动处理掉一部分50Hz工频干扰。对于PT100比例式接法,REG2里打开250uA电流源,REG3里把IDAC1配置到AIN2通道。所有这些位的具体取值,最终都得以ADS122U04数据手册里的寄存器映射表为准,我在这只给配置思路,因为不同固件版本和传感器接法会造成每位取值组合不同。

3.3 STM32F407ZG 端 UART 配置与代码实测

STM32F407ZG自带的USART支持单线半双工模式,HAL库里直接用HAL_HalfDuplex_Init初始化。波特率设置成115200、8位数据、无校验、1位停止即可,这个参数要在ADS122U04的自动波特率检测支持范围之内。

/* 初始化USART1为半双工模式 */ UART_HandleTypeDef huart1; huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_HalfDuplex_Init(&huart1);

初始化完成之后,写一个通信同步函数。函数里按顺序调用HAL的发送接口,把同步字节发出去,然后等待ADC的应答。根据TI的数据手册说明,同步序列的正确操作是先送0x60,再送0x00,之后从机返回应答,然后才进入正常的命令收发。

uint8_t ads122u04_sync(void) { uint8_t sync_word[2] = {0x60, 0x00}; uint8_t resp = 0; HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_RESET); HAL_Delay(2); HAL_GPIO_WritePin(RESET_GPIO_Port, RESET_Pin, GPIO_PIN_SET); HAL_Delay(2); HAL_UART_Transmit(&huart1, sync_word, 2, 100); HAL_UART_Receive(&huart1, &resp, 1, 1000); if (resp == 0x00) { return 1; } return 0; }

读写寄存器也遵循同一套帧结构。发送地址字节(从机ID为0x00)、写寄存器命令字节、寄存器地址和数据,然后等待从机应答。下面的代码是伪代码示意,具体命令字节编号请对照数据手册的UART命令表,我在项目里是逐位核对过再写入的。

static void ads122u04_write_reg(uint8_t reg, uint8_t value) { uint8_t cmd[4] = {0x00, WRITE_REG_CMD, reg, value}; HAL_UART_Transmit(&huart1, cmd, 4, 100); HAL_Delay(5); }

配置完寄存器后,在DRYD引脚的下落沿中断里置一个标志位。主循环检测到标志,通过UART发送读取数据命令,从返回的24位数据里提取转换结果。使用DMA方式接收能进一步降低CPU占用,但就不在本文展开了,基础轮询方式在四个通道20SPS数据率的情况下完全够用。

4. 温度换算与校准:从码值到准确的温度

4.1 原始码值换算电压

ADS122U04的转换结果是24位有符号数。单极性模式下满量程对应从0到2.048V,双极性差分模式下满量程对应从负参考电压到正参考电压。温度采集通常使用双极性模式理解更直观。

换算公式很简单:电压 = ADC原始码值 × 满量程电压 / (增益 × 2^23)。以内部基准2.048V、增益32倍、K型热电偶为例,一个LSB对应的电压大约是2.048 / (32 × 8388608) ≈ 7.6nV。这个分辨率级别的噪声底,对热电偶测量来说已经是“杀鸡用牛刀”了。

写代码时要注意,原始码值是带符号数,直接强转成float之前先判断正负或者使用标准库的转换方式,防止符号位被扩展成噪声。

4.2 热电偶冷端补偿与线性化

热电偶本身测量的是热端和冷端的温差,输出的是热电势。想要得到绝对温度,必须先知道冷端(也就是热电偶和PCB接线端子接触点)的真实温度。这一步在HVAC控制器里最容易忽略:很多人以为把热电偶信号放大就能直接读数,其实冷端温度只要偏1°C,最终温度就偏1°C,根本绕不开。

冷端补偿的温度来源可以用板上NTC,也可以用ADS122U04内部集成的温度传感器。ADS122U04内部温度传感器的精度在出厂校准下大约能到±0.5°C左右,作为冷端补偿源是够用的。代码里先把内部温度传感器的转换结果读出来,换算成冷端温度,再用查表或者多项式方法把热电偶的电动势换算成温度。

K型热电偶的线性化可以选择查表法或者NIST多项式。查表法占用Flash空间大但查找速度快,多项式法代码量小、计算连续性好。我实际用的是分段三次多项式拟合,精度能控制在±0.1°C以内,而查表法分段数足够多时可以达到同一水准。

4.3 PT100/NTC 的换算与标定

PT100的比例式测量不需要考虑基准电压绝对精度,只需要知道参考电阻的阻值。固件里同时采集PT100通道和参考电阻通道的码值,PT100的阻值等于参考电阻阻值乘以两个码值的比值,这个比例式结构把激励电流的温漂误差直接消掉了。有了阻值,再用PT100的分度表或者Callendar-Van Dusen公式反推温度。

NTC的换算比较直接。10kΩ B值3950的NTC,先根据分压电路公式算出NTC当前阻值,再用B值公式计算温度。B值公式是:1/T = 1/T0 + (1/B) × ln(R/R0),其中T0通常取298.15K,R0是25°C下的标称阻值。注意B值公式在0~70°C区间精度尚可,超过这个范围误差明显增大,需要更高精度时得用Steinhart-Hart方程,通常需要三个标定点确定三个系数。

标定这块,我的建议是千万不要只信任传感器的标称参数,同一批次的NTC和PT100差异都不小。量产前的标定至少要做两个温度点,一个接近低端,一个接近高端,再通过软件校准参数修正增益和偏置误差。ADS122U04内部基准的初始误差也最好通过校准消除掉。

5. 工业现场的经验:噪声、布线与防护

5.1 PCB布局布线的关键细节

ADS122U04作为高精度ADC,对PCB布局的敏感度远高于普通数字芯片。模拟输入走线要远离数字信号线,尤其是DRDY、UART这样频繁翻转的信号线,否则串扰会直接进入模拟前端。我在一块板上犯过错,把AIN0输入走线从USART时钟下方穿过,结果测温数据在串口发送数据时出现规律性跳动,改走线后才恢复。

模拟地和数字地在布局上要做单点连接。ADS122U04这类Delta-Sigma ADC内部有完整的模拟数字隔离,外部只需要在芯片下方做一个0欧电阻或者一个磁珠连接模拟地和数字地,避免地环路电流干扰模拟信号的参考地。如果系统里还有大电流驱动的继电器或PWM控制的加热器,地线切割就更加必要。

电源平面和去耦电容的位置也同样重要,AVDD的走线必须从磁珠输出点单独引出,不能和其他数字模块共用一小段走线再滤波,否则高频噪声还是会通过公共阻抗耦合进模拟电源。

5.2 长线缆与抗干扰处理

HVAC控制器经常把温度传感器放在距主板几米到几十米的位置。工业现场变频器、接触器、风机电机启动时,线缆会感应出很强的共模噪声。应对措施主要有三个方向:传感器线缆选择屏蔽双绞线,屏蔽层单端接地;信号进入PCB后增加共模滤波网络;以及利用ADC的PGA和数字滤波器把噪声抑制掉。

实测下来,在传感器输入端面对地并联一个1nF左右的电容,能有效旁路射频干扰。对热电偶这种毫伏级信号,加RF滤波电容是数据手册明确建议的做法。对于PT100这种电流激励的传感器,因为信号本身相对较大,抗干扰能力稍好,但仍建议使用屏蔽线。

长线缆还有一个容易被忽视的隐患:雷击或者浪涌事件会通过传感器线缆进入主控板。如果产品需要做真正的工业认证,传感器输入端必须加TVS管和限流电阻。TVS管的结电容不能选太大,否则会影响模拟信号的建立时间,一般选几十皮法级别的就够了。

5.3 电源与隔离设计

我的经验是,HVAC主控板的24V或12V电源会带出很多噪音。如果ADC直接用DC-DC输出的3.3V供电,很难压住纹波。合理的设计是:先从系统电源经过一级DC-DC降到5V或3.6V,再用低压差线性稳压器LDO降到3.3V,单独给模拟部分供电。LDO的电源抑制比能显著削弱高频纹波,比单纯依赖MCU板载3.3V稳压要靠谱得多。

如果控制器还要控制水泵、压缩机这类大功率负载,最好把ADC和MCU的数字部分做成完整的隔离地。ADC的数字输出通过数字隔离器之后再进MCU,隔离器两侧分别使用不同的地平面。这样的结构虽然多花几十块钱的物料成本,却能换来温度的稳定性和整个系统的抗干扰能力,在工业控制产品上完全值得。

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

6.1 UART通信异常排查

ADS122U04最典型的调试问题就是通信不上。我归纳出三种常见原因。

第一种是同步序列没做或者顺序乱。ADS122U04要求先拉复位、再发0x60、后发0x00,然后才能开始正常通信。如果省略同步直接发寄存器命令,芯片会完全没反应。解决方法是上电后固定执行一次完整同步流程,并且在长时间不通信之后重新执行。

第二种是波特率不匹配。STM32的USART时钟树配置错误会导致实际波特率和目标波特率偏差超过2%,就容易超过自动波特率检测锁定的容差。排查时用示波器抓UART引脚波形,量一下一帧数据的实际时间,就能快速判断是否为波特率问题。

第三种是物理连接不当。半双工模式下DIN和DOUT的连接方式和GPIO方向控制设置不对,或者单片机发送期间从机应答线上发生电平冲突,都会导致通信失败。建议先把两个引脚完全独立接好,用示波器分别观察发送和应答信号,确认相位正确后再切换成半双工模式。

6.2 数值跳动与漂移的排查方法

如果通信正常但读取的数值不稳定,问题大概率不在固件而在硬件。常见表现有两种:一是数据始终在一个小范围内快速跳动,二是数据随温度或时间缓慢漂移。

快速跳动多半是参考电压不稳定或者地平面噪声过大。用示波器看AVDD引脚上有没有高频毛刺,看传感器输入线附近有没有数字信号串扰。我的经验是先在AVDD引脚加一颗100nF电容,往往能立竿见影。如果还不行,就要查PGA输入端是否有高频耦合,适当增加RF滤波电容试试。

缓慢漂移则是激励电流或参考电阻温漂问题。PT100比例式接法下,参考电阻的温漂系数必须足够低,在HVAC环境里全年温差可能超过60°C,一颗普通贴片电阻的温漂就能造成明显的温度漂移。推荐使用25ppm/°C以下的薄膜电阻,有条件的话用金属箔电阻更好。IDAC电流源本身的匹配度在数据手册里有指标,只要用的是同一电流源做激励和参考,比例式测量对电流源的温漂是免疫的,这一点在选型时要特别留意。

6.3 为调试生产准备的几个小技巧

最后分享几个我在量产和现场维护阶段积累的经验。

第一,产品的最终校准数据最好和ADC原始码值一起保存。如果只保存温度值,后面出现一致性偏差时就没有办法溯源是哪一段链路误差造成的。保存原始码值加校准参数还有一个好处,就是可以把不同批次传感器的差异统一收敛在软件校准层。

第二,给ADC的电源轨预留一个测试点。现场排查时,用万用表量一下AVDD的实际电压和纹波,能快速区分供电问题和传感器问题,不用每次都怀疑芯片。

第三,DRDY信号一定要拉出来。就算量产版本不焊这根线,PCB上也要预留测试焊盘。调试时把示波器挂在DRDY上,能直接看到转换节奏是否正常。我曾经碰到过寄存器配置把ADC配置成单次模式,主循环却按连续模式的节奏读数据,温度曲线始终对不上,最后就是靠观察DRDY波形才发现问题的。

这套ADS122U04加STM32F407ZG的方案,目前已经在我参与的HVAC控制器项目里跑了一年多,现场测温稳定性和精度都经受住了夏季高温和冬季低温的考验。如果你正在做类似的多通道温度采集系统,我强烈建议直接照着这个链路搭一套最小验证板,先把同步和寄存器通信跑通,再去纠结传感器前端和校准细节。相信我,把最基础的数据链路吃透,后面的路会顺畅得多。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进