☰
基于ADS122U04与PIC18LF45K40的高精度温度采集系统设计
2026/11/5 1:10:17 网站建设 项目流程

做工业测控这些年,我有个越来越深的感受:温度是最常见也最容易翻车的物理量。你看着不就是测个热敏电阻嘛,可真要在一个变频器嗡嗡叫、压缩机频繁启停的暖通现场,把温度稳定做到±0.2°C,ADC的选型和信号链设计就变得非常关键。最近我完成了一套基于TI ADS122U04IPWR和Microchip PIC18LF45K40的温湿度采集方案,用来同时覆盖空调箱回风、盘管、冷水管和压缩机排气口这几种典型测温点。这篇文章不是 datasheet 复读,而是把我从选型到量产调试的完整链路——传感器配伍、硬件接线、24位ADC的寄存器配置、PIC端固件、精度校准,以及现场踩过的坑——全部梳理一遍,给做工业测控和HVAC控制器的工程师当个参考。

1. 为什么是“24位ADC+8位MCU”这对组合

1.1 单片机内置ADC为什么不够用

很多朋友拿到项目第一反应是:PIC18LF45K40 本身带12位ADC,直接用不就行了?我也这么想过,但实际一算账就放弃了。

PIC18LF45K40 内置ADC满量程参考电压一般取2.048V,12位分辨率对应一个LSB大约0.5mV。PT100在0°C附近灵敏度大约0.385Ω/°C,用1mA激励电流时信号变化只有0.385mV/°C。也就是说,理论上每个ADC码大概对应1.3°C的温度步进,这精度做HVAC控制完全不够看。就算把参考电压降低、只采集小信号,精度也受限于内部ADC的线性度和噪声。

而且RTD测量还需要一个稳定的恒流源去激励传感器。用MCU的IO口去开关电阻网络做恒流、再配合内置ADC,电路能跑但精度和稳定性都不行,热漂移能把你的0.2°C指标吃干净。与其折腾这些,不如直接用一片专用测量ADC,把从激励到采样的整个模拟前端都交给硬件。

1.2 ADS122U04核心价值在哪里

ADS122U04 是一颗24位Δ-Σ型ADC,带四路模拟输入通道。我对它印象最深的一点是:它把RTD测量需要的激励电流源、可编程增益放大器、2.048V参考电压、内部温度传感器全集成在一颗TSSOP-16封装里。以往做一套PT100采集卡,运放、恒流源、基准电压、ADC各一颗,现在一片全搞定。

它还有个在工业场景里很实用的特性:UART接口。多数测量ADC用的是SPI或I2C,ADS122U04选择走串口,这样传感器板到主控板之间只需要两根信号线,做数字隔离也简单,加两个ISO7721之类的隔离器就能把模拟前端浮地。UART协议本身对时序的要求比SPI宽松,线缆稍微长一点照样跑。PIC18LF45K40 一个EUSART就把ADC收编了,MCU剩下的外设资源还能去处理风机PWM、阀门控制和Modbus通信。

1.3 PIC18LF45K40在这套系统里的分工

PIC18LF45K40是3.3V低压版本,工作电压1.8V~3.6V,可以直接和ADS122U04共用一个3.3V电源轨,省掉电平转换电路。工业温度范围是-40°C~125°C,HVAC控制柜里那种夏天能烤鸡蛋的环境也没问题。

它属于K40系列,带一批Core Independent Peripherals,像CLC可配置逻辑单元、NCO数控振荡器、PWM模块这些,很适合做暖通控制器。8位MCU在这个领域依然有优势:EMC行为比高频MCU好预测,供应链稳定,价格漂亮。64MHz工作频率跑24位浮点运算也不吃力,因为ADC数据速率只有20SPS,CPU占用率非常低。

提示:如果你的项目对成本更敏感,可以把PIC18LF45K40换成同系列的PIC18F45K40,软件基本不用改,只是电源范围不一样。对批量产品来说,这种兼容性省下来的事很多。

