1. 项目缘起与整体设计思路嵌入式温度监测这个方向看起来简单实际上坑特别多。我最早接触这类需求是在一个暖通空调控制器的改造项目里当时的需求很朴素本地要能看到实时温度远程中控室也要能读到同一路数据而且两边的读数不能打架。最开始想用一颗数字温度传感器直接怼到MCU的I2C上就完事结果实测发现本地显示和远程上报之间总有几十毫秒的延迟抖动遇到长线缆时数据还会偶发跳变。后来换了一套组合方案——用PJ85718DM做模拟前端采集STM32F410RB做本地处理与协议转换才把这个问题彻底摁住。这套组合的核心逻辑其实不复杂PJ85718DM负责把温度探头热电偶、RTD或者热敏电阻的微弱模拟信号调理成干净的数字量STM32F410RB负责读取、校准、做本地显示同时通过串口或无线模块把数据打包发出去。为什么选这两颗器件PJ85718DM在工业级温度采集里算是比较稳的前端内置PGA和ADC对K型热电偶的冷端补偿做得比较到位STM32F410RB是F4系列里比较轻量的一颗Cortex-M4内核带FPU跑浮点运算和滤波算法不费劲而且外设资源刚好够用——一个I2C或SPI接前端一个UART接远程再来个定时器做采样节拍引脚数也不多做小体积板子很合适。这个项目适合谁看如果你正在做HVAC的温控器、机房环境监控、冷库温度记录仪或者任何需要“本地远程”双路温度监测的嵌入式设备这套思路可以直接抄。哪怕你用的是别的MCU或别的温度前端里面的采样时序设计、滤波策略、双路数据一致性处理这些经验也是通用的。我下面会把整个设计拆开讲包括为什么这么选、参数怎么算、代码怎么写、坑怎么避尽量让刚入行的朋友也能跟着做出来。2. 核心器件选型与硬件设计要点2.1 PJ85718DM 前端采集的关键参数解读PJ85718DM这颗芯片很多人拿到手册第一眼会被它的寄存器表吓到其实常用的就那么几个。它的核心是一个24位Σ-Δ ADC前面挂了一个可编程增益放大器增益可以设1到128倍。做温度采集时增益的选择直接决定了你能分辨多小的温度变化。举个例子假设你用PT100铂电阻在0℃时阻值100Ω温度系数约0.385Ω/℃。如果你用1mA的激励电流那么每变化1℃电阻变化0.385Ω产生的电压变化就是0.385mV。如果PGA设成128倍ADC满量程假设是±2.5V那么最小可分辨电压是5V/2^24≈0.3μV折算到温度就是0.3μV/(0.385mV/℃×128)≈0.006℃这个分辨率对于HVAC来说绰绰有余。但增益不是越大越好。增益大了输入共模范围会变窄而且噪声也会被放大。我实测下来PT100在-50℃到150℃范围内PGA设32倍是比较平衡的选择既能保证0.02℃左右的分辨率又不会因为增益过高导致信号饱和。如果是K型热电偶输出信号更小大约41μV/℃这时候PGA得设到64或128倍同时要特别注意冷端补偿的精度因为冷端每差1℃整个读数就偏1℃。PJ85718DM内部还有一个关键功能是斩波稳定这个功能对低频温度信号特别有用。温度变化本身很慢但电源噪声和1/f噪声会混进来斩波稳定可以把这些低频噪声调制到高频再滤掉等效于把噪声底噪压得很低。我在一个冷库项目里对比过开斩波和关斩波读数波动能从±0.5℃降到±0.05℃效果非常明显。所以只要你的采样率要求不高温度采集一般10Hz以内足够强烈建议把斩波打开。2.2 STM32F410RB 的资源分配与接口规划STM32F410RB这颗MCU100个引脚Flash 128KBRAM 32KB跑温度监测这种任务绰绰有余。但资源分配上还是得动点脑筋因为你要同时干三件事读前端、刷本地显示、发远程数据。我的做法是让定时器TIM2做1Hz的采样节拍每次溢出触发一次ADC读取通过SPI或I2C读PJ85718DM读完之后在中断里只做最紧急的事——把原始数据存到环形缓冲区然后置一个标志位。主循环里再去做滤波、显示刷新和远程发送。这样中断响应快又不会因为显示刷新这种耗时操作阻塞采样。接口分配上PJ85718DM我一般用SPI接因为SPI速率高读24位数据加上状态位也就几个字节用硬件SPI加DMA几乎不占CPU时间。远程通信看场景如果是走RS485到中控室就用USART2加一个收发器如果是走无线就用USART1接无线模组波特率设9600或115200都行。本地显示如果用段码屏用几个GPIO直接驱动如果用OLED就再挂一个I2C注意I2C地址别和前端冲突。我遇到过有人把前端和OLED挂在同一个I2C总线上结果OLED刷新时干扰了前端读数后来分开到两个总线才解决。电源部分也要留意。PJ85718DM的模拟电源和数字电源最好分开走线模拟电源用LDO单独供数字电源可以共用。STM32F410RB的VDDA和VDD之间要加磁珠和电容滤波不然MCU的数字噪声会串到模拟前端导致读数跳动。我在第一版板子上没注意这个温度读数每隔几秒就跳一下后来在VDDA上加了10μF钽电容加100nF陶瓷电容问题就消失了。2.3 温度探头的匹配与冷端补偿设计探头选型取决于你的测温范围和精度要求。HVAC里常见的是NTC热敏电阻便宜但线性度差需要查表或拟合PT100/PT1000线性好精度高但成本也高热电偶适合高温但需要冷端补偿。PJ85718DM对这三种都支持关键在配置。NTC的话我一般用10kΩ B值3950的配合一个10kΩ上拉电阻分压然后PJ85718DM读分压电压。但NTC的阻值-温度曲线是指数型的直接线性化误差很大我习惯用Steinhart-Hart方程做三阶拟合在0到100℃范围内能把误差压到0.1℃以内。具体系数可以用Excel拟合或者用在线计算器算出来然后写死在代码里。PT100的话用恒流源激励最稳。PJ85718DM内部有激励电流源可以设100μA或1mA。我一般用1mA因为信号大一点抗干扰好。但要注意PT100的自热效应1mA在100Ω上产生0.1mW的功耗对于小封装探头来说温升可以忽略但如果用更小的电流比如100μA信号就弱了10倍对PGA要求更高。折中下来1mA加32倍PGA是甜点。热电偶的冷端补偿是难点。PJ85718DM内部有冷端补偿通道但它的冷端传感器测的是芯片引脚附近的温度不是接线端子处的温度。如果接线端子和芯片之间有温差补偿就会偏。我的做法是在接线端子旁边放一个高精度数字温度传感器比如±0.1℃的通过I2C读进来然后在MCU里做二次补偿。这个补偿量不大但在高精度场合很关键。实测下来不加二次补偿冷端误差能有1到2℃加了之后能压到0.3℃以内。3. 固件架构与采样滤波实现3.1 采样时序与中断优先级设计采样时序是整个固件的地基。我见过不少项目温度读数偶尔跳一下查半天查不出原因最后发现是采样和显示刷新撞在一起了。STM32F410RB的中断优先级有16级我一般这样分SPI DMA完成中断优先级最高设为0定时器采样中断次之设为1串口发送中断再次设为2SysTick最低设为15。这样保证前端数据读进来的时候不会被其他中断打断。定时器TIM2我设成1Hz但实际采样率不是1Hz而是每秒钟采16次然后做平均。为什么因为单次采样总有噪声16次平均能把随机噪声压到1/4。具体做法是TIM2设成16Hz溢出每次溢出触发一次SPI读取读到的数据存到数组里存满16个之后置标志位主循环做平均和滤波。这样等效采样率还是1Hz但数据质量好很多。SPI读取的时序也要注意。PJ85718DM的转换需要时间如果你在它还没转换完就去读读到的就是旧数据或者垃圾。手册上写转换时间跟增益和采样率有关我一般设成20ms一次转换所以SPI读取间隔不能小于20ms。16Hz对应62.5ms完全够。但如果你把采样率提到100Hz就得把转换时间设短或者用连续转换模式。连续转换模式下PJ85718DM会自己按设定速率转换你只管读最新数据就行但要注意读的时候别把正在更新的寄存器读了一半所以最好用它的数据就绪引脚做握手。3.2 数字滤波与温度换算的代码实现滤波这块我一般用两级第一级是滑动平均第二级是一阶低通。滑动平均用16点把高频噪声压掉一阶低通用一个系数α我一般取0.1到0.3之间。α越小输出越平滑但响应越慢。温度变化本来就慢所以α取0.1没问题响应时间大约10个采样周期也就是10秒对于HVAC来说完全可接受。代码上滑动平均用一个环形缓冲区每次新数据进来覆盖最老的数据然后求和除以16。一阶低通更简单filtered filtered alpha * (raw - filtered)。注意这里raw是滑动平均后的值不是原始值。两级滤波下来读数波动能控制在±0.02℃以内。温度换算要看探头类型。如果是PT100用Callendar-Van Dusen方程R R0 * (1 A*T B*T^2)反解T可以用迭代或者查表。我一般用查表加线性插值因为MCU算力有限查表最快。表可以每10℃一个点中间线性插值误差在0.01℃以内。如果是NTC用Steinhart-Hart1/T A B*ln(R) C*(ln(R))^3这个直接算就行F410RB有FPU算起来不慢。远程发送的数据格式也要统一。我一般用Modbus RTU因为HVAC行业通用。寄存器里放温度值乘以100的整数比如25.34℃就放2534。这样中控室读到的就是整数不用处理浮点。本地显示则直接显示浮点保留一位小数。两边数据来源是同一个滤波后的值所以不会打架。3.3 本地显示与远程通信的协同本地显示如果用OLED刷新率不用太高1Hz足够因为温度变化慢。但刷新的时候要注意别和SPI读取冲突。我的做法是显示刷新放在主循环里每次采样标志位置位后先做滤波和换算然后更新显示缓冲区最后启动DMA传输到OLED。DMA传输期间CPU可以去处理远程发送等DMA完成中断来了再干别的。这样显示和通信并行互不阻塞。远程通信如果是RS485要注意收发切换的时序。STM32F410RB的USART支持RS485模式可以自动控制DE引脚但前提是DE引脚接在正确的引脚上。我一般用USART2的DE引脚设成推挽输出然后在发送前拉高发送完成中断里拉低。注意拉低之前要确保最后一个字节已经移出移位寄存器否则会截断。STM32的TC中断就是干这个的用TC而不是TXE。如果是无线模组比如LoRa或NB-IoT一般用AT指令。这时候要注意AT指令的响应超时别死等。我一般用状态机发一条指令等500ms没响应就重发重发三次失败就报错。数据发送用透传模式最简单直接把温度值打包成二进制发出去接收端解析就行。4. 实测数据与常见问题排查4.1 精度验证与温漂处理板子做出来之后精度验证是必须的。我一般用恒温水槽从0℃到100℃取5个点0、25、50、75、100。每个点稳定10分钟后读10次取平均。然后跟标准温度计对比算误差。PT100方案我实测下来不加校准的话误差在±0.3℃左右主要来自PT100本身的公差和PGA的增益误差。加两点校准0℃和100℃之后能压到±0.05℃以内。温漂是另一个问题。PJ85718DM的增益温漂典型值是1ppm/℃STM32F410RB的内部参考电压温漂是30ppm/℃。如果环境温度变化20℃参考电压漂移就是600ppm折算到温度读数上大约0.06℃。这个量级对于大多数HVAC应用可以接受但如果要求更高就得用外部基准比如REF5025温漂3ppm/℃。我一般建议如果做冷库或者实验室设备就上外部基准普通室温监测内部基准够用。还有一个容易被忽略的点是PCB布局的热电偶效应。不同金属连接处会产生热电势如果PCB上有不同金属的过孔或焊盘温度梯度大的时候会产生μV级的热电势影响读数。我的做法是模拟输入走线尽量短且走在同一层避免过孔如果必须过孔就在过孔两边放对称的铜皮让温度梯度均匀。4.2 常见问题速查表现象可能原因排查方法解决措施读数偶尔跳变电源噪声耦合用示波器看VDDA纹波加LC滤波模拟数字电源分开读数持续偏高冷端补偿不准对比接线端子温度和芯片温度加二次补偿或换用外部冷端传感器远程数据丢包波特率不匹配用示波器看串口波形统一波特率加校验和重传本地显示闪烁刷新与采样冲突看SPI总线波形显示刷新放主循环用DMA长时间运行后漂移参考电压温漂记录环境温度和读数换外部基准或做温度补偿上电后无数据前端未初始化读PJ85718DM的ID寄存器检查SPI时序和片选信号这个表是我踩坑踩出来的每一条都对应一个真实项目里的问题。比如“读数偶尔跳变”那条我最早以为是传感器问题换了三个探头都一样后来用示波器一看VDDA上有个50mV的尖峰跟MCU的GPIO翻转同步。后来在VDDA上串了一个10Ω电阻加10μF电容尖峰就没了。4.3 实操心得与避坑技巧第一个心得PJ85718DM的配置寄存器写完一定要回读。我遇到过SPI时序稍微偏一点写进去的值没生效但读出来又是对的因为读的是默认值结果调了半天。后来养成习惯写完关键寄存器立刻回读确认值对了再继续。第二个心得STM32F410RB的HAL库在SPI DMA模式下有个坑如果DMA传输完成中断里直接调用HAL_SPI_TransmitReceive_DMA有时候会返回忙。我的做法是在中断里只置标志位主循环里再启动下一次传输。这样虽然多了一个循环周期但稳定得多。第三个心得温度换算的浮点运算尽量用单精度别用双精度。F410RB的FPU是单精度的双精度会走软件模拟慢几十倍。我一开始用double算Steinhart-Hart一次换算要2ms后来改成float只要50μs。第四个心得远程通信的数据包一定要加时间戳。我做过一个项目中控室收到的温度值偶尔会重复查了半天发现是无线模组在信号弱的时候会重发上一包数据。后来在数据包里加了递增的序列号接收端发现序列号没变就丢弃问题解决。第五个心得本地显示的温度值和远程发送的温度值一定要来自同一个变量。我见过有人本地显示用滤波后的值远程发送用原始值结果中控室看到的和现场看到的差0.5℃客户投诉说我们数据造假。后来统一用滤波后的值两边完全一致。5. 方案扩展与不同场景的适配5.1 多路温度监测的扩展方法单路温度监测做完了很多时候要扩展到多路。比如一个HVAC机组要监测回风、送风、盘管三个点的温度。这时候PJ85718DM单颗只有一路差分输入但可以通过多路复用器扩展。我一般用一颗8通道的模拟开关比如ADG708把三路探头轮流接到PJ85718DM的输入端。切换通道后要等一段时间让信号稳定因为模拟开关有导通电阻和寄生电容跟探头阻抗形成RC延迟。我实测下来切换后等10ms再启动转换读数就稳了。STM32F410RB这边多路的话采样节拍要重新算。三路轮流采每路16次平均那就是48次采样。如果还是1Hz刷新每次采样间隔就是20ms左右。TIM2设成50Hz溢出每溢出一次切换通道并启动转换转换完读数据存到对应通道的缓冲区。这样三路都能在1秒内完成一轮。多路的话还要注意通道间的串扰。模拟开关的通道隔离度有限如果一路是高电压一路是低电压切换时会有电荷注入。我的做法是在模拟开关后面加一个电压跟随器用运放做缓冲这样输入阻抗高对前级影响小输出阻抗低对ADC驱动能力强。5.2 低功耗场景的优化策略如果做电池供电的温度记录仪功耗就是关键。STM32F410RB在运行模式下大约100μA/MHz跑在16MHz就是1.6mA。PJ85718DM在连续转换模式下大约1mA。加起来2.6mA用2000mAh电池能跑一个月左右。但如果把采样率降到0.1Hz也就是10秒采一次然后大部分时间让MCU进Stop模式功耗能降到几十μA。具体做法是TIM2设成0.1Hz溢出后唤醒MCU启动PJ85718DM转换等转换完成读数据然后关掉前端MCU进Stop模式。Stop模式下STM32F410RB的功耗大约10μA加上前端的待机功耗1μA平均下来不到20μA。2000mAh电池能跑好几年。但要注意Stop模式下SPI和定时器都停了唤醒后要重新初始化这个时间大约1ms对温度采集来说可以忽略。低功耗还有一个坑是OLED显示。OLED静态显示也要几mA如果一直亮着低功耗就白做了。我的做法是显示几秒后自动关屏按按键才亮。或者用段码LCD功耗只有几十μA但显示内容少。看你的应用场景取舍。5.3 不同通信方式的适配对比通信方式速率距离功耗适用场景RS4859600-1152001200m中等楼宇自控有线中控LoRa0.3-50kbps几公里低室外环境监测无线远传NB-IoT100kbps覆盖广中等远程抄表云端上报Wi-Fi1-100Mbps100m高室内局域网监控蓝牙1-2Mbps10m低手机现场调试选哪种看你的场景。HVAC里RS485最稳抗干扰好布线也方便。如果中控室离得远或者要上云就用NB-IoT或LoRa。Wi-Fi适合室内但功耗高不适合电池供电。蓝牙适合现场调试拿手机就能看数据但不适合长期监测。我做过一个项目是冷库温度监测冷库里面用RS485走线到冷库外面的网关网关再用NB-IoT上云。这样冷库里面不用无线避免低温对无线模组的影响外面网关供电也方便。这个方案跑了两年多一直很稳。6. 一些个人体会这套PJ85718DM加STM32F410RB的组合我从第一版板子到现在量产前后改了五版。最大的体会是模拟部分和数字部分的隔离怎么做都不过分。第一版板子模拟数字地混在一起读数跳得没法看第二版加了地平面分割好了一些第三版加了磁珠和电容滤波才彻底稳下来。所以如果你刚开始做别在电源和地上省钱多花几毛钱加滤波能省你几天的调试时间。另一个体会是校准。再好的器件也有公差出厂校准是保证精度的最后一道关。我一般做两点校准0℃和100℃用恒温槽或者冰水混合物加沸水。校准系数存在STM32的Flash里每次上电读出来用。这样即使换探头只要重新校准一次就行不用改代码。最后说一个调试技巧如果你怀疑是前端的问题还是MCU的问题可以用一个已知的电压源代替探头比如用基准电压分压出一个固定电压接到PJ85718DM的输入端。如果读数稳定那就是探头或前端配置的问题如果读数还跳那就是MCU或电源的问题。这个二分法能帮你快速定位故障点比盲目换器件高效得多。
阅读完成 · 觉得有帮助?