☰
ADS122U04+STM32F215ZG:HVAC高精度温度采集方案与抗干扰实战
2026/11/5 1:03:29 网站建设 项目流程

做HVAC控制器这些年,我一直觉得“测个温度”是看着最容易、做起来最坑的事。风机盘管出风温度、冷水机组的一二次侧水温、压缩机的排气温度,这些点位不仅能决定一台机组能不能跑出标称能效,还必须在变频器、接触器、水泵这些强干扰源旁边保持稳定。最近我在一套工业级温控板里用的方案是ADS122U04IPWR配合STM32F215ZG,一个是带UART接口的24位ΔΣ型ADC,一个是资源充足的Cortex-M3主控,正好把“远距离可靠传输”和“高分辨率采样”这两个老问题一次解决。这篇文章就把整个方案的选型逻辑、硬件计算、软件实现和踩坑记录完整梳理一遍,给同样在工业或HVAC场景里做温度采集的朋友做个参考。

我先把话放前面:这个组合不是为了炫硬件,纯粹是被实际需求逼出来的。工业现场和商用空调机房里的传感器离控制器动不动就是几米甚至几十米的线缆,电机变频器的开关噪声、压缩机的启停浪涌、还有24V电源线上的共模干扰,随便一个都能让普通的12位ADC读数抽搐。而ADS122U04IPWR本身就是专门为低速高精度传感器设计的家伙:24位分辨率、内置可编程增益放大器、两路可配置恒流源,还省掉SPI那几根同步线,直接用UART和主控通信。STM32F215ZG这边跑数据换算、滤波、通信协议栈,算力绰绰有余。这套架构做下来,常温段实测温度稳定度能做到±0.1°C以内,抗干扰能力也经过了现场验证。

1. 方案选型:为什么是ADS122U04加STM32F215ZG

1.1 24位ΔΣ ADC在温度测量里到底解决了什么

先说一个反常识的事实:STM32F215ZG内置的那三个12位ADC,性能其实不差,在精心设计的条件下有效位数能做到11位上下。问题是11位分辨率放在测温上太尴尬了。如果我们把0°C到100°C的满量程分配到11位里,一个LSB大约对应0.05°C到0.1°C。这在HVAC上还不够,因为大型冷水机组的一次侧供回水温差设计值往往只有5°C到8°C,温差每偏0.1°C,热交换量计算就会差好几个百分点,能效评估和费用分摊都会跟着错。

温度传感器本身的信号又非常微弱。PT100在0°C时只有100Ω,用1mA恒流激励,满量程信号也就是几十毫伏到一百多毫伏。要把它放大到适合12位ADC参考电压的量程,对模拟前端的要求极高。而ADS122U04IPWR走的是另一条路:它本身就是24位ΔΣ结构,内部集成PGA,放大和量化在芯片内部一次完成,外部电路只需要提供传感器激励、参考电阻和滤波电容。这样一来,主控内置ADC那套“运放+精密电阻+硬件滤波”的前端设计全部省掉,精度反而上一个数量级。

1.2 ADS122U04IPWR的核心参数拆解

这颗芯片我从选型到画板再到现在批量调试,参数基本都过了一遍。几个对HVAC选型最关键的硬指标,我整理成了表格,方便直接对照。

参数ADS122U04IPWR 典型值对温度测量的意义
分辨率24位,ΔΣ架构码值跨度大,0.001°C量级的变化可分辨
输入通道4路复用(2路差分或4路单端)一片就能挂多路RTD/NTC
内置PGA增益1~128倍可调小信号不用外置运放
恒流源两路IDAC,10µA~1.5mA共8档直接给RTD/NTC提供激励
参考电压内置2.048V,也可外部参考支持比例测量,抑制温漂
数据速率20 SPS到4000 SPS级别20 SPS可同时抑制50/60Hz工频
通信接口UART,最高460.8 kbps量级隔离简单、远距离传输稳
供电2.3V至5.5V单电源可和主控共用3.3V或5V
封装TSSOP-20(PW后缀)手工贴片和回流焊都方便