2. 传感器配伍:RTD、热电偶、NTC在HVAC/工业里的真实取舍

2.1 三类传感器特性对比

HVAC系统里常见的温度传感器无非三种:NTC热敏电阻、PT100/PT1000铂电阻、热电偶。它们各有各的脾气,选型选错了,后面精度做得再高也是白搭。我习惯先列一张对比表再决定每个测点用它。

传感器类型测温范围典型灵敏度线性度激励要求主要麻烦典型场景
NTC 10k-40~150°C约-4%/°C差需要电流激励非线性、互换性差、自热回风温度、室温
PT100/PT1000-200~600°C0.385Ω/°C较好需要恒流激励线阻、自热盘管水温、工业过程
K型热电偶-200~1200°C约40µV/°C近似线性无激励,需冷端补偿信号极小、冷端温度要准排烟、压缩机排气

在空调箱项目里,回风温度这种常规测点用NTC就够了,响应快、成本低;水管温度和盘管防冻保护我坚持用PT100;压缩机排气温度必须用K型热电偶,因为排气温度可能超过150°C,NTC和PT100都到极限了。

2.2 RTD的四线、三线、两线接法

RTD本质上是个电阻,测量靠激励电流通过传感器产生电压。问题在于传感器到ADC之间的导线也有电阻,两线制接法把导线电阻直接算进了RTD阻值,几十米线缆的铜阻可能就是好几欧姆,对应好几度的误差。

四线制最理想:两根线走激励电流,两根线单独感测RTD两端电压,压降完全被排除。但工业上为了省电缆,多数用三线制。ADS122U04有两个可编程激励电流源IIDAC1和IIDAC2,正好匹配三线RTD:一路电流从RA引脚流经RTD,另一路互补电流从RB引脚流出,两条导线电阻产生的误差被对称抵消。

我的建议:HVAC场景优先三线制,线缆成本可控,精度足够。实验室或计量级才上四线。

2.3 热电偶的冷端补偿不能想当然

热电偶测量的是热端和冷端之间的温差,冷端温度必须已知且准确,才能还原出真实温度。ADS122U04内部集成了一个半导体温度传感器,可以读取芯片附近温度,但说实话它的绝对精度有几度的量级,直接拿来做冷端补偿,热电偶读数误差很可能到好几摄氏度。

正确做法是在热电偶接线端子根部放一个精密NTC或独立温度传感器芯片,让冷端参考点紧贴着接线位置,然后把这个参考温度读回来。PCB布局上要把热电偶接线端子、参考传感器、ADS122U04尽量放在同一块覆铜等温区内,别让旁边有发热元件把等温面撕开。这个坑我在第一版PCB上踩过,后面专门开了一节细说。

2.4 NTC:省钱,但别忽略它的脾气

NTC热敏电阻便宜、灵敏度高,但非线性严重,而且批次一致性是个大问题。普通±1%精度的NTC在25°C基准电阻偏差换算下来就是零点几度的误差,高温段更夸张。ADS122U04的高分辨率允许我们把激励电流降到0.1mA,大大降低NTC自热误差,但传感器本身的离散性只能靠校准兜底。

如果产品要求全量程±0.2°C,老实说普通NTC做不到,那必须选±0.1%的高精度NTC,或者直接换PT1000。PT1000灵敏度只有PT100的十分之一左右,但ADS122U04的PGA增益足够把它放大,实际使用中PT1000在HVAC领域越来越流行,线阻影响更小。

3. 硬件系统设计:从传感器到ADC再到PIC的完整链路

3.1 系统框图与信号流向

这套系统的信号链路我很推崇,简单清晰:传感器信号先经过输入保护和RC滤波,进入ADS122U04的差分输入;ADS122U04把模拟量转成24位数字量,通过UART发给PIC18LF45K40;PIC十八号负责所有逻辑:温度换算、滤波、Modbus通信、LED显示、阀门和风机控制。

  • 传感器 → ESD/TVS保护 → 差分RC滤波 → ADS122U04 AINx输入
  • ADS122U04 UART_TX/UART_RX → 数字隔离器(可选) → PIC18LF45K40 EUSART1
  • PIC侧外设输出 → RS-485/Modbus、LCD、PWM风机、继电器、故障报警
  • 供电:24VAC/DC → 防护 → 5V DCDC → 3.3V LDO → 模拟部分π型滤波

