1. 工业测温项目的整体方案设计
1.1 为什么选ADS122U04IPWR加STM32F217ZG这个组合
工业现场和HVAC系统里的温度测量,跟实验室里拿个万用表测室温完全是两码事。工业场景下,传感器可能离采集板几十米远,周围有变频器、接触器、大功率电机在疯狂开关,电磁环境极其恶劣。同时,HVAC系统对温度精度的要求又很实在——送风温度差个一两度,整个楼层的舒适度就崩了,能耗也会跟着上去。所以选型的时候,核心矛盾就三个:分辨率要够高、抗干扰要够强、长期稳定性要够好。
ADS122U04IPWR这颗芯片,24位ΔΣADC,内置PGA,四路单端或者两路差分输入,最关键的是它自带UART接口。传统的高精度ADC基本都是SPI接口,SPI在板内通信没问题,但一旦要走长线,时钟线和数据线之间的时序就容易出问题。UART是异步通信,对时钟同步不敏感,配合隔离器件做长距离传输时,可靠性明显高一个档次。而且这颗芯片的PGA增益可以到128倍,直接接PT100或者热电偶这种小信号传感器,不需要额外的前置放大电路,BOM能省一大截。
STM32F217ZG这颗MCU,Cortex-M3内核,带FPU,主频120MHz,关键是它有ART加速器,Flash执行效率比同频的F1系列高不少。工业测温这种应用,MCU要干的活其实不少:要跑数字滤波、要处理UART协议、要驱动显示屏、要管理报警输出、可能还要跑Modbus或者BACnet协议栈。F217ZG的192KB RAM和1MB Flash,足够把这些任务都塞进去,不用外扩存储。而且它的工作温度范围是-40到85度,工业级标准,跟ADS122U04IPWR的-40到125度能匹配上。
注意:ADS122U04IPWR的封装是TSSOP-16,引脚间距0.65mm,手工焊接难度不小。如果是要做小批量验证,建议直接买转接板,别硬着头皮往PCB上焊,虚焊导致的漂移问题能让你查三天三夜。
1.2 系统架构的拆解与信号链规划
整个测温系统的信号链,从传感器到最终输出,可以拆成五段:传感器激励与采集、模拟前端调理、ADC转换、MCU处理、通信与输出。每一段都有坑,我逐个说。
传感器这块,工业上用得最多的就三种:PT100/PT1000铂电阻、K型热电偶、还有半导体温度传感器比如LM35。PT100的优点是线性度好、稳定性高,缺点是阻值小,100欧姆在0度的时候,1度对应0.385欧姆,激励电流稍微不稳,读数就飘。热电偶的优点是测温范围宽,能到上千度,但输出信号极小,K型热电偶在室温附近大概41微伏每度,而且需要冷端补偿。半导体传感器最简单,但测温范围窄,一般只到150度,工业高温场景用不了。
我这次方案主要针对PT100和热电偶两种,因为HVAC和工业场景里这两种占了八成以上。ADS122U04IPWR的PGA可以设成增益1到128,PT100用增益8到16比较合适,热电偶用增益64到128。激励电流方面,ADS122U04IPWR内部有恒流源,可以配置成10微安到1.5毫安,PT100建议用500微安到1毫安,太小了噪声占比大,太大了自热效应明显。
STM32F217ZG这边,UART接口接ADS122U04IPWR,波特率建议用115200或者更高,因为24位数据加上状态字节,一次转换结果大概4到5个字节,如果每秒采20次,115200完全够用。MCU内部要做的事情包括:解析ADC数据帧、做数字滤波、查表或者用公式换算温度、驱动本地显示、通过RS485或者以太网往上位机传数据。
1.3 关键器件的参数对比与选型依据
选ADC的时候,我对比过几款常见的方案,列个表更直观:
| 型号 | 分辨率 | 接口 | PGA | 通道数 | 工作温度 | 封装 |
|---|---|---|---|---|---|---|
| ADS122U04IPWR | 24位 | UART | 有,1-128 | 4单端/2差分 | -40~125 | TSSOP-16 |
| ADS1220 | 24位 | SPI | 有,1-128 | 4单端/2差分 | -40~125 | TSSOP-16 |
| AD7124-4 | 24位 | SPI | 有,1-128 | 4差分/7单端 | -40~125 | LFCSP-32 |
| MAX31865 | 15位 | SPI | 无 | 1差分 | -40~125 | TSSOP-20 |
ADS122U04IPWR跟ADS1220其实是同一颗芯片的不同接口版本,内部ADC核心是一样的。选UART版本的理由前面说了,长线传输更稳。AD7124-4性能确实好,但LFCSP封装对PCB要求高,而且SPI接口在长线场景下需要额外的隔离和驱动。MAX31865是专门给PT100用的,内置了激励和线性化,但分辨率只有15位,而且只能测PT100,灵活性差一些。
STM32F217ZG跟F103或者F407比,F217ZG的优势在于:带FPU做浮点运算快、ART加速器让Flash执行接近零等待、外设资源丰富。F103没有FPU,做温度换算的时候用浮点会慢很多;F407性能更强但价格高,对于测温这种不算特别吃算力的应用有点浪费。F217ZG算是性能和成本的平衡点。
2. 硬件电路设计的核心细节
2.1 模拟前端电路的布局与走线要点
ADS122U04IPWR的模拟输入端,Layout是决定成败的关键。我见过太多人原理图抄得一模一样,但PCB一画出来噪声就压不下去。核心原则就一条:模拟地和数字地分开,单点连接,且连接点尽量靠近ADC的GND引脚。
具体来说,ADS122U04IPWR的AGND和DGND在芯片内部是分开的,PCB上应该分别铺铜,然后在芯片下方用0欧姆电阻或者磁珠单点连接。模拟输入走线要尽量短,差分对要等长、靠近,最好包地处理。激励电流的输出线如果走长线到传感器,建议用屏蔽双绞线,屏蔽层接模拟地。
参考电压这块,ADS122U04IPWR可以用内部2.048V基准,也可以用外部基准。内部基准的温漂是5ppm每度,对于大多数工业测温场景够用了。但如果要求更高精度,比如0.1度以内,建议用外部基准,比如REF5025,温漂3ppm每度,初始精度0.05%。外部基准的走线要远离数字信号,基准电容要用低ESR的钽电容或者陶瓷电容,容值按手册推荐来,一般是1微法到10微法。
实操心得:ADS122U04IPWR的模拟输入引脚内部有ESD保护二极管,如果传感器接线错误导致输入电压超过AVDD或者低于AVSS,二极管会导通,大电流可能烧芯片。建议在输入端串一个100欧姆的电阻,再加一个BAT54S双二极管做钳位,成本不到两毛钱,但能救回一颗几十块的ADC。
2.2 电源设计与去耦电容的选型计算
ADS122U04IPWR的供电范围是2.3V到5.5V,模拟部分和数字部分可以分开供电,也可以共用。如果共用,建议用LDO单独给ADC供电,不要跟MCU或者继电器共用一路。LDO的选型要看噪声和PSRR,比如TPS7A4700,噪声4微伏RMS,PSRR在1kHz有70dB,很适合给高精度ADC供电。
去耦电容的配置,手册上一般会给典型值,但实际布局的时候要注意:每个电源引脚都要有独立的去耦电容,且电容要尽量靠近引脚。ADS122U04IPWR的AVDD和DVDD各需要一个0.1微法的陶瓷电容,再加一个1微法到10微法的钽电容做 bulk。0.1微法的电容要用X7R或者C0G材质,别用Y5V,Y5V的容值随电压和温度变化太大,等于没接。
STM32F217ZG这边,每个VDD引脚也要配0.1微法电容,VDDA单独用磁珠或者电感从VDD隔离,再配1微法加0.1微法。晶振电路要靠近MCU,负载电容按晶振手册选,一般22皮法到33皮法。如果用到USB或者以太网,那部分电源也要单独处理。
2.3 隔离与保护电路的设计思路
工业现场最怕的就是地环路和浪涌。传感器如果离采集板很远,两边的地电位可能差几十伏甚至上百伏,不隔离的话,轻则读数跳变,重则烧芯片。隔离方案有两种:数字隔离和模拟隔离。
数字隔离是在ADC和MCU之间做隔离,用数字隔离器比如ADuM1201或者Si8620,把UART的TX、RX隔离掉。这样ADC和传感器共地,MCU和上位机共地,两边完全断开。优点是成本低、实现简单,缺点是ADC的供电也要隔离,需要一路隔离电源模块。
模拟隔离是在传感器和ADC之间做隔离,用隔离放大器或者隔离ADC。优点是隔离点在模拟端,ADC和MCU可以共地,缺点是隔离放大器的精度和温漂通常不如直接采集,而且成本高。
我这次方案用的是数字隔离,因为ADS122U04IPWR本身是UART接口,隔离起来方便。隔离电源用B0505S或者类似的模块,给ADC侧供电。保护方面,传感器输入端加TVS管,比如SMBJ5.0A,钳位电压选6.5V左右,再加自恢复保险丝,防止持续过流。
3. 固件开发与温度换算的实现
3.1 ADS122U04IPWR的寄存器配置与初始化流程
ADS122U04IPWR的寄存器不多,一共四个:配置寄存器0到3。初始化的时候,先发复位命令,然后依次写配置寄存器。关键配置项包括:输入多路选择器、增益、数据速率、转换模式、基准选择、激励电流。
以PT100为例,假设用AIN0和AIN1做差分输入,增益设成8,数据速率设成20SPS,基准用内部2.048V,激励电流用500微安从AIN2输出。配置寄存器0的值大概是:MUX设成0000(AIN0和AIN1差分),GAIN设成011(增益8),PGA使能。配置寄存器1设数据速率和转换模式,20SPS对应的是正常模式。配置寄存器2设基准和激励电流,内部基准,激励电流500微安。配置寄存器3设IDAC的引脚路由。
初始化代码大概长这样:
void ADS122U04_Init(void) { uint8_t cmd; // 复位 cmd = 0x06; HAL_UART_Transmit(&huart1, &cmd, 1, 100); HAL_Delay(1); // 写配置寄存器0 cmd = 0x40; // 写寄存器0 HAL_UART_Transmit(&huart1, &cmd, 1, 100); cmd = 0x08; // MUX=0000, GAIN=011, PGA使能 HAL_UART_Transmit(&huart1, &cmd, 1, 100); // 写配置寄存器1 cmd = 0x42; // 写寄存器1 HAL_UART_Transmit(&huart1, &cmd, 1, 100); cmd = 0x00; // 20SPS, 正常模式 HAL_UART_Transmit(&huart1, &cmd, 1, 100); // 写配置寄存器2 cmd = 0x44; // 写寄存器2 HAL_UART_Transmit(&huart1, &cmd, 1, 100); cmd = 0x10; // 内部基准, 激励电流500uA HAL_UART_Transmit(&huart1, &cmd, 1, 100); // 写配置寄存器3 cmd = 0x46; // 写寄存器3 HAL_UART_Transmit(&huart1, &cmd, 1, 100); cmd = 0x00; // IDAC路由到AIN2 HAL_UART_Transmit(&huart1, &cmd, 1, 100); }注意:ADS122U04IPWR的UART接口默认波特率是115200,但它是自适应波特率的,上电后第一帧数据用来同步。如果MCU的波特率跟它不一致,通信会失败。建议MCU这边也设成115200,并且上电后先发一个同步字节0x55,等ADC回一个响应再开始配置。
3.2 PT100与热电偶的温度换算算法
PT100的换算,工业上常用两种方法:查表法和公式法。查表法精度高但占Flash,公式法省空间但计算量大。我一般用Callendar-Van Dusen公式,在0到850度范围内,PT100的阻值跟温度的关系是:
R(t) = R0 * (1 + At + Bt^2)
其中R0是100欧姆,A是3.9083e-3,B是-5.775e-7。反推温度的时候,需要解二次方程:
t = (-A + sqrt(A^2 - 4B(1 - R/R0))) / (2*B)
这个公式在0度以上精度很好,0度以下需要加C项,但HVAC场景基本都在0度以上,可以忽略。STM32F217ZG有FPU,算这个公式大概几十个时钟周期,20SPS的采样率下完全没压力。
热电偶的换算更复杂,因为输出电压跟温度是非线性的,而且需要冷端补偿。K型热电偶的电压跟温度关系可以用多项式拟合,NIST给的标准系数有9项,算起来比较费劲。实际工程中,我一般用分段线性插值,把-200到1372度分成若干段,每段用线性近似,精度能到0.5度以内。冷端补偿用一颗LM75或者DS18B20测冷端温度,加到热电偶的热端电压上再查表。
代码实现上,PT100的换算函数大概这样:
float PT100_ConvertToTemp(float resistance) { float R0 = 100.0f; float A = 3.9083e-3f; float B = -5.775e-7f; float temp; if (resistance >= R0) { // 0度以上 float discriminant = A*A - 4*B*(1 - resistance/R0); temp = (-A + sqrtf(discriminant)) / (2*B); } else { // 0度以下,用线性近似 temp = (resistance - R0) / (R0 * A); } return temp; }3.3 数字滤波与抗干扰策略
工业现场的噪声主要来自工频干扰和开关电源的开关噪声。工频是50Hz或者60Hz,开关电源一般是几十kHz到几百kHz。ADS122U04IPWR的ΔΣ调制器本身有sinc滤波器,对高频噪声抑制很好,但工频附近的噪声需要额外处理。
最有效的办法是设置数据速率跟工频同步。比如50Hz工频,数据速率设成20SPS,因为20SPS的转换周期是50ms,正好是50Hz的两个周期,sinc滤波器在50Hz和100Hz处有零点,能有效抑制工频干扰。如果工频是60Hz,数据速率设成16.6SPS或者20SPS也行,20SPS在60Hz处抑制稍微差一点,但也能接受。
软件滤波方面,我一般用滑动平均加中值滤波。滑动平均取8到16个点,能平滑随机噪声;中值滤波取5个点,能去掉脉冲干扰。两个结合起来,效果比单一滤波好很多。STM32F217ZG的RAM够大,开两个数组完全没问题。
#define FILTER_SIZE 16 float moving_avg_buf[FILTER_SIZE]; uint8_t buf_index = 0; float MovingAverage(float new_val) { float sum = 0; moving_avg_buf[buf_index] = new_val; buf_index = (buf_index + 1) % FILTER_SIZE; for (int i = 0; i < FILTER_SIZE; i++) { sum += moving_avg_buf[i]; } return sum / FILTER_SIZE; }实操心得:如果现场有变频器,工频干扰可能不是标准的50Hz,而是47到53Hz之间飘。这时候固定数据速率就不管用了。我的做法是先用示波器看噪声频谱,确定主要干扰频率,然后选一个能避开这个频率的数据速率。ADS122U04IPWR的数据速率选项挺多的,5SPS到2000SPS都有,总能找到一个合适的。
4. 系统调试与常见问题排查
4.1 通信失败与数据异常的排查流程
调试的时候,最常见的问题就是UART通信失败。现象是MCU发命令,ADC没反应,或者返回的数据全是0xFF。排查步骤我一般按这个顺序来:
第一步,用示波器看ADC的TX引脚有没有波形。如果没有,说明ADC没工作,检查供电和复位引脚。ADS122U04IPWR的复位引脚是低电平复位,正常工作时应该是高电平。如果复位引脚一直是低,芯片就一直在复位状态。
第二步,如果TX有波形但数据不对,检查波特率。ADS122U04IPWR的波特率是自适应的,但自适应需要一定的时间。上电后先等100ms,再发同步字节0x55,等ADC回0x55之后再发配置命令。如果MCU的波特率跟ADC不一致,同步会失败。
第三步,如果通信正常但数据跳变厉害,检查基准电压和激励电流。用万用表测REF引脚,应该是2.048V。如果偏差超过1%,可能是基准电容没接好或者基准被负载拉低了。激励电流可以用万用表串在回路里测,500微安的话,万用表电流档能测出来。
第四步,如果数据稳定但偏差大,检查传感器接线。PT100是三线制还是四线制?三线制需要补偿线阻,四线制不需要。ADS122U04IPWR支持两线、三线、四线制,配置寄存器里要设对。三线制的时候,两根激励线要分别接在PT100的两端,第三根线接在其中一个激励端,用来测线阻。
4.2 温度读数漂移与噪声问题的解决
温度读数漂移,分两种情况:短期漂移和长期漂移。短期漂移一般是噪声引起的,表现为读数在某个值附近上下跳。长期漂移是缓慢变化,可能跟温度、时间有关。
短期漂移的解决办法:先看噪声来源。如果是工频干扰,按前面说的设数据速率。如果是电源噪声,在ADC的AVDD引脚加一个LC滤波,电感用10微亨,电容用10微法加0.1微法。如果是传感器引线太长,用屏蔽线,屏蔽层接模拟地。
长期漂移的解决办法:先看基准。内部基准的温漂是5ppm每度,如果环境温度变化20度,基准变化100ppm,对应到24位ADC大概是1600个码,换算成温度大概是0.1度左右。如果要求更高,换外部基准。再看传感器。PT100本身有温漂,工业级的PT100温漂大概是几十ppm每度,比ADC的基准温漂小,一般不是主要问题。最后看PCB。如果PCB上有大功率器件,热辐射到ADC或者基准上,也会引起漂移。布局的时候把ADC和基准远离发热源。
注意:ADS122U04IPWR的内部温度传感器可以用来监测芯片温度,但它的精度只有正负1度,不能用来做冷端补偿。冷端补偿要用独立的温度传感器,比如DS18B20或者LM75,精度至少0.5度。
4.3 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 通信无响应 | 供电异常、复位引脚低、波特率不匹配 | 测供电电压、测复位引脚、示波器看TX波形 | 检查LDO输出、拉高复位引脚、重新同步波特率 |
| 数据全0xFF | UART配置错误、ADC未初始化 | 读配置寄存器回读值 | 重新初始化、检查UART引脚映射 |
| 读数跳变 | 工频干扰、电源噪声、传感器线太长 | 示波器看输入信号、测电源纹波 | 设数据速率同步工频、加LC滤波、用屏蔽线 |
| 读数偏差大 | 基准不准、激励电流不对、传感器接线错误 | 测REF电压、测激励电流、检查接线 | 校准基准、调整激励电流、改三线制或四线制 |
| 长期漂移 | 基准温漂、PCB热辐射、传感器老化 | 记录不同温度下的读数、红外测温看PCB | 换外部基准、优化布局、更换传感器 |
| 自热效应明显 | 激励电流太大 | 测传感器温升 | 减小激励电流、用脉冲激励 |
4.4 校准与长期稳定性验证
校准是保证精度的最后一步。我一般用两点校准:冰水混合物0度和沸水100度(注意气压修正)。把PT100放进冰水混合物里,等读数稳定,记录ADC码值;再放进沸水里,记录ADC码值。然后用这两点算增益和偏移。
校准的时候要注意:冰水混合物要搅拌,保证温度均匀;沸水的温度跟气压有关,标准大气压下是100度,如果海拔高,沸点会低。可以用高精度温度计做参考,比如二等标准水银温度计,精度0.05度。
长期稳定性验证,我一般做72小时连续老化。把采集板放在恒温箱里,设成25度,每10分钟记录一次读数,看漂移量。如果72小时漂移小于0.1度,基本就稳了。如果漂移大,检查基准和传感器的长期稳定性。
STM32F217ZG这边,可以开一个定时器,每小时自动记录一次读数到Flash里,方便后期分析。Flash的擦写次数有限,不要频繁写,一天写一次就够了。
5. 实际应用中的经验与扩展思路
5.1 工业现场部署的注意事项
工业现场部署,跟实验室完全是两个世界。我踩过的坑包括:接地不良导致读数跳变、变频器干扰导致通信中断、雷击导致芯片烧毁。
接地方面,采集板的地要单独接大地,不要跟电机或者变频器的地共用。如果现场没有独立地线,可以用一块铜板埋在地下做简易地线。信号线的屏蔽层要单端接地,不要两端都接,否则会形成地环路。
变频器干扰方面,采集板要远离变频器,至少一米以上。如果实在避不开,用金属外壳屏蔽,外壳接大地。UART通信线用双绞屏蔽线,屏蔽层接采集板的地。
雷击防护方面,传感器如果在室外,输入端要加气体放电管或者压敏电阻。采集板的电源入口加TVS管和自恢复保险丝。通信线加防雷器,比如网络防雷器或者RS485防雷器。
5.2 从单点测温到多点组网的扩展
单点测温做完了,下一步就是多点组网。HVAC系统里,一个楼层可能有几十个测温点,每个点都拉一根线到中央控制器不现实。这时候可以用RS485总线,每个采集板作为一个节点,通过Modbus RTU协议跟主控通信。
STM32F217ZG的UART可以接RS485收发器,比如MAX485或者SP3485。Modbus RTU的帧格式是:地址码、功能码、数据、CRC校验。每个采集板设一个唯一地址,主控轮询各个节点。波特率用9600或者19200,距离能到1200米。
如果节点更多,可以用CAN总线或者以太网。STM32F217ZG自带以太网MAC,加一个PHY芯片就能上网。以太网的好处是速度快、距离远,而且可以直接接交换机,组网灵活。缺点是成本高、功耗大,适合节点多、数据量大的场景。
5.3 低功耗设计与电池供电的可行性
有些HVAC场景,比如无线温度传感器,需要电池供电。ADS122U04IPWR的功耗跟数据速率有关,20SPS的时候大概几百微安,2000SPS的时候几毫安。STM32F217ZG在低功耗模式下可以降到几十微安。
电池供电的话,建议用间歇工作模式:MCU大部分时间在待机,定时器唤醒后给ADC上电,采一次数据,处理完再休眠。这样平均电流可以降到几十微安,一节18650电池能用好几年。
具体实现:用RTC定时器,每10分钟唤醒一次。唤醒后先给ADS122U04IPWR上电,等100ms稳定,然后启动转换,读数据,处理,关ADC电源,MCU再进待机。待机电流大概2微安,加上ADC和传感器的功耗,平均下来大概20微安。2000毫安时的电池,理论能用10万小时,实际打对折也有5年。
实操心得:低功耗设计的时候,GPIO的状态很重要。未使用的引脚要设成模拟输入或者输出低,不要浮空,浮空的引脚会漏电。UART的TX引脚在待机的时候要设成输出高,因为ADS122U04IPWR的RX引脚内部有上拉,如果MCU的TX浮空,会有电流从ADC流到MCU。
5.4 固件升级与远程维护的实现
工业设备装到现场后,固件升级是个麻烦事。如果每次都要拆机接调试器,维护成本太高。我的做法是通过UART做IAP升级。STM32F217ZG的Flash可以分成两部分:Bootloader和Application。Bootloader负责接收新固件并写入Application区,Application负责正常功能。
升级流程:上位机通过RS485发送升级命令,MCU收到后跳转到Bootloader,Bootloader通过UART接收固件数据,写入Flash,校验通过后跳回Application。Bootloader的代码要尽量简单,只做Flash擦写和UART收发,避免升级过程中出问题。
远程维护方面,可以加一个看门狗,如果程序跑飞,看门狗复位后自动重启。还可以加一个错误日志区,记录通信错误、传感器故障等信息,方便后期分析。STM32F217ZG的备份寄存器可以在复位后保留数据,用来记录复位原因。
这个方案我从实验室验证到现场部署,前后折腾了小半年,中间踩的坑比预想的多得多。但一旦跑通,稳定性确实好,连续运行一年多没出过问题。如果你也在做类似的工业测温项目,希望这些经验能帮你少走点弯路。