需要特别指出的就是“20 SPS”这个档位。ΔΣ调制器的数字滤波器在20 SPS数据率下,陷波点正好压在50Hz和60Hz上,能同时抑制两种工频干扰。这在商用空调和工业现场简直是量身定做——中国50Hz、东南亚和美洲部分设备用60Hz,同一个固件出口到哪都不用改滤波策略。后面软件部分我还会强调这个选择。

1.3 为什么没选SPI接口的同类ADC

ADS1220这个芯片大家可能更熟,它跟ADS122U04几乎是同门亲兄弟,就差别在通信接口:ADS1220是SPI,ADS122U04是UART。既然主控资源够,为什么还选UART版本?这是我在原理图阶段反复权衡过的。

第一是隔离成本。工业HVAC控制柜里,传感器线缆从动力侧拉过来,为了安全和抗干扰,模拟部分和主控数字部分之间经常要加拉隔。隔离一个UART只需要两颗数字隔离芯片或者两个光耦,正反两根信号线;而SPI要隔离至少四根线(CS、SCLK、DIN、DOUT),还得处理SCLK高速翻转带来的隔离电源纹波。第二是远距离布线,UART对信号沿的抖动容忍度大,线径合适的情况下走一两米没问题,SPI在长线上高频时钟容易出毛刺。第三是主控侧资源占用,UART配合DMA几乎不占CPU,SPI在主从模式下还得靠主控持续输出时钟,24位数据要卡在时序里读完,对中断响应要求高。

1.4 STM32F215ZG在这里扮演什么角色

很多人觉得F215ZG用在这里大材小用,其实它的定位是“把整个测控板变成立方体”。Cortex-M3跑到120MHz,1MB Flash、128KB RAM,外设里有6路UART/USART,这意味着一块板上可以同时挂6片ADS122U04,扩展出24路高精度温度通道,主控即使跑着MODBUS协议栈、做PID运算,CPU占用率还是很低。F215ZG的FSMC、以太网MAC这些资源以后如果要把温控板升级成小型数据网关,也不用换主控。我在选型时把主控的UART资源当作“可扩展传感器端口”来用,而不是当作调试串口,这思路在架构设计上非常划算。

这套方案的边界我心里也有数:它适合0.1Hz到几十Hz的低速高精度测温,不适合高频振动测量或需要微秒级响应的场合。传感器信号变化快不过ΔΣ的建立时间,出了问题只能靠滤波和时序管理,别拿它当示波器用。

2. 硬件设计:决定精度上限的从来不是那颗ADC

2.1 传感器先选对:PT100、PT1000还是NTC

相同的ADC前端,挂不同传感器,结果天差地别。HVAC领域最常见的三个选择是PT100、PT1000和10k NTC热敏电阻,我把它们的脾气摸得很透。

传感器0°C阻值灵敏度/线性度自热风险使用场景
PT100100Ω0.385Ω/°C,线性好低,1mA激励仅0.1mW工业管道、冷水机组关键点
PT10001000Ω3.85Ω/°C,线性好中高,需控制激励电流商用HVAC、盘管、风道
NTC 10k10kΩ约400Ω/°C,高度非线性中,阻值高更敏感大批量低成本电子温控

实际项目里,商用空调风柜更偏爱PT1000,因为阻值高,线缆电阻相对占比小,两线制接法也能凑合;工业侧则偏爱PT100,因为标准成熟、批量互换性好。NTC虽然便宜,但每个型号的Steinhart-Hart系数都不同,老化漂移也比较头疼,我一般只在精度要求±1°C的消费级产品里用它。设计开始前定好传感器类型,后面ADC的PGA增益、IDAC电流、参考电阻全都要跟着算,别想着“兼容所有传感器”一步到位,那样精度会牺牲得很厉害。

2.2 比例测量原理:为什么IDAC电流漂移不用怕

ADS122U04做测温最漂亮的一点,是它原生支持比例测量(ratiometric)。通俗解释一下:用芯片自己的IDAC恒流源去激励RTD,同时让同一股电流也流过一颗精密参考电阻R_REF,ADC的比较基准不是内部2.048V,而是这颗参考电阻两端电压。