这个架构最大的好处是ADC板和主控板可以物理分离。空调箱现场,传感器接线往往汇集到一个接线盒,把ADS122U04放在接线盒端,就近数字化,再用UART把数字信号传回主控板,抗干扰能力比传模拟信号强太多。

3.2 关键引脚连接参考

我列一个典型接线表,ADS122U04的部分以TSSOP-16封装为例:

ADS122U04引脚连接到说明
AVDD / DVDD3.3V经过π型滤波后的模拟电源模拟和数字电源分别滤波
AVSS模拟地单点连接数字地
AIN0 / AIN1差分输入(如PT100两端)可配置通道
AIN2 / AIN3第二通道或热电偶输入多通道选择
REFP / REFN外部参考电容使用比例测量时可参考RA/RB
RA / RB外部精密电阻两端产生IIDAC参考电压
UART_TXPIC的RX引脚注意方向
UART_RXPIC的TX引脚注意方向
CLK外部时钟(可选)默认用内部时钟也能跑

3.3 电源和参考电压的细节

温度测量精度再高,电源不干净也白搭。我习惯先把24V转成5V,再用低噪声LDO降到3.3V。3.3V给数字部分供电后,再经过一组RC或LC滤波单独给AVDD,把数字开关噪声和模拟电路隔开。

ADS122U04内部有2.048V参考电压,旁路电容要靠近器件引脚放,0.1µF和1µF各一个。如果走比例测量模式,外部精密电阻R_ref的温漂系数必须低,我用25ppm甚至10ppm的金属膜电阻,放在RA/RB引脚旁边,尽量缩短走线。比例模式的原理是让参考电压和激励电流都来自同一个IIDAC,电流漂移和基准漂移被同时抵消,精度大幅度提升。

3.4 输入保护电路要舍得加

工业现场不是实验室桌面,传感器线缆可能暴露在变频器、接触器旁边,甚至可能被人误触碰到24V。我在输入端加SMBJ3.3A或PESD类的TVS管,配合1kΩ串联电阻和10nF~100nF差分电容,既保护ADC又抑制射频干扰。

有一点要注意:串联电阻加大会抬高信号源阻抗,Δ-ΣADC内部采样电容充放电时会从输入端抽取电荷,如果差分电容不够大,读数会不稳。经验值是差分电容至少10nF,用100Ω~1kΩ串联电阻,RC时间常数和ADC数据速率匹配。

4. ADS122U04 关键配置:寄存器、激励电流、PGA、数据速率与UART命令

4.1 四个配置寄存器与推荐值

ADS122U04的配置集中在四个配置寄存器里,分别是CONFIG0~CONFIG3。不同型号的ADS122系列寄存器布局基本一致,但具体bit位还是要以手上的数据手册为准。我常用的配置组合如下:

配置项推荐值适用场景
PGA增益8倍PT100比例测量
PGA增益128倍K型热电偶
PGA增益4~8倍NTC测量
数据速率20SPS50/60Hz干扰强的HVAC现场
参考源内部参考通用测量
参考源比例模式三线RTD高精度
激励电流1mAPT100
激励电流0.5mAPT1000
激励电流0.1mANTC降低自热
内部温度传感器使能热电偶冷端辅助参考

4.2 为什么20SPS是HVAC常用档位

ADS122U04的Δ-Σ调制器后面有个数字抽取滤波器,它的陷波频率跟数据速率相关。把数据速率设在20SPS时,滤波器对50Hz和60Hz电网干扰都有显著抑制,典型衰减有几十dB甚至更高。这个档位对国内50Hz电网和海外60Hz地区都友好,产品出口不用换配置。

