1. 从一颗温度传感器说起:为什么HVAC场景需要本地与远程双路监测
做嵌入式暖通空调(HVAC)项目的人,大概都遇到过这种尴尬:设备面板上显示的温度和实际体感差了两三度,用户投诉说"你们这个温控器不准",但拆开一看,传感器本身没问题,问题出在测温点的位置和信号链路上。HVAC系统里,温度监测从来不是"接一颗传感器读个数"这么简单——它同时涉及本地温度(设备所在位置的实时环境温度)和远程温度(分布在风管、回风口、室外或远端房间的测温点),两者在精度要求、响应速度、抗干扰能力和布线成本上完全是两套逻辑。
我最近在做一个HVAC控制器的温度采集方案,核心器件选的是PJ85718DM这颗温度传感器配合STM32F373VC微控制器。选这套组合不是拍脑袋决定的,而是在对比了热敏电阻加运放、数字温度芯片、以及分立式方案之后,基于精度、成本和开发效率综合权衡的结果。PJ85718DM是一颗支持本地与远程双通道测温的传感器件,本地通道测芯片自身所在环境温度,远程通道则通过外接测温元件(通常是低成本的热敏电阻或二极管接法)来采集远端温度。STM32F373VC则是ST旗下带16位Sigma-Delta ADC的Cortex-M4 MCU,这个ADC特性在温度采集里非常关键,后面会详细展开。
这篇文章面向的是正在做HVAC、嵌入式温控、环境监测类项目的工程师,或者手里有STM32平台、想搞清楚"本地+远程温度到底怎么接、怎么算、怎么校准"的开发者。我会把选型逻辑、硬件连接、ADC配置、温度换算、校准方法和实际踩过的坑都讲清楚,尽量做到你拿着这篇文章就能把方案跑起来。需要说明的是,文中涉及的具体寄存器配置和参数是基于常见工程实践给出的合理方案,实际项目里你需要结合自己手上的数据手册做最终确认。
2. PJ85718DM与STM32F373VC的选型逻辑:为什么不是随便配一颗MCU
2.1 温度传感器选型的三个硬指标
在HVAC场景里挑温度传感器,我一般看三个东西:测温范围、精度、以及远程测温能力。HVAC的环境温度通常在-20℃到+80℃之间,风管和室外场景可能更极端,所以传感器至少要覆盖-40℃到+125℃这个工业级区间。精度方面,本地温度做到±0.5℃以内、远程温度做到±1℃以内,基本能满足大多数温控需求。但真正拉开差距的是第三点——能不能同时测本地和远程。
很多项目一开始只用一颗数字温度芯片测本地,结果发现设备发热、面板温升导致读数偏高,这时候就需要一个远程测温点来"看"真实环境。PJ85718DM的价值就在这里:它把本地通道和远程通道集成在一颗器件里,省掉了额外布一颗传感器和一路信号调理的成本。远程通道接热敏电阻的好处是热敏电阻便宜、体积小、可以拉长线放到风管里,缺点是线性度差、需要校准;而PJ85718DM内部做了线性化处理,把这块复杂度吃掉了。
2.2 STM32F373VC的16位Sigma-Delta ADC为什么是加分项
STM32F373VC属于STM32F3系列,主频72MHz,Cortex-M4内核带FPU,这些是常规配置。它真正特殊的地方是集成了16位Sigma-Delta ADC(SDADC),这个外设在温度采集里价值很大。普通12位SAR ADC的分辨率是4096个刻度,而16位SDADC有65536个刻度,对于热敏电阻这种非线性、小信号变化的传感器来说,高分辨率意味着你能更精细地分辨温度变化,尤其是在温度变化缓慢、需要高稳定性的HVAC场景里。
Sigma-Delta架构的另一个好处是过采样和噪声整形,它对高频噪声的抑制能力比SAR ADC强,这在有风机、压缩机等干扰源的HVAC环境里很重要。当然代价是转换速度慢一些,但温度本身变化就慢,这个 trade-off 完全可以接受。我用SDADC采集远程热敏电阻分压信号,实测下来噪声水平比用12位ADC低了一个数量级,后面校准章节会给出具体数据。
2.3 这套组合的边界在哪里
说清楚适用边界比一味吹优点更重要。PJ85718DM加STM32F373VC这套方案,适合中高精度、双路测温、成本敏感但不想牺牲性能的场景。如果你的项目只需要单点测温、精度要求±2℃就够,那用一颗普通数字温度芯片加8位MCU更划算。如果你需要多点(比如8路以上)远程测温,那可能要考虑多路模拟开关或者换成支持多通道的专用采集芯片。这套方案的最佳甜点区是:1路本地加1到2路远程,精度要求±1℃以内,有电磁干扰但不算极端恶劣的HVAC控制板。
3. 硬件连接:本地通道与远程通道的电路设计细节
3.1 本地测温通道的走线与去耦
本地通道相对简单,PJ85718DM的本地感温元件就在芯片内部,你只需要保证芯片本身处于你想要测量的环境里就行。但这里有个容易被忽略的点:芯片自身的功耗会导致自热。如果供电电压偏高、采样频繁,芯片内部温升可能比环境高0.5℃到1℃。我的做法是把本地通道的采样间隔拉长到1秒以上,并且在布局时让芯片远离MCU和其他发热器件,至少保持5mm以上的间距。
去耦方面,PJ85718DM的电源引脚旁边必须放一颗0.1μF的陶瓷电容,紧贴引脚放置,再并一颗1μF的储能电容。HVAC板子上风机和继电器动作会产生电源纹波,这两颗电容能有效滤掉高频干扰。我实测过,去掉0.1μF电容后,本地温度读数会出现±0.3℃的随机跳动,加上之后就稳定在±0.1℃以内。
3.2 远程通道的热敏电阻接法与分压计算
远程通道是这套方案的重点。PJ85718DM的远程输入通常接一颗NTC热敏电阻,配合一个上拉或下拉电阻构成分压网络。假设你用一颗10kΩ的NTC(25℃时阻值10kΩ,B值3950),接法是:VREF经过一个10kΩ的精密电阻(精度0.1%)连到远程输入引脚,NTC从该引脚接到地。这样在25℃时,分压点电压正好是VREF的一半。
分压电压的计算公式是:
V_remote = VREF × R_ntc / (R_pullup + R_ntc)其中R_ntc随温度变化,NTC的阻温关系用Beta公式近似:
R_ntc = R25 × exp(B × (1/T - 1/298.15))T是开尔文温度,R25是25℃时的标称阻值,B是材料常数。这个公式在-20℃到+80℃范围内误差可以控制在0.5℃以内,够用了。如果你要更高精度,可以用Steinhart-Hart三系数方程,但计算量大一些,STM32F373VC带FPU,跑起来毫无压力。
3.3 远程走线的抗干扰处理
远程测温点往往离主板有一段距离,风管里的测温点拉个一两米线很正常。这段线是干扰的重灾区。我的经验是:用屏蔽双绞线,屏蔽层单端接地,接地点选在主板的地,不要两端都接,否则会形成地环路。另外在远程输入引脚旁边加一颗RC低通滤波,比如1kΩ电阻串一颗100nF电容到地,截止频率约1.6kHz,能把风机产生的高频噪声挡掉大半。
还有一点,远程热敏电阻的引线电阻会引入误差。如果线长超过2米,线阻可能有零点几欧姆,对于10kΩ的NTC来说影响很小(小于0.01℃),可以忽略。但如果你用的是低阻值NTC(比如1kΩ),线阻的影响就不能忽视了,这时候建议用三线制接法来补偿。
4. SDADC配置与温度换算:从原始码值到摄氏度
4.1 SDADC的初始化与通道映射
STM32F373VC的SDADC有三个,每个支持多路差分或单端输入。我用SDADC1的通道来采远程热敏电阻的分压信号,配置成单端模式,增益设为1,参考电压用内部VREF或外部精密基准。初始化的大致流程是:使能SDADC时钟,配置SDADC的时钟分频,设置通道的增益和输入模式,然后启动校准,最后使能连续转换模式。
这里有个坑:SDADC的校准必须在配置通道之前做,而且校准期间不能有输入信号变化。我一般上电后先做一次校准,把校准值存下来,之后正常运行时不再重复校准。如果环境温度变化很大(比如从冬天到夏天),可以定期重新校准,但频率不用太高,一天一次足够。
4.2 采样数据的读取与滤波
SDADC输出的是16位有符号数,读取时要注意数据对齐方式。我配置成右对齐,读出来直接就是原始码值。由于温度变化慢,我会做滑动平均滤波,取32个采样点求平均,这样能把随机噪声压下去。实测下来,32点平均后,远程温度的波动从±0.5℃降到±0.05℃,效果非常明显。
滤波的代码逻辑很简单,用一个环形缓冲区存最近的32个采样值,每次新采样进来就替换最旧的值并重新求和。STM32F373VC的RAM足够,这点开销可以忽略。如果你想要更平滑的效果,可以用一阶IIR滤波,系数取0.1左右,响应会慢一点但更稳。
4.3 从码值反推温度的完整计算链
拿到滤波后的码值,换算成温度分三步。第一步,把码值转成电压:
V = code × VREF / 65536第二步,从电压反推NTC阻值:
R_ntc = R_pullup × V / (VREF - V)第三步,用Beta公式反解温度:
1/T = 1/298.15 + (1/B) × ln(R_ntc / R25) T_celsius = 1/T - 273.15这三步里,第二步和第三步涉及除法和对数运算,用FPU跑起来很快,一次换算大概几十微秒。我建议把R_pullup、R25、B值这些参数做成宏定义或者存在Flash里的校准参数,方便不同批次的热敏电阻替换。
4.4 本地通道的换算差异
本地通道的换算和远程不一样,因为PJ85718DM的本地通道通常直接输出数字量或者一个与温度成正比的电压,具体取决于器件的工作模式。如果是数字输出,直接读寄存器就行;如果是模拟输出,换算公式是线性的:
T_local = (V_local - V_offset) / V_per_degreeV_offset和V_per_degree这两个参数必须从数据手册里查,不同批次的器件可能有细微差异,所以本地通道也需要单点校准,后面会讲。
5. 校准:让读数真正可信的关键一步
5.1 为什么出厂参数不够用
理论上,你拿着数据手册的标称参数就能算出温度,但实际项目里,热敏电阻的批次离散性、分压电阻的精度、SDADC的增益误差、参考电压的偏差,这些因素叠加起来,能让读数偏个一两度。HVAC客户对温度精度的容忍度通常在一度以内,所以校准不是可选项,是必选项。
我做过一个统计,同一批10kΩ NTC,25℃时阻值分布在9.8kΩ到10.2kΩ之间,对应温度误差约±0.5℃。再加上分压电阻如果用1%精度的,又引入±0.3℃。SDADC的增益误差典型值±0.2%。这些加起来,不校准的话误差可能到±1℃以上。
5.2 两点校准法的实操步骤
我推荐用两点校准:在已知温度的两个点上测出原始码值,反算出实际的R25和B值,或者直接拟合一条线性修正曲线。具体操作是:把远程热敏电阻放到冰水混合物里(0℃)测一组码值,再放到恒温槽里(比如50℃)测一组码值,记录下这两组数据。
然后用这两组数据反推修正参数。如果你用Beta公式,可以联立两个方程解出R25和B。如果嫌麻烦,也可以直接用线性插值修正:把理论计算值和实测值之间的偏差做成一个查找表,运行时查表补偿。我一般用后者,简单可靠,代码量小。
5.3 本地通道的单点校准
本地通道的校准更简单,因为它的响应是线性的。把整块板子放到恒温箱里,设定一个已知温度(比如25℃),等热平衡后读本地通道的码值,和理论值比较,算出一个偏移量,存到Flash里。运行时把这个偏移量加到读数上就行。注意校准时要等足够长时间让板子整体达到热平衡,我一般等15分钟以上。
5.4 校准数据的存储与版本管理
校准参数一定要存在非易失存储器里,STM32F373VC内部有Flash,可以划一个扇区专门存校准数据。我习惯在Flash里存一个结构体,包含校准日期、校准温度点、修正参数、以及一个CRC校验值。每次上电读取时校验CRC,如果校验失败就用默认参数并报一个警告。这样能避免Flash损坏导致读数完全错乱。
另外,如果产品要批量生产,校准数据的管理很重要。我建议给每块板子分配一个唯一ID,校准数据和生产记录绑定,方便追溯。这个在HVAC这种对可靠性要求高的行业里尤其重要。
6. 实测中的干扰问题与排查链路
6.1 风机启动时温度跳变的排查过程
项目调试阶段遇到一个典型问题:风机一启动,远程温度读数就跳变0.5℃到1℃,风机停了就恢复。这个现象很明显是电磁干扰,但具体从哪进来的需要一步步排查。
我的排查链路是这样的:第一步,用示波器看远程输入引脚的电压波形,发现风机启动瞬间有几十毫伏的尖峰。第二步,把远程热敏电阻的线缩短到10厘米,跳变消失,说明干扰是从长线耦合进来的。第三步,加上屏蔽双绞线和RC滤波后,尖峰降到几毫伏,温度跳变控制在0.1℃以内。第四步,在软件里加了一个中值滤波,把偶发的野值剔除掉,彻底解决。
这个排查过程说明,干扰问题要软硬结合解决,光靠软件滤波不够,硬件上该做的屏蔽和滤波不能省。
6.2 SDADC参考电压波动导致的读数漂移
另一个坑是参考电压。我一开始用MCU的VDDA做SDADC参考,结果发现电源电压波动时,温度读数跟着漂。因为分压比的计算依赖VREF,VREF一变,反推的阻值就错了。后来换成外部精密基准芯片,漂移从±0.3℃降到±0.05℃。
如果你不想加外部基准,也有个软件补偿的办法:用SDADC的一个通道去测一个已知的精密参考电压,实时算出VREF的实际值,再用这个值去做换算。这样能省一颗基准芯片,但多占一个ADC通道,看你的资源取舍。
6.3 自热效应与采样频率的平衡
前面提过本地通道的自热问题,远程通道其实也有类似情况。如果给热敏电阻的激励电流太大,NTC自身会发热,读数偏高。我用的分压电路里,激励电流大概是VREF除以20kΩ,3.3V下约0.165mA,NTC的功耗约0.27mW,自热引起的温升小于0.01℃,可以忽略。但如果你用更小的分压电阻,比如1kΩ,电流就到1mA以上,自热就不可忽视了。
所以分压电阻的选择要在信号幅度和自热之间平衡。阻值大,信号内阻高,容易受干扰;阻值小,自热大。10kΩ左右是个比较舒服的甜点区。
7. 从样机到量产:这套方案还需要注意什么
7.1 器件一致性与来料检验
样机阶段用的器件往往是精挑细选的,量产时批次一致性就成了问题。我的做法是:热敏电阻和分压电阻都选0.1%精度的,虽然贵一点,但省掉了大量校准工时。PJ85718DM本身的一致性不错,但每批来料还是要抽检,用恒温槽测几个点,确认偏差在可接受范围内。
7.2 生产校准的工装设计
量产校准需要工装。我设计过一个简单的校准工装:一个恒温槽,能设定两个温度点,配合一个夹具把板子固定住,远程热敏电阻浸在槽里。产线工人按提示切换温度点,上位机软件自动读取码值、计算修正参数、写入Flash。整个流程一块板子大概3分钟,效率可以接受。
7.3 长期漂移与现场再校准
热敏电阻长期使用会有老化漂移,通常每年零点几度。HVAC设备寿命动辄十年以上,所以现场再校准的能力要有。我在固件里留了一个校准接口,通过通信总线可以触发再校准,用户拿一个标准温度计放在测温点旁边,输入实际温度,固件自动修正偏移。这个功能在实际运维里很受欢迎。
7.4 故障检测与安全策略
温度传感器断线或短路时,读数会跑到极端值。固件里必须做合理性检查:如果远程温度读数超出-40℃到+125℃的范围,或者变化率超过每秒5℃,就判定为故障,切换到本地温度作为备份,并上报故障码。这个策略在HVAC里很重要,因为温度失控可能导致设备损坏或能耗飙升。
我在实际项目里还加了一个冗余判断:如果本地和远程温度差异超过10℃且持续30秒以上,也报一个警告,提示可能有一个通道出了问题。这个逻辑帮我抓到过一次远程热敏电阻虚焊的案例,当时读数只是略微偏高,不仔细看根本发现不了。
8. 一些零散但值钱的经验
关于PJ85718DM和STM32F373VC这套组合,还有几个点值得单独拎出来说。第一,SDADC的输入阻抗不是无限大,配置成单端模式时输入阻抗大概几十kΩ,所以分压电阻不能选太大,否则会分压不准。我一般把分压网络的总阻值控制在20kΩ以内。第二,SDADC的转换启动需要一点时间,第一次读出来的数据可能不准,建议丢弃前几个采样值。第三,STM32F373VC的SDADC和普通ADC共用一些引脚,配置时要注意别冲突。
还有一点关于PCB布局:模拟部分和数字部分要分开,SDADC的输入走线尽量短,远离时钟线和电源线。地平面要完整,模拟地和数字地单点连接。这些是老生常谈,但在HVAC这种干扰环境下,做和不做差别很大。我见过一个项目因为地平面被分割得七零八落,温度读数噪声大到没法用,重新layout之后问题消失。
最后说个软件上的小技巧:温度换算里的对数运算,如果嫌浮点慢,可以用查表加线性插值代替。把-40℃到+125℃分成256段,每段存一个阻值,运行时查表插值,速度快很多,精度也够。这个方法在低端MCU上很常用,STM32F373VC虽然性能够,但如果你要跑很多路温度采集,查表法能省不少CPU时间。