推导过程很简单。设激励电流为I,RTD电阻为R_RTD,参考电阻为R_REF,PGA增益为G,那么差分输入电压就是:

V_IN = I × R_RTD

参考电压是:

V_REF = I × R_REF

ΔΣ ADC的输出码值和 V_IN × G / V_REF 成正比,代入之后:

Code ∝ (I × R_RTD × G) / (I × R_REF) = R_RTD × G / R_REF

注意这个结果里电流I被约掉了。也就是说,只要IDAC电流不变得太离谱导致饱和,电流的绝对值和它的温漂根本不影响测量结果。我实测过把IDAC从标称值故意偏了5%,读数变化微乎其微。设计时真正要盯紧的是R_REF这颗电阻的温度系数和初始精度,它才是比例测量的“仪表基准”。

2.3 参考电阻选择和增益计算的完整示例

这里用一个我在空调风柜项目里实际用过的配置来演示计算过程。目标:PT1000,测温范围0°C到100°C,两线制,要求分辨率优于0.01°C。

第一步,确定RTD阻值跨度。PT1000按IEC 60751标准,100°C时阻值约为1385Ω,0°C时是1000Ω,跨越了385Ω。

第二步,避开满量程。比例测量的码值范围是−2²³到+2²³−1,但实际信号只占正半轴的一部分,千万别让峰值信号顶到满量程。加上增益G之后比值约束是:

(R_RTD_max × G) / R_REF ≤ 0.85

第三步,选增益。PT1000信号够大,G=1就够了,好处是PGA不放大噪声,输出码值直接用,公式最简洁。

第四步,算参考电阻。把R_RTD_max=1385Ω、G=1、占比0.85代进去:

R_REF ≥ 1385 / 0.85 ≈ 1629Ω

E24标准系列里取2.0kΩ,留足余量。这时0°C时比值为1000/2000=0.5,100°C时比值为1385/2000≈0.69,信号在整个量程的50%到69%区间,既不会饱和,又充分利用了分辨率。

第五步,定激励电流。温度测量的自热误差是必须考虑的,RTD在静止空气中每毫瓦功耗大约会自热0.1°C到0.3°C。PT1000在100°C时有1385Ω,如果电流取1mA,自热功耗是1.385mW,造成的误差可能接近0.4°C,这不能忍。取250µA,功耗降到约0.087mW,自热误差可以忽略,而信号依然有250mV左右,对24位ADC来说强得离谱。

最后验证共模电压。两线制接法下,IDAC电流流过RTD和R_REF,输入端的共模电压大约是I×(R_REF+2×R_LEAD+R_RTD),对250µA、2kΩ参考电阻来说就是0.5V往上一点,必须在ADS122U04规定输入共模范围内。这是我们硬件设计阶段最容易忽略的地方,PGA内部差分放大对输入共模有严格限制,超了就直接削波,表现为“温度读数到某个值就卡住不动”。

2.4 输入滤波和PCB布局的实战做法

ADC精度再高,前端不干净也是白搭。ADS122U04是ΔΣ架构,片上自带数字滤波,但模拟输入端的抗混叠和EMI滤波必须靠外部RC,这个省不了。

我用的常规配置是在AINP和AINN各串一颗100Ω电阻,然后在差分之间并一颗10nF电容。这里有个细节:滤波电阻不能选太大,因为它是串在信号通路里的,IDAC电流流过它会产生压降。两颗对称的100Ω电阻上各压25mV,对250µA、2kΩ参考电阻的系统来说属于共模量级问题,不会破坏差分信号,但会产生额外的共模偏置,在计算共模电压时必须算进去。如果要更强的滤波,可以再接一级共模电容到模拟地,但注意别把差分电容改得过大,否则前端的建立时间会变长,通道切换后需要更多时间去稳定。