代价是输出延迟大约50ms,对温度这种慢变量完全无所谓。如果项目所在地区电网频率确定,可以把速率提到30SPS或60SPS,对50Hz或60Hz的抑制更强,响应也更快。

4.3 PGA增益不是越大越好

PGA增益的坑在于饱和。ADC内部参考电压是2.048V,增益太大就会让信号超量程削波,输出码直接顶到满幅,温度读数变成一条直线。

拿PT100举例:0~200°C时阻值约100~175.84Ω,用1mA激励,信号电压是100~175.84mV。如果内部参考2.048V,增益选16倍,最大信号变成2.81V,远超参考电压,必削波。增益选8倍,最大1.4V,留有余量,可以。

热电偶更明显。K型热电偶大约40µV/°C,0~500°C信号20mV,用128倍增益后是2.56V,也超了。所以真要测到500°C以上,增益得降到64或32,或者接受更小的满量程范围。选增益前,把最大信号电压算清楚,再对照数据手册的增益量程表。

4.4 UART命令流与代码骨架

ADS122U04的UART协议格式简单理解就是:地址字节+命令字节+数据字节。具体的命令码和应答帧结构以数据手册为准,这里给一个逻辑骨架,你在工程里把宏定义换成手册里的实际命令值即可。

// 写配置寄存器(示意流程,命令码以数据手册为准) void ADS122U04_WriteReg(uint8_t reg, uint8_t val) { uint8_t frame[3]; frame[0] = ADS122U04_ADDR; // 7位设备地址 + 读写位 frame[1] = CMD_WREG | reg; // 写寄存器命令组合 frame[2] = val; UART1_WriteArray(frame, 3); } // 读一次转换结果 int32_t ADS122U04_ReadData(void) { uint8_t cmd = CMD_RDATA; uint8_t buf[4]; UART1_Write(&cmd, 1); UART1_ReadArray(buf, 4); // 3字节数据 + 状态字节 uint32_t code = ((uint32_t)buf[0] << 16) | ((uint32_t)buf[1] << 8) | buf[2]; if (code & 0x800000UL) code |= 0xFF000000UL; // 24位转32位有符号 return (int32_t)code; }

初次上电别急着读数据。Δ-Σ数字滤波器需要时间建立,连续转换模式下至少要丢弃前面两到三帧,否则读出来的是滤波器未稳定状态下的值,看起来像噪声。我习惯在初始化完成后延时100ms,再连续清空几次读缓冲区,然后才开始正式采样。

5. PIC18LF45K40 固件:串口驱动、滤波与温度换算

5.1 UART初始化容易踩的坑

PIC18LF45K40内部HFINTOSC振荡器在工业温度范围内精度可能在±2%左右。如果拿它直接产生UART波特率,-40°C和85°C下波特率偏移可能超过串口容限,出现偶发乱码。我第一次打样就是图省事用内部振荡器,结果低温测试时串口丢包,查了一天最后用外部16MHz晶振才解决。

下面是UART1初始化示意代码,用XC8编译,波特率19200:

