工业现场的温度测量,最怕两件事:一是小信号被噪声淹没,二是冷端补偿没做对导致整机精度崩盘。我最近在做一个 HVAC 风管温度采集模块的项目,用的就是 ADS122U04IPWR 这颗 24 位 ΔΣ ADC 搭配 STM32F103RC 主控,从选型、布板到标定踩了不少坑,也积累了一些实测数据。这篇文章就把整个链路拆开讲清楚——从为什么不用 STM32 内置 ADC,到 ADS122U04 的寄存器怎么配、PT100/热电偶怎么接、冷端补偿怎么做、软件滤波怎么写,再到实测精度和常见故障排查。适合正在做工业测温、HVAC 温控、或者想从 12 位内置 ADC 升级到外置高精度方案的嵌入式工程师参考,不管你是刚接触 ΔΣ ADC 的新手,还是已经用过 ADS12xx 系列的老手,应该都能找到点有用的东西。
1. 为什么工业测温要绕开 STM32F103RC 的内置 ADC
1.1 内置 12 位 ADC 在温度场景下的真实短板
STM32F103RC 内置的是 12 位逐次逼近型(SAR)ADC,理论分辨率 3.3V/4096 ≈ 0.8mV。听起来还行,但放到温度测量里就露馅了。以最常见的 PT100 为例,0℃ 时阻值 100Ω,100℃ 时 138.51Ω,平均每℃ 变化约 0.385Ω。如果用 1mA 恒流激励,每℃ 产生的电压变化只有 0.385mV——也就是说,内置 ADC 的 1 个 LSB 就对应大约 2℃ 的温度变化。这个精度做开关量控制勉强够,做 HVAC 里 ±0.5℃ 的舒适度控制根本不够看。
更麻烦的是噪声。STM32F103 的 ADC 在 12 位模式下有效位数(ENOB)实测通常只有 9~10 位,意味着实际能分辨的电压在 3mV 以上。工业现场变频器、接触器、风机电机一开,电源和地线上的噪声轻松超过这个量级。我早期用内置 ADC 直接测 PT100 分压,风机一启动读数就跳 5℃ 以上,根本没法用。
还有一个容易被忽略的点:内置 ADC 的参考电压直接取自 VDDA,而 VDDA 通常就是 3.3V LDO 输出,温漂和负载调整率都不理想。温度测量本身就是要测微小变化,参考源不稳等于尺子本身在伸缩。
1.2 ADS122U04IPWR 解决的三个核心问题
ADS122U04IPWR 是 TI 的 24 位 ΔΣ ADC,集成 PGA、双匹配电流源、基准和温度传感器,专门为小信号传感器设计。放到这个项目里,它解决了三个关键问题:
第一是分辨率与噪声。24 位 ΔΣ 架构配合内部 PGA(增益 1~128),在增益 128、20SPS 数据率下,RMS 噪声可以低到几十 nV 级别。换算成 PT100 的温度分辨率,轻松做到 0.01℃ 以下,实际有效精度取决于传感器和标定,但 ADC 本身不再是瓶颈。
第二是激励源匹配。ADS122U04 内部有两路匹配的 IDAC 电流源,可以输出 10μA~1.5mA。用两路 IDAC 分别给 PT100 和参考电阻供电,能构成比例式测量,把电流源的温漂和长期漂移直接约掉——这是外置恒流源方案很难做到的。
第三是集成度。它内置 2.048V 基准(温漂典型 5ppm/℃)、内部温度传感器、SPI 接口,外围只需要几个滤波电容和限流电阻,PCB 面积比"运放+基准+外置 ADC"的方案小一大截。
1.3 什么场景该上 ADS122U04,什么场景不必
不是所有温度测量都值得上这颗芯片。我总结了一个简单的判断标准:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 精度要求 ±2℃ 以上,成本敏感 | STM32 内置 ADC + NTC | 够用,省一颗 ADC |
| 精度要求 ±0.5℃,通道数 1~4 | ADS122U04 | 集成度高,比例测量省事 |
| 精度要求 ±0.1℃,多通道 | ADS122U04 多片或 ADS1220 系列 | 需要更好的布板和标定 |
| 热电偶高温测量 | ADS122U04 + 冷端补偿 | 内置 PGA 适合 μV 级信号 |
| 高速动态测温 | 专用 SAR 或高速 ΔΣ | ΔΣ 建立时间长,不适合 |
提示:ADS122U04 是 4 通道版本,如果只需要 2 通道,ADS122U02 更便宜;如果需要 8 通道以上,考虑 ADS122S14 或外置多路复用器。
2. ADS122U04IPWR 的硬件设计:从原理图到布板
2.1 电源与基准的取舍
ADS122U04 支持单电源(2.3V~5.5V)和双电源(±2.5V)供电。工业 HVAC 场景我建议用单电源 3.3V,和 STM32F103RC 共电源域,省一路 LDO。但要注意:模拟电源 AVDD 和数字电源 DVDD 之间必须加磁珠或 10Ω 电阻隔离,再各自配 1μF + 0.1μF 去耦。我第一版图省事直接连一起,结果 SPI 通信时 ADC 读数有周期性毛刺,后来加了磁珠才干净。
基准方面,ADS122U04 有内部 2.048V 基准,也有外部基准输入。如果追求极致精度,建议用外部基准如 REF5025(2.5V,3ppm/℃)。但大多数 HVAC 场景内部基准够用,因为比例式测量本身就把基准误差约掉了一部分。这里有个细节:内部基准的温漂是 5ppm/℃,换算到 100℃ 满量程大约 0.0005℃/℃ 的额外误差,可以忽略。
2.2 模拟输入端的 RC 滤波与共模设置
ADS122U04 的模拟输入是差分输入,每个输入端建议串一个 1kΩ 电阻,再对地接 100nF 电容,构成截止频率约 1.6kHz 的差分低通。这个滤波不是为了抗混叠(ΔΣ 本身有数字滤波),而是为了抑制射频干扰和降低输入端的瞬态电流冲击。
共模电压设置很关键。单电源 3.3V 供电时,PGA 的共模输入范围有限制,尤其是高增益时。以增益 128 为例,共模电压必须落在 (AVDD-0.9V) 以内,也就是大约 2.4V 以下。PT100 比例式测量时,激励电流流过传感器和参考电阻,共模点会抬升,布板时要算清楚。我的做法是把参考电阻下端接 AVSS,上端接 IDAC,PT100 下端也接 AVSS,这样共模电压天然接近 0,PGA 工作在最舒服的区域。
2.3 布板时最容易翻车的三个细节
第一,模拟地和数字地的分割。ADS122U04 的 AGND 和 DGND 引脚必须单点连接,连接点选在芯片下方。我见过有人把两地大面积铺铜后直接连,结果数字回流穿过模拟区,噪声直接进 ADC。
第二,IDAC 走线的对称性。两路 IDAC 输出到 PT100 和参考电阻的走线要等长、等宽,否则两路电流的寄生参数不一致,比例式测量的误差就来了。实测走线长度差 5mm,在 1mA 激励下会引入约 0.02℃ 的偏差,虽然不大,但标定时会发现线性度变差。
第三,基准电容的位置。ADS122U04 的 REFP0/REFN0 引脚需要接 1μF 电容,这个电容必须紧贴引脚,走线越短越好。我试过把电容放在 10mm 外,基准噪声明显上升,读数跳动从 ±0.01℃ 变成 ±0.05℃。
3. 传感器接口:PT100 比例式测量与热电偶冷端补偿
3.1 PT100 三线制比例测量的完整接法
工业 HVAC 里 PT100 三线制最常见,因为它能抵消引线电阻。ADS122U04 的两路 IDAC 正好支持三线制比例测量,接法如下:
- IDAC1 输出 → PT100 的 A 端
- PT100 的 B 端 → 参考电阻 RREF 上端 + ADC 的 AIN1
- PT100 的 C 端 → ADC 的 AIN2(同时接 IDAC2 输出)
- RREF 下端 → AGND
这样 IDAC1 的电流流过 PT100 和 RREF,IDAC2 的电流流过引线 C 和 RREF。两路电流在 RREF 上叠加,而 PT100 引线 A 和 C 的压降在差分测量中被抵消。ADC 测量的是 (V_AIN1 - V_AIN2),正好对应 PT100 阻值乘以 IDAC1 电流。
RREF 的选值有讲究。ADC 的满量程是 ±VREF/PGA,比例式测量时 VREF 就是 RREF 上的压降。要让 PT100 在最高温度时的压降不超过满量程,同时尽量用满量程提高信噪比。以 PT100 测 -50℃~200℃ 为例,最大阻值约 175.86Ω,选 RREF = 1.6kΩ,IDAC = 500μA,则 RREF 压降 0.8V,PT100 最大压降 0.088V,PGA 增益设 8,满量程 ±0.1V,刚好覆盖。
3.2 热电偶测量中的冷端补偿怎么做才准
热电偶测的是热端和冷端的温差,冷端温度必须单独测。ADS122U04 内置温度传感器,精度典型 ±0.5℃,但它是测芯片结温,不是测接线端子温度。如果接线端子离芯片远,或者有风流动,误差会很大。
我的做法是:在接线端子旁边放一颗高精度数字温度传感器(如 TMP117,±0.1℃),通过 I2C 读冷端温度,再用 STM32 做冷端补偿计算。ADS122U04 的内部温度传感器只用来做芯片自热监测,不参与补偿。
热电偶信号是 μV 级,K 型热电偶约 41μV/℃。ADS122U04 在增益 128、20SPS 下噪声约 100nV RMS,对应 0.0024℃ 分辨率,完全够用。但要注意热电偶的共模电压——如果热电偶直接接地,共模电压可能超出 PGA 范围。解决办法是用偏置电阻把热电偶一端抬到 VREF/2 附近,或者用双电源供电。
3.3 传感器断线检测与故障诊断
工业现场传感器断线是常见故障,ADS122U04 提供了激励电流源开路检测功能。具体做法是:在正常测量间隙,把 IDAC 电流切到最大(1.5mA),然后读 ADC 值。如果传感器断线,输入端会浮空,ADC 读数会饱和到满量程。通过判断读数是否超过阈值,就能识别断线。
更可靠的做法是用两路 IDAC 分别拉高和拉低输入端,形成一个小电流回路,如果传感器正常,会有一个确定的电压;如果断线,电压会异常。这个诊断可以在每次测量前做,耗时约 1ms,不影响正常采集。
4. STM32F103RC 与 ADS122U04 的 SPI 通信与寄存器配置
4.1 SPI 模式选择与时钟极性
ADS122U04 的 SPI 接口支持模式 1(CPOL=0,CPHA=1)。STM32F103RC 的 SPI1 配置为:
- 主模式,时钟分频 8(72MHz/8 = 9MHz,ADS122U04 最高支持 10MHz)
- CPOL = 0,CPHA = 1
- 数据宽度 8 位,MSB 先出
- NSS 软件管理
这里有个坑:STM32 的 SPI 在 CPHA=1 时,第一个时钟边沿采样数据,和 ADS122U04 的时序要求一致。但如果你用硬件 NSS,STM32 会在传输结束后自动拉高,而 ADS122U04 要求 NSS 在命令字节和后续数据之间保持低电平。所以必须用软件 NSS,手动控制 CS 引脚。
4.2 关键寄存器配置流程
ADS122U04 有 4 个配置寄存器,上电后需要按顺序配置。我整理了一个典型的初始化序列:
// 1. 复位 ADS122U04_WriteReg(0x06, 0x06); // 发送 RESET 命令 HAL_Delay(1); // 2. 配置寄存器 0:MUX=AIN0/AIN1, PGA=8, 连续转换模式 ADS122U04_WriteReg(0x00, 0x08); // 增益 8,MUX 默认 // 3. 配置寄存器 1:数据率 20SPS, 正常模式, 连续转换 ADS122U04_WriteReg(0x01, 0x04); // 20SPS, 连续转换 // 4. 配置寄存器 2:内部基准, 50/60Hz 抑制 ADS122U04_WriteReg(0x02, 0x10); // 内部 2.048V 基准 // 5. 配置寄存器 3:IDAC 电流 500μA, IDAC1 到 AIN0, IDAC2 到 AIN3 ADS122U04_WriteReg(0x03, 0x2A); // 500μA, 两路 IDAC 使能配置完成后,等待 DRDY 引脚变低,然后读 3 字节数据。注意 ADS122U04 的数据是 24 位二进制补码,最高位是符号位,读回来后要扩展成 32 位有符号数再计算。
4.3 DRDY 中断与数据读取的时序陷阱
DRDY 是 ADS122U04 的数据就绪引脚,低电平有效。STM32F103RC 可以用外部中断(EXTI)捕获下降沿,然后在中断里读数据。但这里有两个陷阱:
陷阱一:DRDY 在连续转换模式下会周期性变低,如果中断处理太慢,可能错过下一次。20SPS 时周期 50ms,中断处理只要在 50ms 内完成就行,一般没问题。但如果用 1000SPS,周期 1ms,中断里做浮点运算就可能来不及。建议中断里只置标志位,主循环处理。
陷阱二:读数据时 CS 必须保持低电平,且读完后要拉高。如果 CS 一直拉低,ADS122U04 会认为你在连续读,可能输出错误数据。我的做法是每次读数据前拉低 CS,读 3 字节后立即拉高。
5. 从原始码值到温度:标定与线性化处理
5.1 比例式测量的码值换算公式
比例式测量下,ADC 码值和 PT100 阻值的关系是:
R_PT100 = RREF × (Code / 2^23) / PGA其中 Code 是 24 位有符号数,PGA 是增益。以 RREF=1.6kΩ,PGA=8,Code=0x100000(即 2^20)为例:
R_PT100 = 1600 × (1048576 / 8388608) / 8 = 1600 × 0.125 / 8 = 25Ω这个公式假设 IDAC1 和 IDAC2 完全匹配。实际两路 IDAC 有 0.1% 左右的失配,会引入约 0.1Ω 的误差,对应 0.25℃。要消除这个误差,需要做两点标定。
5.2 两点标定法的实操步骤
两点标定是最实用的方法,用冰水混合物(0℃)和沸水(100℃,注意气压修正)作为参考点。步骤:
- 把 PT100 插入冰水混合物,等 5 分钟稳定,记录 ADC 码值 Code0
- 把 PT100 插入沸水,等 5 分钟稳定,记录 Code100
- 计算斜率 k = 100 / (Code100 - Code0)
- 实际温度 T = k × (Code - Code0)
这个方法把 IDAC 失配、RREF 误差、PGA 增益误差全部打包进斜率里,简单有效。实测下来,两点标定后 0~100℃ 范围内误差可以做到 ±0.1℃ 以内。
注意:沸水温度受气压影响,海拔 1000m 时沸点约 96.8℃。如果精度要求高,用标准温度计读实际沸点,或者用恒温槽标定。
5.3 PT100 非线性校正与查表法
PT100 在 -200~850℃ 范围内是非线性的,Callendar-Van Dusen 方程描述:
R(T) = R0 × (1 + A×T + B×T² + C×(T-100)×T³)其中 A=3.9083e-3,B=-5.775e-7,C=-4.183e-12(T<0℃时)。在 0~100℃ 范围内,二次项 B×T² 在 100℃ 时贡献约 -0.0058Ω,对应 -0.015℃。如果只做两点标定,这个非线性误差会残留。要消除它,可以用查表法:把 -50~200℃ 分成 1℃ 间隔,预先算好每个温度点的 ADC 码值,测量时用二分查找定位,再线性插值。
查表法的代码实现:
const int32_t pt100_table[251] = { /* -50℃ 到 200℃ 的码值 */ }; float code_to_temp(int32_t code) { int low = 0, high = 250; while (high - low > 1) { int mid = (low + high) / 2; if (pt100_table[mid] > code) high = mid; else low = mid; } float ratio = (float)(code - pt100_table[low]) / (pt100_table[high] - pt100_table[low]); return -50.0f + low + ratio; }这个查表法在 STM32F103RC 上执行时间约 5μs,完全不影响 20SPS 的采集节奏。
6. 实测精度、噪声与常见故障排查
6.1 实测数据:不同增益和数据率下的噪声表现
我在实验室用 PT100 模拟器(电阻箱)做了噪声测试,环境温度 25℃,电源 3.3V,IDAC=500μA,RREF=1.6kΩ。结果如下:
| 增益 | 数据率 | 码值峰峰值 | 等效温度噪声 | 有效位数 |
|---|---|---|---|---|
| 8 | 20SPS | 120 | 0.008℃ | 21.5 位 |
| 8 | 100SPS | 480 | 0.032℃ | 19.5 位 |
| 32 | 20SPS | 80 | 0.005℃ | 22.0 位 |
| 32 | 100SPS | 320 | 0.021℃ | 20.0 位 |
| 128 | 20SPS | 60 | 0.004℃ | 22.5 位 |
可以看到,增益越高、数据率越低,噪声越小。但增益不能无限高,因为 PT100 满量程压降会超过 PGA 输入范围。实际选型时,先算满量程压降,再选最大可用增益。
6.2 现场干扰的排查链路
工业现场最常见的故障是读数跳动。我遇到过一次,风机启动时温度读数跳 10℃。排查过程:
第一步,确认是传导干扰还是辐射干扰。把传感器线换成屏蔽双绞线,屏蔽层单端接地,如果跳动减小,说明是辐射干扰;如果没变化,说明是传导干扰。
第二步,检查电源。用示波器看 AVDD,发现风机启动时有 200mV 的跌落。在 AVDD 前加 LC 滤波(10μH + 100μF),跌落降到 20mV,读数跳动从 10℃ 降到 0.5℃。
第三步,检查地线。发现传感器地和主控地之间有 50mV 的电位差,原因是两地通过不同路径接地。把传感器地单独拉回 ADC 的 AGND,电位差降到 1mV,读数稳定。
第四步,软件滤波。硬件改完后还有 ±0.1℃ 的随机跳动,加了 16 点滑动平均,跳动降到 ±0.02℃。但滑动平均会引入延迟,16 点 20SPS 对应 800ms 延迟,对 HVAC 控制来说可以接受。
6.3 几个容易误判的"故障"
有些现象看起来是故障,其实是正常行为:
- 上电后读数缓慢爬升:ADS122U04 内部基准需要约 200ms 稳定,上电后前几秒读数不准是正常的,建议上电后延时 500ms 再开始采集。
- 切换增益后第一帧数据异常:PGA 切换后需要 4 个转换周期稳定,切换后丢弃前 4 帧。
- DRDY 偶尔不触发:如果 SPI 通信过程中 CS 抖动,ADS122U04 可能进入错误状态,需要软复位。建议在 SPI 读写函数里加超时检测,超时后复位 ADC。
7. 软件滤波与温度数据后处理
7.1 滑动平均与中值滤波的组合策略
单纯滑动平均对脉冲干扰无能为力,一个尖峰会拉偏整个窗口。我的做法是"中值滤波 + 滑动平均"两级:
第一级,取最近 5 个采样值,排序后取中值,滤掉脉冲干扰。第二级,对中值序列做 16 点滑动平均,平滑随机噪声。这个组合在 STM32F103RC 上执行时间约 20μs,20SPS 下占用 CPU 不到 0.1%。
代码实现:
#define MEDIAN_N 5 #define AVG_N 16 int32_t median_filter(int32_t new_val) { static int32_t buf[MEDIAN_N] = {0}; static uint8_t idx = 0; buf[idx] = new_val; idx = (idx + 1) % MEDIAN_N; int32_t tmp[MEDIAN_N]; memcpy(tmp, buf, sizeof(tmp)); // 简单冒泡排序 for (int i = 0; i < MEDIAN_N - 1; i++) for (int j = 0; j < MEDIAN_N - 1 - i; j++) if (tmp[j] > tmp[j+1]) { int32_t t = tmp[j]; tmp[j] = tmp[j+1]; tmp[j+1] = t; } return tmp[MEDIAN_N / 2]; } float moving_average(int32_t new_val) { static int32_t buf[AVG_N] = {0}; static uint8_t idx = 0; static int64_t sum = 0; sum -= buf[idx]; buf[idx] = new_val; sum += new_val; idx = (idx + 1) % AVG_N; return (float)sum / AVG_N; }7.2 温度变化率限制与异常值剔除
HVAC 场景里温度不会突变,如果相邻两次读数差超过 5℃,基本可以判定是干扰。我加了一个变化率限制:如果新读数与上一次有效读数差超过阈值,就丢弃这次读数,用上一次的值代替,并计数。如果连续 10 次都被丢弃,说明传感器可能真的故障了,触发报警。
这个逻辑看起来简单,但阈值要设对。我一开始设 2℃,结果空调除霜时温度真的快速变化,被误判成干扰。后来改成 5℃,并且加了一个条件:如果变化方向一致且持续 3 次以上,就接受新值。这样既能滤掉脉冲,又不会漏掉真实快速变化。
7.3 多通道轮询与通道间串扰的处理
ADS122U04 是 4 通道,如果轮流采集 4 路 PT100,切换 MUX 后第一帧数据会受前一通道影响。解决办法是切换通道后丢弃前 2 帧,从第 3 帧开始取数。另外,如果某通道传感器断线,输入端浮空,会通过 MUX 寄生电容耦合到其他通道。建议在断线通道的输入端加下拉电阻(如 1MΩ),把浮空点拉到确定电平。
多通道轮询的时序:每通道切换后等待 3 个转换周期(20SPS 下 150ms),4 通道轮询一遍 600ms。对 HVAC 温度控制来说,600ms 的刷新率完全够用。
8. 系统集成与长期稳定性验证
8.1 与 STM32F103RC 的资源分配
STM32F103RC 有 256KB Flash、48KB RAM,跑这个测温系统绰绰有余。我的资源分配:
- SPI1:ADS122U04 通信,DMA 不必要,中断足够
- EXTI:DRDY 中断,优先级设为中
- TIM2:1ms 系统滴答,用于超时和滤波计时
- USART1:调试输出和 Modbus 通信
- Flash 最后 2KB:存储标定系数
CPU 占用率实测:20SPS 采集 + 滤波 + Modbus 通信,主循环占用约 15%,中断占用约 5%,还有大量余量做其他逻辑。
8.2 上电自检与传感器在线检测
工业设备要求上电自检。我的自检流程:
- 读 ADS122U04 的配置寄存器,确认 SPI 通信正常
- 切换 IDAC 到 1.5mA,读各通道 ADC 值,判断传感器是否在线
- 读内部温度传感器,确认芯片温度在 -40~85℃ 范围内
- 如果任何一项失败,点亮故障灯并上报
传感器在线检测的阈值:正常 PT100 在 1.5mA 下压降约 0.15~0.26V,如果读数接近 0 或满量程,判定断线或短路。
8.3 长期漂移与定期校准建议
ADS122U04 的长期漂移主要来自内部基准和 IDAC。TI 的数据手册给出 1000 小时漂移典型值:基准 20ppm,IDAC 50ppm。换算到温度,大约 0.005℃/1000 小时。这个漂移很小,但工业设备通常要求一年校准一次。
我的建议是:如果精度要求 ±0.1℃,每年校准一次;如果要求 ±0.5℃,两年校准一次即可。校准用两点法,冰水和沸水,或者用标准电阻箱模拟 PT100 阻值。校准系数存在 Flash 里,带 CRC 校验,防止误写。
9. 我在这个项目里踩过的几个坑
第一个坑是忽略了 PGA 的共模范围。第一版图把 PT100 上端接 IDAC,下端接 AGND,参考电阻也接 AGND,结果共模电压接近 0,PGA 增益 128 时读数正常。但后来改成四线制测量,把 IDAC 接到 PT100 两端,共模电压抬到 1.5V,PGA 直接饱和。后来查数据手册才发现,增益 128 时共模范围只有 AVSS+0.9V 到 AVDD-0.9V,1.5V 已经接近上限。解决办法是降低增益到 32,或者改用双电源。
第二个坑是SPI 时钟太快导致数据错误。我一开始把 SPI 时钟设到 18MHz(72MHz/4),ADS122U04 最高 10MHz,结果读回来的数据偶尔错位。降到 9MHz 后稳定。这里要注意,数据手册标的是最高 10MHz,但实际布板不好时,9MHz 都可能出问题,建议留余量。
第三个坑是冷端补偿用内部温度传感器。热电偶项目里,我图省事用 ADS122U04 内部温度传感器做冷端补偿,结果误差达到 ±3℃。原因是芯片自热和接线端子温度差。后来换成 TMP117 贴在接线端子旁边,误差降到 ±0.3℃。这个教训是:冷端补偿必须测接线端子温度,不能测芯片温度。
第四个坑是滤波窗口设太大导致响应慢。HVAC 控制要求温度变化时 10 秒内响应,我一开始用 64 点滑动平均,20SPS 下延迟 3.2 秒,加上控制周期,响应超过 10 秒。后来改成 16 点,延迟 800ms,满足要求。滤波窗口要在噪声和响应速度之间折中,不能一味追求平滑。
10. 这套方案还能怎么扩展
如果通道数不够,可以用两片 ADS122U04 挂同一个 SPI 总线,用不同的 CS 片选。STM32F103RC 的 SPI1 可以带 4 个片选,足够挂 4 片,扩展到 16 通道。
如果要测更高温度,比如 600℃ 以上,PT100 就不合适了,得用热电偶。ADS122U04 的 PGA 和 24 位分辨率正好适合热电偶的 μV 级信号,配合外部冷端传感器,可以做到 ±1℃ 精度。
如果要无线传输,可以在 STM32F103RC 上挂一个 LoRa 或 NB-IoT 模块,把温度数据传到云端。但要注意无线模块的射频干扰,天线要远离模拟输入端,电源要单独滤波。
最后分享一个调试小技巧:ADS122U04 的 DRDY 引脚可以接到 STM32 的定时器输入捕获通道,用定时器测量 DRDY 周期,能快速判断 ADC 是否在正常转换。如果周期不对,说明配置有问题,比读寄存器更直观。