PCB布局上,我总结了几条用过的硬规矩:

  • ADS122U04底下的模拟地做单独一块,用零欧电阻或磁珠和数字地在主控附近单点汇合,避免传感器回流电流污染ADC地。
  • R_REF参考电阻要贴近AINP/AINN输入引脚,走线要短且对称,它所有连接的走线都当作模拟基准线处理,不要在它附近走开关电源的LX节点或继电器线。
  • 温度传感器线缆在板端加ESD保护二极管和热敏开关,HVAC现场静电和雷击浪涌风险高,这个钱不能省。
  • 数字部分和模拟部分间距拉开,UART的TX/RX走线如果跨越模拟区,最好做包地处理。

电源方面,ADS122U04的模拟供电和数字供电虽然可以共用一个3.3V,但我还是建议在AVDD引脚加10µF钽电容加0.1µF陶瓷电容的组合,并且让这个LDO独立于主控的IO电源。很多“读数末尾缓慢漂移”的怪问题,查到最后都是数字部分的高速翻转顺着电源耦合进了模拟核心。

3. 软件实现:搞定UART协议,温度数据才能落到手里

3.1 先搞懂ADS122U04的UART协议脾气

这颗芯片的UART协议跟普通传感器不太一样,我第一次用的时候差点按“串口菜单指令”的老思路去做,结果吃了亏。它的通信帧结构里有命令字、寄存器地址和数据,还带CRC机制,命令类型包括复位、启动转换、停止转换、读数据、读写寄存器等。具体操作码和帧格式我强烈建议以TI官方数据手册(文档编号SBAS716对应的最新版本)为准,因为不同批次的手册版本细节可能有修订,我在项目开始时就把最新版下载归档,后面调试全靠它。

软件层最关键的一点是:ADS122U04没有DRDY引脚,不像SPI版ADS1220那样有一根硬线通知“数据准备好了”。这意味着主控必须遵照转换时序自己管理读数据时机。我的做法是在初始化的时候把数据率设为20 SPS,转换周期是50ms,然后用一个50ms的软件定时器控制读取节奏,每隔一个周期发送一次读数据命令。

还有一个必须先确认的硬件细节:ADS122U04的输出引脚DOUT是开漏结构,必须在外部加上拉电阻到VIO电平。第一次拿到板子发现UART一个字节都收不到,排查到datasheet才反应过来。VIO引脚可以接1.8V到5V,所以当STM32F215ZG的IO电平是3.3V时,VIO就直接接3.3V,上拉电阻用10kΩ,通讯非常稳定。

3.2 初始化序列和寄存器配置实操

上电后我习惯按这个顺序来,一步都不乱:

  1. 主控延时至少10ms,等电源和晶振稳定。
  2. 发送复位命令到ADS122U04,再延时等内部复位完成。
  3. 发送NOP命令并检查响应,确认通信链路建立。
  4. 写配置寄存器,把输入通道、PGA增益、数据率、IDAC电流和路由一次设好。
  5. 发送启动转换命令,开始连续转换。

以PT1000、两线制、0°C到100°C这套配置为例,寄存器里要落实的事情是:输入复用器选择AIN0和AIN1作为差分对;PGA使能且增益设为1;数据率设为20 SPS;参考选择为外部参考模式并启用比例测量;IDAC1设为250µA并路由到AIN0激励RTD;IDAC2可以禁用,或者和第二路通道复用。

需要特别强调的一点:寄存器配置里有个“PGA旁路”之类的选项,千万别在挂RTD时启用PGA旁路,那样输入直接进调制器,小信号会被噪声吞掉。我见过有人图省事把PGA关掉,结果低温段数据跳得完全没法看。

3.3 STM32侧的核心代码骨架

主控这边的工程我基于STM32CubeMX生成,串口用USART3配置成115200或230400波特率、8位数据、无校验、1位停止位。之所以不用更高波特率,是因为HVAC控制柜里线缆和噪声复杂,速度慢一档稳定性好很多。

// USART3 初始化 void MX_USART3_UART_Init(void) { huart3.Instance = USART3; huart3.Init.BaudRate = 230400; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart3); }

写命令和读数据我习惯用HAL阻塞接口加超时,因为测温是慢速循环,不需要高吞吐。命令函数的重点是确保发送完整且在发送完成后再延时,避免接下来立刻读数据时上一个字节还在线上。