void UART1_Init(void) { TRISC6 = 0; // TX(PIC侧)输出 TRISC7 = 1; // RX(PIC侧)输入 BAUD1CON1bits.BRG16 = 1; TX1STA1bits.BRGH = 1; // 以16MHz晶振为例,计算SPBRG SPBRGL1 = (uint8_t)(16000000UL / (16UL * 19200UL) - 1); RC1STA1bits.SPEN = 1; TX1STA1bits.TXEN = 1; RC1STA1bits.CREN = 1; PIR4bits.RC1IF = 0; PIE4bits.RC1IE = 1; // 接收中断使能 INTCONbits.PEIE = 1; INTCONbits.GIE = 1; }

波特率寄存器计算要看手册里的公式,不同BRGH/BRG16组合差别很大,直接抄网上代码容易翻车。

5.2 从原始码换算到电阻值

比例测量模式下,温度换算公式并不复杂。ADS122U04输出是24位二进制补码,正满量程大约对应0x7FFFFF。如果外部精密电阻是R_ref,PGA增益是G,则:

R_RTD = (code × R_ref) / (G × 8388607.0)

因为参考电压和激励电流来自同一个IIDAC,激励电流的大小被约掉了,参考电压的漂移也被约掉了,这就是比例测量最大的价值。如果你用固定2.048V参考而不是比例模式,公式里的R_ref要替换成V_ref除以激励电流。

PIC18LF45K40是8位MCU,乘法运算要注意溢出。code接近8388607,R_ref如果取2500Ω,乘积接近200亿,32位整数放不下。我的做法是直接用浮点:

float r_rtd = 0.0f; float r_ref = 2490.0f; // 实际精密电阻标称值 int32_t code; #define PGA_GAIN 8.0f #define POS_FS 8388607.0f code = ADS122U04_ReadData(); r_rtd = (float)code * r_ref / (PGA_GAIN * POS_FS);

20SPS数据速率下,CPU算这点浮点绰绰有余。注意浮点运算放在主循环,不要放进UART中断里,中断只做数据搬运,避免中断服务程序时间过长影响其他外设。

5.3 温度换算用查表比算方程省心

PT100的温度-电阻关系可以用Callendar-Van Dusen方程算,但方程带迭代,在8位机上写起来啰嗦。我的实际做法是做一个温度-电阻的查找表,存到Flash里,间隔5°C一个点,线性插值。在0~200°C范围内,5°C间隔插值引入的误差远小于0.01°C,完全够用。

NTC用Steinhart-Hart方程,三个系数可以从厂家拿到,也可以用三点校准自己拟合。热电偶麻烦一点,但HVAC范围有限,建议用查表和冷端补偿多项式组合。

5.4 软件滤波的度怎么拿捏

ADS122U04自身已经有数字抽取滤波,数据出来相对干净,但工业现场干扰还是可能让个别点跳变。我习惯在MCU里做两级处理:先做一次5点中值滤波踢掉毛刺,再做4~16点滑动平均平滑输出。

窗口大小直接影响响应速度。16点滑动平均在20SPS速率下延迟0.8秒,HVAC温控没问题;如果做压缩机排气温度保护,响应要快,窗口用4点。控制逻辑和显示数据可以走不同的滤波深度,显示用大窗口求稳定,控制用小窗口求实时。

6. 精度、噪声与校准:把“看起来准”变成“真的准”

6.1 误差预算怎么拆

很多人以为24位ADC就等于24位精度,这是最大的误区。真实系统误差来自好几个方面:

误差源典型量级抑制手段
ADC噪声0.5~2µVrms选低增益、低数据速率
参考电压漂移10~20ppm/°C比例测量模式
传感器本身误差0.1~0.3°C选用高精度等级探头
导线电阻单线1~5Ω三线/四线接法
自热温升0.05~0.2°C降低激励电流
PCB热电势0.1~1µV/°C等温设计,减小梯度

在20SPS、PGA=8的条件下,ADS122U04的有效分辨率做到18~19位很常见,换算到PT100就是0.01°C级别的温度步进。可传感器本身的误差反而成了大头,PT100 A级探头在0°C的允差就有±0.15°C。因此整个系统精度目标定±0.3°C比较现实,想做到±0.1°C就要传感器、校准、环境控制一起上。

6.2 两点校准和三点校准流程

校准的基本原则是消除ADC增益误差和偏移误差。我用标准电阻箱模拟RTD阻值,比如PT100在0°C对应100Ω、100°C对应138.51Ω,先把阻值档位切到位,让系统读码,再计算增益和偏移系数。

校准流程大致如下:

  1. 系统上电预热30分钟,让板温稳定。
  2. 用0.01%精密电阻箱接入PT100通道,拨到0°C对应阻值,记录原始码raw0。
  3. 拨到100°C对应阻值,记录原始码raw100。
  4. 计算增益系数gain = (100°C阻值 - 0°C阻值) / (raw100 - raw0)。
  5. 计算偏移offset = raw0 × gain - 0°C阻值。
  6. 把gain和offset写入EEPROM,每次上电加载。

三点校正在0°C、50°C、100°C三点做分段插值,能补偿传感器非线性残差,HVAC里50°C附近是水温常经过的区域,值得做。校准的时候连接线缆要和最终使用长度一致,否则三线制补偿优势会被破坏。

6.3 我在校准上踩过的坑

第一个坑是冰水混合物校准0°C。看起来简单,实际操作中如果冰少水多,混合物温度会比0°C高零点几度,要等热平衡并搅拌后才能读数。更靠谱的是用恒温槽。

第二个坑是沸水校准100°C。高海拔地区水的沸点不到100°C,直接用沸水标定会引入系统性偏差。工业上建议用干体炉或恒温槽取代这种土办法。

第三个坑是热电偶冷端补偿。ADS122U04内部温度传感器读到的芯片温度,和热电偶端子实际温度可能差好几度,因为PCB上有铜皮导热、空气对流、发热器件辐射。我在接线端子根部额外放一个精密NTC,并把NTC和端子都放在同一块覆铜等温区里,问题才解决。做热电偶输入的产品千万别省这个NTC。

7. HVAC与工业现场的专属坑:从实验室到产线

7.1 湿度、凝露和气流对传感器的影响

HVAC现场和干燥的工业控制柜不一样,风管里湿度高,冷水管表面常年凝露。PCB打上三防漆是基础操作,连接器也要选防水的。传感器探头的位置直接影响动态响应:回风温度测点如果装在送风口附近,读到的根本不是回风温度;风管内的探头必须有足够的插入深度,否则测的是管壁边界层温度,反应慢半拍。

水管表面贴装的温度传感器,必须做好保温层。裸露的管壁温度受环境温度影响很大,传感器测的是"管子表面的温度"而不是"水温",这两个差好几度在HVAC里很常见。

7.2 变频器时代的EMC现实

现在的空调箱几乎都有变频风机,变频器对模拟采样系统的干扰是灾难级的。我的布线经验:模拟输入一律用屏蔽双绞线,屏蔽层单端接地;传感器线缆不要和动力线在同一个线槽里,至少要隔开20cm以上;如果确实避不开,就在ADC输入端加强RC滤波,把干扰先闷掉。

软件上,5点中值滤波几乎是必须的。现场变频器一启动,ADC读数经常冒出一个跳变点,中值滤波能干净地踢掉。更严重的场合,我会在UART链路上加数字隔离器,把模拟部分浮地,让共模电压没机会进入信号链。

7.3 量产一致性与生产测试策略

实验室里跑得好和产线上每台都好,是两码事。我把每块板的校准系数写进PIC的数据EEPROM,生产测试时用标准电阻盒模拟PT100的0°C、50°C、100°C三个点,通过RS-485读回温度,判断是否在误差范围内。这个测试架很简单,但能从源头拦住偏差大的板子。

ADS122U04还支持探头断线检测功能,通过配置一个小的激励电流就能判断传感器是否开路。HVAC现场探头断线是最高频的故障,断线时如果直接把ADC输出变成一个大数,显示-200°C,维护人员会一头雾水。我在固件里把断线状态识别出来,上报"传感器故障"故障码,现场维护效率提升一大截。

量产阶段还要把原理图库和物料清单整理好,ADS122U04和PIC18LF45K40的引脚封装别搞混,TSSOP-16的脚距很小,PCB加工和贴片都要盯紧。温度测量系统出问题往往不在某个大环节,而是这些小细节层层叠加。


这套架构最后稳定跑在了客户的空调箱控制柜里。回头看,温度测量系统七成功夫在模拟前端和校准,两成在传感器选型,剩下一成才是MCU代码。ADS122U04和PIC18LF45K40这对组合,把过去需要运放、基准源、ADC、MCU一堆器件才能搭起来的信号链,简化成用一个UART串口就能读数的方案。如果你也在做类似项目,建议先想清楚传感器和PCB布局,再动手调寄存器——这两件事做对了,基本就成功了一大半。

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

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

立即咨询