1. 工业与HVAC温度测量方案的整体设计思路
工业现场和HVAC(暖通空调)系统里的温度测量,看起来是个老生常谈的话题,但真正做过项目的人都知道,这里面的坑一点都不比通信协议少。我前后做过七八个涉及温度采集的工业项目,从简单的NTC热敏电阻到PT1000铂电阻,从板载ADC到外置24位ΔΣ ADC,几乎每种方案都踩过一遍。这次要聊的这套组合——ADS122U04IPWR加R7FA4L1BD4CFP——是我个人认为在中小规模工业温度采集场景里性价比和可靠性平衡得比较好的一套方案。
先说清楚这两个器件是什么。ADS122U04IPWR是TI的一款24位ΔΣ模数转换器,内置PGA(可编程增益放大器)、双匹配电流源、参考电压缓冲,以及一个UART接口。注意,它带的是UART,不是常见的SPI或I2C,这一点在选型时非常关键,后面会详细展开。R7FA4L1BD4CFP则是瑞萨RA4L1系列的MCU,基于Arm Cortex-M33内核,主打低功耗和丰富的外设集成,工作温度范围覆盖工业级,适合在HVAC控制器、PLC扩展模块这类场景里做主机。
为什么把这两个凑在一起?核心逻辑是这样的:工业温度测量最常见的传感器是RTD(铂电阻,比如PT100、PT1000)和热电偶。RTD的阻值变化很小,PT1000在0°C时是1000Ω,每摄氏度大约变化3.85Ω,要测到0.1°C的分辨率,就得分辨出0.385Ω的变化,这对ADC的分辨率和激励电流的稳定性要求很高。ADS122U04的24位分辨率加上双匹配电流源,正好能覆盖这个需求。而R7FA4L1BD4CFP负责做数据处理、PID控制、通信上报,它的低功耗特性在HVAC这种常年运行的设备里很有价值。
这套方案解决的核心问题是:在工业电磁环境复杂、温度跨度大(比如-40°C到+125°C)、需要长期稳定运行的场景下,如何用合理的成本实现高精度温度采集。适合谁来参考?如果你正在做HVAC控制器、工业温度变送器、PLC模拟量输入模块,或者任何需要接RTD/热电偶的嵌入式项目,这套组合值得认真考虑。如果你只是做个桌面级温度计,那大可不必上24位ADC,NTC加MCU内部12位ADC就够了。
2. 核心器件选型背后的逻辑与关键参数
2.1 ADS122U04IPWR凭什么适合RTD测量
选ADS122U04而不是ADS1220或者ADS124S08,最直接的原因是UART接口。很多工程师第一反应是SPI更快更常见,但在工业现场,UART有个被低估的优势:它可以做电气隔离。SPI做隔离需要隔离四根线(SCLK、MOSI、MISO、CS),而UART只需要隔离TX和RX两根线,光耦或者数字隔离器的成本直接减半。在HVAC这种强电和弱电混在一起的柜子里,隔离不是可选项,是必选项。
ADS122U04的关键参数我列一下,这些是选型时必须吃透的:
| 参数 | 数值 | 实际意义 |
|---|---|---|
| 分辨率 | 24位 | 理论LSB对应约0.0000001V,实际有效位数约21位 |
| 数据速率 | 最高2000SPS | 温度测量不需要高速,20SPS足够,还能抑制工频干扰 |
| PGA增益 | 1~128 | 小信号直接放大,省外部运放 |
| 激励电流源 | 10μA~1.5mA,双路匹配 | 直接驱动RTD,匹配度0.1% |
| 接口 | UART,最高115200bps | 隔离成本低,接线简单 |
| 工作电压 | 2.3V~5.5V | 3.3V系统直接供电 |
这里重点说两个参数。第一个是双匹配电流源。RTD测量通常用比例法,就是让同一个电流源流过RTD和参考电阻,这样电流源的温漂会被抵消掉。ADS122U04内部有两个匹配的电流源,匹配度典型值0.1%,这意味着即使电流源随温度变化,两个通道的变化也是一致的,比例法能把这个误差压下去。如果你用外部电流源,匹配度做到0.01%也不是不行,但成本就上去了。
第二个是数据速率与工频抑制。工业现场50Hz工频干扰无处不在,ADS122U04在20SPS时的归一化滤波响应在50Hz和60Hz处都有陷波,能有效抑制工频串扰。我实测过,同样一个PT1000探头,用1000SPS采样时读数跳动大约±0.5°C,切到20SPS后跳动降到±0.05°C以内。这个差别在PID控制里就是稳不稳的问题。
2.2 R7FA4L1BD4CFP在系统中的角色定位
R7FA4L1BD4CFP是瑞萨RA4L1系列的一员,Cortex-M33内核,最高48MHz主频,256KB Flash,32KB SRAM。这个配置在温度采集系统里绰绰有余。它的价值不在于算力,而在于外设集成度和低功耗。
RA4L1系列有几个特性特别适合HVAC场景。一是低功耗模式,在RTC+UART唤醒模式下,待机电流可以做到微安级,这对于电池供电或者能量收集的无线温度传感器很有意义。二是丰富的定时器资源,做PID控制需要稳定的采样周期,RA4L1的32位定时器可以轻松产生1ms精度的中断。三是内置温度传感器,虽然精度不如外置RTD,但可以用来做冷端补偿或者板级温度监控。
还有一个实际考虑:R7FA4L1BD4CFP的封装是LQFP64,引脚间距0.5mm,手工焊接难度适中,小批量试产时不用非得开钢网。相比BGA封装的MCU,这在打样阶段省了不少事。
2.3 为什么不用MCU内部ADC直接测
有人会问,R7FA4L1BD4CFP内部也有12位ADC,直接接PT1000分压不就完了?这个问题我试过,答案是:能测,但精度和稳定性差一个数量级。12位ADC在3.3V参考下,LSB是0.8mV。PT1000在0°C时1000Ω,用1mA激励就是1V,每0.1°C变化0.385mV,还不到一个LSB。就算用PGA放大,内部ADC的噪声和温漂也会把有效分辨率拉到10位以下。而ADS122U04的24位ΔΣ架构,配合内部PGA和比例法,有效分辨率能到18位以上,这才是工业级温度测量该有的水平。
3. 硬件设计细节与实操要点
3.1 RTD接口电路的设计与计算
PT1000的接口电路是这套方案的核心。我采用的是三线制接法,这是工业现场最常用的方式,能抵消引线电阻的影响。具体电路是这样的:ADS122U04的电流源1从AIN0输出,经过PT1000,回到AIN1;电流源2从AIN2输出,经过参考电阻Rref,回到AIN3。同时,PT1000的另一端和参考电阻的一端都接到AIN1和AIN3的公共点。
这里的关键是参考电阻的选择。参考电阻的阻值决定了激励电流的大小和参考电压。ADS122U04的PGA增益和参考电压共同决定了输入范围。我一般选Rref=1.65kΩ,0.1%精度,25ppm/°C温漂。为什么是1.65k?因为PT1000在0°C时1000Ω,在100°C时1385Ω,在200°C时1758Ω。如果激励电流选500μA,那么PT1000上的电压范围是0.5V到0.879V,参考电阻上的电压是0.825V。PGA增益设为1时,输入范围是±Vref/2,也就是±0.4125V,不够覆盖0.879V。所以要么降低激励电流,要么提高参考电压。
我实际用的参数是:激励电流250μA,Rref=3.3kΩ,PGA增益=2。这样PT1000上的电压是0.25V到0.44V,参考电压是0.825V,PGA增益2倍后输入范围是±0.825V,完全覆盖。而且250μA的激励电流在PT1000上的自热功率只有62.5μW,引起的温升可以忽略不计。自热误差的计算公式是:ΔT = P / θ,其中θ是RTD的热阻,PT1000在静止空气中的θ大约是50°C/W,62.5μW对应的温升是0.003°C,完全可以忽略。
3.2 UART隔离与电源设计
ADS122U04的UART接口在工业环境里必须隔离。我用的是数字隔离器加隔离DC-DC的方案。数字隔离器选的是两通道的,一路TX一路RX,速率不用太高,115200bps足够。隔离DC-DC给ADS122U04侧供电,输出3.3V,功率1W就够。
这里有个坑:隔离DC-DC的开关噪声会耦合到模拟电源上。我第一版设计时没注意,温度读数里出现了大约0.2°C的周期性波动,频率正好是DC-DC的开关频率。解决办法是在ADS122U04的AVDD引脚旁边加一个LC滤波,电感用10μH,电容用10μF加0.1μF。加上之后波动降到0.02°C以下。这个细节在数据手册里不会写,但实际项目中很关键。
电源方面,ADS122U04的AVDD和DVDD可以共用3.3V,但建议AVDD用LDO单独供电,或者至少加一级RC滤波。R7FA4L1BD4CFP的电源就按常规处理,每个电源引脚加0.1μF去耦,VDDA加1μF加0.1μF。
3.3 PCB布局的注意事项
混合信号PCB布局是老生常谈,但温度测量对布局特别敏感。我的经验是:
- 模拟地和数字地分开,在ADS122U04下方用0Ω电阻或者磁珠单点连接。不要用大面积铺铜直接连,那样数字噪声会窜到模拟区。
- RTD走线要对称,三线制的三根线尽量等长,走线宽度一致,减少热电动势的影响。如果走线经过温度梯度大的区域,热电动势会引入误差,每°C温差大约产生几微伏,对应PT1000就是0.001°C左右,虽然不大,但能避免就避免。
- 参考电阻靠近ADC放置,远离发热器件。参考电阻的温漂直接影响测量精度,如果它旁边有个LDO在发热,那温漂就不是25ppm了,可能是100ppm。
- 晶振远离模拟输入,RA4L1如果用了外部晶振,晶振的谐波可能耦合到RTD走线上。我一般把晶振放在板子另一侧,中间用地平面隔开。
4. 固件实现与温度换算的完整流程
4.1 ADS122U04的配置与数据读取
ADS122U04的UART协议是命令式的,每个命令一个字节,读数据用0x10命令。配置寄存器有四个,需要设置增益、数据速率、电流源、参考选择等。我用的配置是:
- 寄存器0:MUX选择AIN0/AIN1差分,增益2,PGA使能
- 寄存器1:数据速率20SPS,连续转换模式,内部参考
- 寄存器2:电流源1和2使能,电流250μA
- 寄存器3:IDAC路由到AIN0和AIN2,参考输入选择外部REF
配置完成后,MCU发送0x08命令启动转换,然后等待DRDY引脚变低,再发送0x10读取3字节数据。这里注意,ADS122U04的数据是24位二进制补码,最高位是符号位。读取后要先做符号扩展,再转成有符号整数。
// ADS122U04数据读取示例 int32_t read_ads122u04(void) { uint8_t rx_buf[3]; int32_t raw; // 等待DRDY低 while (DRDY_PIN == 1); // 发送读数据命令 uart_send_byte(0x10); uart_receive_bytes(rx_buf, 3); // 组合成24位 raw = ((int32_t)rx_buf[0] << 16) | ((int32_t)rx_buf[1] << 8) | rx_buf[2]; // 符号扩展 if (raw & 0x800000) { raw |= 0xFF000000; } return raw; }4.2 比例法计算RTD阻值
比例法的核心公式是:Rrtd = Rref × (Code_rtd / Code_ref)。但ADS122U04的测量是差分的,而且PGA增益会影响读数,所以实际计算要分两步。我通常的做法是:先测参考电阻上的电压,再测RTD上的电压,两者相除得到阻值比。
具体来说,ADS122U04在测量时,输入电压VIN = (Code / 2^23) × Vref / Gain。对于RTD通道,VIN_rtd = I × Rrtd;对于参考通道,VIN_ref = I × Rref。因为电流相同,所以Rrtd = Rref × (VIN_rtd / VIN_ref) = Rref × (Code_rtd / Code_ref)。注意,这里Gain和Vref都抵消了,这就是比例法的好处——不需要精确知道电流大小和参考电压。
但实际操作中,ADS122U04的参考电压是外部REF引脚上的电压,也就是Rref上的电压。所以Code_ref对应的是满量程,Code_rtd对应的是RTD电压。计算时直接用Code_rtd / Code_ref × Rref即可。
float calculate_rtd_resistance(int32_t code_rtd, int32_t code_ref, float rref) { // 防止除零 if (code_ref == 0) return -1.0f; // 比例法计算 float ratio = (float)code_rtd / (float)code_ref; float rtd_resistance = rref * ratio; return rtd_resistance; }4.3 PT1000阻值转温度的计算
PT1000的阻值温度关系不是线性的,但在-200°C到+850°C范围内可以用Callendar-Van Dusen方程描述。对于0°C以上的温度,公式是:
R(t) = R0 × (1 + A×t + B×t²)
其中R0=1000Ω,A=3.9083×10^-3,B=-5.775×10^-7。反解温度t需要解二次方程:
t = (-A + sqrt(A² - 4B(1 - R/R0))) / (2B)
这个公式在0°C到850°C范围内精度很高,误差小于0.01°C。对于0°C以下的温度,需要加上C项,但HVAC场景一般不会低于-40°C,用二次方程外推也能接受,误差在0.1°C以内。
float rtd_to_temperature(float resistance) { const float R0 = 1000.0f; const float A = 3.9083e-3f; const float B = -5.775e-7f; float ratio = resistance / R0; float discriminant = A * A - 4.0f * B * (1.0f - ratio); if (discriminant < 0) return -999.0f; // 错误 float temp = (-A + sqrtf(discriminant)) / (2.0f * B); return temp; }如果你不想在MCU里跑浮点运算,也可以用查表法。PT1000温度对照表每隔1°C存一个阻值,然后线性插值。这样计算量小,精度也能到0.01°C。我一般用查表加插值,因为RA4L1虽然有FPU,但中断里做浮点运算还是尽量少用。
4.4 温度数据的滤波与PID输入处理
原始温度数据即使经过20SPS滤波,还是会有小幅跳动。我在固件里加了一级滑动平均滤波,窗口大小8,相当于0.4秒的平滑。对于PID控制,这个延迟可以接受。如果控制周期是1秒,那滤波窗口可以再大一点,比如16。
PID部分,HVAC温度控制通常用位置式PID,积分限幅和输出限幅都要做。我遇到过一个问题:冬天制热时,温度从10°C升到20°C,PID积分项累积很大,到了20°C后还在继续加热,导致超调。解决办法是加积分分离,当误差大于某个阈值时,只让PD起作用,误差小了再引入积分。这个技巧在温度控制里很实用。
5. 常见问题与排查技巧实录
5.1 温度读数跳动大怎么办
这是最常见的问题。排查顺序是这样的:
- 先看数据速率。如果设的是1000SPS,跳动大是正常的,切到20SPS试试。
- 检查激励电流。电流太小,信号弱,噪声相对大;电流太大,自热严重。250μA到500μA是比较好的平衡点。
- 检查参考电阻。参考电阻的温漂和精度直接影响结果。用万用表量一下实际阻值,和标称值差多少。
- 检查电源噪声。用示波器看AVDD上的纹波,如果超过10mV,就要加滤波。
- 检查接地。模拟地和数字地是不是单点连接?RTD的屏蔽线有没有接地?
我遇到过一次,跳动达到±1°C,最后发现是RTD的引线太长,而且和电机的动力线捆在一起走。分开走线后,跳动降到±0.05°C。
5.2 读数始终偏高或偏低
如果读数有固定偏差,通常是这几个原因:
- 参考电阻精度不够。0.1%的电阻,在1000Ω上就是1Ω的误差,对应PT1000大约0.26°C。所以参考电阻至少用0.1%精度,最好0.05%。
- 引线电阻未补偿。两线制接法会引入引线电阻,每米铜线大约0.02Ω,对应0.005°C。三线制能抵消,但前提是三根线等长。
- 自热效应。激励电流太大,RTD自身发热。用250μA时自热约0.003°C,可以忽略;用1mA时自热约0.05°C,就要考虑了。
- ADC增益误差。ADS122U04的增益误差典型值0.01%,对应0.026°C,不大但存在。可以在软件里做单点校准。
5.3 UART通信失败
ADS122U04的UART有个特点:它不支持自动波特率,必须MCU主动发命令。如果通信失败,先检查:
- 波特率是不是115200?ADS122U04默认是115200,但可以改。
- TX和RX是不是接反了?这个低级错误我犯过不止一次。
- 隔离器的方向对不对?数字隔离器的A侧和B侧不能搞混。
- 电源上电顺序。ADS122U04的DVDD要先于AVDD上电,否则可能锁死。如果做不到,加一个复位电路。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 读数跳动大 | 数据速率过高 | 切到20SPS | 降低速率 |
| 读数跳动大 | 电源纹波大 | 示波器看AVDD | 加LC滤波 |
| 读数跳动大 | 接地不良 | 检查地平面 | 单点接地 |
| 固定偏差 | 参考电阻精度低 | 万用表测量 | 换0.05%电阻 |
| 固定偏差 | 引线电阻 | 检查接法 | 改三线制 |
| 通信失败 | 波特率不对 | 查手册 | 设115200 |
| 通信失败 | TX/RX反接 | 检查接线 | 交换TX/RX |
| 通信失败 | 上电顺序 | 查电源 | 加复位 |
| 温度响应慢 | 滤波窗口大 | 检查代码 | 减小窗口 |
| 温度超调 | 积分饱和 | 检查PID | 加积分分离 |
5.5 几个容易被忽略的实操心得
第一个心得:ADS122U04的DRDY引脚一定要用。有些工程师图省事,用延时等待转换完成,结果数据速率一变,延时就不准了。DRDY是硬件信号,最可靠。
第二个心得:参考电阻要放在ADC旁边,不要放在RTD旁边。RTD可能安装在远处,引线长,如果参考电阻也放远处,引线电阻会影响参考电压。放在ADC旁边,引线短,影响小。
第三个心得:PT1000的屏蔽线只在一端接地。两端接地会形成地环路,引入干扰。我一般是在MCU侧接地,RTD侧悬空。
第四个心得:定期自校准。ADS122U04支持内部零点和满量程校准,可以在上电时做一次,消除偏移误差。命令是0x06和0x07,具体看手册。
第五个心得:温度换算用查表法比公式法更稳。公式法在MCU里做浮点开方,不同编译器的math库精度不一样,查表法结果一致,而且快。
6. 系统集成与HVAC场景的适配
6.1 多路温度采集的扩展
HVAC系统通常需要多路温度,比如回风温度、送风温度、室外温度、水温。ADS122U04只有一路差分输入,但可以通过外部多路复用器扩展。我用的是CD4051或者TMUX1308,8通道模拟多路复用器,配合ADS122U04的MUX,可以做到16路。切换通道后要等一段时间让信号稳定,我一般等10ms,然后再启动转换。
多路采集时,参考电阻只需要一个,因为电流源是共享的。但要注意,多路复用器的导通电阻会影响精度。CD4051的导通电阻大约100Ω,和PT1000的1000Ω比是10%,这个误差很大。解决办法是用低导通电阻的复用器,比如TMUX1308的导通电阻只有5Ω,影响降到0.5%,再在软件里校准一下就行。
6.2 与PLC和上位机的通信
R7FA4L1BD4CFP的通信外设很全,UART、SPI、I2C都有。和PLC通信一般用Modbus RTU,走RS485。RA4L1的UART支持RS485的DE控制,硬件上加一个RS485收发器就行。Modbus寄存器里放温度值,PLC轮询读取。
如果走无线,可以用LoRa或者Wi-Fi模块,通过UART和MCU连接。数据上报周期根据场景定,HVAC一般30秒到5分钟一次。低功耗模式下,MCU可以休眠,定时器唤醒,采集一次,上报,再休眠。
6.3 标定与长期稳定性
工业产品出厂前要标定。我的做法是:用高精度温度源(比如干体炉)产生0°C、50°C、100°C三个点,记录ADC读数,然后拟合一条直线,把斜率和截距写到MCU的Flash里。现场安装后,如果发现偏差,可以通过Modbus写寄存器做单点偏移校准。
长期稳定性方面,PT1000本身年漂移小于0.05°C,ADS122U04的增益漂移典型值1ppm/°C,参考电阻的温漂25ppm/°C。整体年漂移估计在0.1°C以内,对于HVAC控制足够了。如果要求更高,可以每年校准一次。
6.4 低功耗设计的实际考量
HVAC设备不全是市电供电,有些是电池或者能量收集。R7FA4L1BD4CFP的低功耗模式在这种情况下很有用。我的配置是:正常采集时48MHz全速运行,采集完切到32kHz低速模式,UART唤醒。ADS122U04在两次采集之间可以进入掉电模式,电流降到0.1μA。整体平均电流可以做到100μA以下,用一节18650电池能撑好几年。
但低功耗有个代价:每次唤醒后,ADS122U04需要重新建立参考电压和激励电流,稳定时间大约10ms。如果采集周期是1分钟,这10ms的额外功耗可以忽略。如果采集周期是1秒,那就不划算了,不如一直开着。
7. 写在最后的一些个人体会
这套ADS122U04加R7FA4L1BD4CFP的方案,我从第一版打样到现在批量用了大概两年,出货量不大,几百套,但现场反馈一直很稳。中间也踩过不少坑,比如隔离DC-DC的噪声、参考电阻的温漂、多路复用器的导通电阻,每一个都是实际调试出来的经验。
如果你正准备做类似的项目,我的建议是:先把ADS122U04的评估板买回来,用信号源模拟PT1000的阻值变化,把比例法算通,再画自己的板子。不要一上来就画板,那样调试周期会很长。另外,PT1000的选型也很重要,国产的和进口的差在长期稳定性上,短期看不出区别,跑一年就明显了。
温度测量这个事,原理不复杂,但细节决定成败。24位ADC给了你高分辨率,但如果不注意布局、滤波、校准,有效精度可能还不如一个校准好的12位系统。希望这些经验能帮你少走点弯路。