// 发送单字节命令并等待发送完成 static void ads122u_send_cmd(uint8_t cmd) { uint8_t buf[1] = {cmd}; HAL_UART_Transmit(&huart3, buf, 1, 10); HAL_Delay(1); // 给ADC一点处理时间 }

读数据时,ADS122U04收到读数据命令后会回传24位转换结果,主控这边收3个字节,按大端组合成无符号数,再自己扩展到有符号数。如果你拿到的手册显示响应帧带状态字节,那读取长度就相应调整,我也在代码注释里标注了这个不确定性,建议按实际手册来。

// 读取24位转换结果 int32_t ads122u_read_data(void) { uint8_t rx[3] = {0, 0, 0}; uint8_t cmd = ADS122U_CMD_READ_DATA; // 以手册操作码为准 HAL_UART_Transmit(&huart3, &cmd, 1, 10); HAL_Delay(1); HAL_UART_Receive(&huart3, rx, 3, 50); uint32_t raw = ((uint32_t)rx[0] << 16) | ((uint32_t)rx[1] << 8) | (uint32_t)rx[2]; // 24位转32位有符号 if (raw & 0x00800000U) { raw |= 0xFF000000U; } return (int32_t)raw; }

实际工程里我还会在HAL_UART_Receive后面加返回值判断,超时直接置故障标志,连续三次超时就认为传感器断线,进入报警态。这个异常处理逻辑在HVAC系统里非常必要——冷机误报停机可比读数不准麻烦多了。

3.4 从码值到电阻再到温度:一个公式搞定

拿到24位码值后,第一步先从码值还原RTD电阻。根据比例测量关系,电阻公式是:

R_RTD = Code / 2^23 × R_REF / G

对应的代码实现很直接:

#define RREF_OHM 2000.0f #define GAIN 1.0f #define FULL_SCALE 8388607.0f // 2^23 - 1 float rtd_resistance(int32_t code) { return ((float)code / FULL_SCALE) * RREF_OHM / GAIN; }

第二步是把电阻换算成温度。PT1000在0°C以上满足IEC 60751二次方程:

R(t) = R0 × (1 + A×t + B×t²)

其中R0=1000Ω,A=3.9083×10⁻³,B=−5.775×10⁻⁷。这个方程非线性,但用牛顿迭代法在Cortex-M3上几十个周期就能收敛到0.001°C:

float rtd_to_temperature(float r) { const float R0 = 1000.0f; const float A = 3.9083e-3f; const float B = -5.775e-7f; // 初始值:忽略二阶项的一次近似 float t = (r / R0 - 1.0f) / A; // 牛顿迭代两次就够 for (int i = 0; i < 2; i++) { float f = R0 * (1.0f + A * t + B * t * t) - r; float df = R0 * (A + 2.0f * B * t); t -= f / df; } return t; }

如果系统需要读到0°C以下,就要把C系数和分段定义的冷端公式加进来。但HVAC测温范围基本都在0°C以上,这个简化公式够用且稳定。

如果是NTC,那就把电阻代入Steinhart-Hart方程:

1/T = a + b×ln(R) + c×(ln(R))³

再把T减去273.15得到摄氏温度。注意a、b、c三个系数必须和具体型号的NTC匹配,不同厂家给的B值只会带来更大的误差,这地方按传感器厂家datasheet来,千万别上网随便抄一组。

3.5 数据滤波和多通道轮询的节奏控制

ADS122U04即使跑在20 SPS,原始码值也有一点点波动,我实测下来无滤波时峰峰值大约2到3个LSB,对应到PT1000配置大约0.001°C到0.003°C的抖动。这个底噪已经很小,但HVAC控制器输出PID时要干净信号,不然阀门会跟着抖。我的处理是先用5点中值滤波剔除异常毛刺,再做16点滑动平均。这个组合比单纯平均抗脉冲干扰强得多,而延迟只有不到1秒,对温控环来说完全可以接受。

多通道场景下,ADS122U04内部4路复用。切换通道之后,输入电容和滤波网络需要重新建立,第一组转换结果必然不准。我的规则是:切换通道后先丢弃第一组数据,再等一个完整转换周期才开始累计有效值。如果你图省事把它跟稳态数据混在一起平均,通道间的串扰会表现为规律性的“温度台阶”,很难排查。

4. 校准和系统级精度验证

4.1 为什么芯片再准,系统也必须校

理论上ADS122U04的INL和增益误差都很小,但系统里还有另外几个误差源:R_REF电阻的初始精度、RTD传感器本身的公差、线缆电阻、以及PCB上焊接引入的接触电阻。这些误差里有些是固定的,有些是温漂的,单纯靠“高精度ADC”并不能抵消。

举个例子,R_REF我用的是±0.1%精度、低温漂的电阻,这就有2Ω的偏差。对2000Ω参考电阻来说,会直接造成0.1%的电阻测量误差,换算成温度大约是0.25°C。而PT1000在IEC 60751标准里符合Class B等级的产品,0°C时允许±0.3°C的偏差。也就是说,传感器的固有误差可能比ADC本身大一个量级。系统校准的核心任务,就是把这些系统性的固定偏差一起修正掉。

4.2 两点校准的实施步骤

校准方法上,替换法和温度源法我都试过。替换法最简单,用低温漂精密电阻箱代替传感器,分别接入设备,记下ADC读数。温度源法更贴实际,把传感器插入冰点槽和恒温槽,分别测两个已知温度点。

实操步骤如下:

  • 校准点一:0°C,用冰水混合物或精度优于±0.02°C的恒温槽,稳定10分钟后采集200个样本取平均值,记为Code_lo。
  • 校准点二:80°C或100°C,建议用二等标准温度计比对,同样取平均值,记为Code_hi。
  • 两点之间做线性修正:

Code_corrected = Code_lo + (Code_hi − Code_lo) × (Code_raw − Code_ref_lo) / (Code_ref_hi − Code_ref_lo)

这里的Code_ref是标准器对应的ADC读数,Code_raw是实际读数。把修正系数固化到主控Flash里,作为校准参数存储,设备出厂前每台跑一遍标定流程。

我建议至少每块板在产线上做一次,不要靠抽样校准。ADS122U04本身一致性很好,但焊接工艺、参考电阻批次都会有细微差异,全检成本不高,但能避免售后一大堆“温度偏了0.5°C”的投诉。

4.3 误差预算:怎么分配才合理

做一个粗略的误差预算能帮你知道方案上限在哪。以PT1000、0到100°C、两线制为例:

误差来源典型值折算温度误差
R_REF初始精度±0.1%±0.25°C
R_REF温漂(15ppm/°C,温升15°C)±0.0225%±0.06°C
ADC增益误差(校准前)±0.02%量级±0.05°C
ADC量化与噪声(20SPS均值后)数µV量级±0.003°C
PT1000 Class B传感器偏差±0.3°C±0.3°C
线缆电阻(两线制,1Ω)折算RTD±0.26°C

看到没,最大的两项误差来源是传感器本身和线缆电阻。我们用ADC前端方案把“采集”环节做得很漂亮,但传感器选型和接线方式如果不讲究,整体精度依旧上不去。这也是为什么工业现场做关键点测温,我宁愿多拉两根线也选三线制或四线制RTD——线阻带来的误差是系统性且随温度变化的,不是校准一次就能彻底消除的。

4.4 现场EMC环境下的实测表现

实验室校准做完,真正见真章的是装进风机盘管电控柜里的那几天。柜内有变频器、继电器、开关电源,传感器线缆从柜内穿到风道,走线距离将近三米。我第一次上电测试时,把串口监视器全速打开观察原始码,结果发现读数波动比实验室大了不少,尤其变频器PID调节频繁动作的时候,末位码值会有几个LSB的抖动。

后来我做了三件事:一,传感器线缆换成带屏蔽的双绞线,屏蔽层单端接柜内接地端子;二,板端差分滤波电容加大到22nF,同时对共模干扰路径加了两颗1nF电容到模拟地;三,软件里保持20 SPS加中值加滑动平均。改完以后再测,即使变频器满负荷运行,温度读数波动也控制在±0.02°C以内。这个经验说明,24位ADC在恶劣现场不是“坐等干扰来”,而是需要硬件滤波、屏蔽接地和软件滤波三层协同,缺一层都会现原形。

5. 常见问题排查与避坑实录

5.1 UART不通,一个字节都收不到

这个问题排第一位。我归纳起来原因就三种:VIO没接对或DOUT上拉电阻没焊;波特率配置和ADC实际速率不匹配;主控和ADC之间共地没做好。曾经遇到过“上电偶尔能通一下”的灵异现象,最后发现是DOUT上拉电阻用的4.7kΩ太小、加上杂散电容导致沿变形,换成10kΩ后彻底解决。

另外,复位后必须耐心等内部时钟稳定,我调试时就是上电马上发命令,结果丢掉了前几条。后来固定加50ms延时,再也没出过问题。

5.2 读数末位乱跳,甚至规律性每隔几十秒跳一次

这种问题十有八九和工频或开关电源纹波有关。先看数据率是不是20 SPS,如果用了330 SPS或1000 SPS,数字滤波器的陷波点不在50/60Hz上,工频干扰就会以差拍形式出现。再查电源端10µF和0.1µF电容是不是贴牢了,ADS122U04对电源噪声很敏感。

5.3 温度整体偏高或偏低,但很稳定

整体偏差几乎全是系统误差。先量R_REF的实际阻值,再对比你代码里写死的2000Ω,偏差直接对应读数偏差。然后是传感器的本体误差,用高精度万用表量一下0°C时RTD阻值是否在1000Ω附近。如果两线制,试试用短接线短接传感器端子,看ADC读到的残留电阻是多少,那基本就是线缆和端子的总阻抗。

5.4 通道切换后温度出现台阶

我在多通道项目里遇到过一次“每到第二个通道就偏低0.1°C”的问题,百思不得其解,后来发现是MUX切换后我只丢了一组数据,但输入滤波电容的建立时间其实需要两个转换周期。把丢弃组数改成2,台阶消失了。多通道切换时,第一组、有时甚至第二组数据都是“假性稳定”,宁可保守多丢一组,也别把瞬态值喂给PID。

我把这几个典型问题梳理成一张速查表,方便现场抄作业:

现象可能原因快速排查方法
完全收不到数据VIO/上拉/共地/波特率先示波器看DOUT波形
收得到但CRC常错波特率匹配差、强干扰降波特率,检查线缆屏蔽
末位持续跳工频干扰、电源纹波数据率调20 SPS,查供电
读数整体偏R_REF/传感器/线阻校准电阻箱逐段排查
切换通道有台阶MUX建立时间不足切换后丢弃2组数据
低温准高温不准线性修正或传感器B值问题重新两点校准
通电几分钟后漂移自热或参考电阻温漂降低IDAC电流,排查R_REF

6. 最后再分享一点现场经验

这套ADS122U04IPWR加STM32F215ZG的方案,我从原理图到量产大概打磨了三轮。第一轮解决“能通”,第二轮解决“稳定”,第三轮才是“准”。中间最深的体会是:24位ADC不是买了就完事,它的精度要靠参考电阻、滤波、屏蔽、校准和软件节奏一起供出来。你在项目里如果遇到读数古怪,别第一时间怀疑芯片坏了,先按“电源、参考、时序、接地”这四个维度过一遍,绝大多数问题都能定位。

另外有个小技巧想分享:把每次调试用的寄存器配置、校准系数和示波器截图按项目归档,特别是在HVAC这种现场环境复杂的行业,同一块板在不同的柜子里表现完全可能不一样。记录下“什么环境配什么滤波和时序”,下次新项目能少走很多弯路。如果你也想把这套方案用在冷水机组、热泵或者工业设备上,建议从PT1000加20 SPS这套起手配置开始,先把链路打通,再逐项优化,稳扎稳打比一步到位靠谱得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询