尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

STM32F103+MAX31865三线制PT100高精度测温方案详解

STM32F103+MAX31865三线制PT100高精度测温方案详解 简介基于STM32F103与MAX31865的铂电阻测温工程包面向单片机测温、工业数据采集方向的开发者和相关专业学生提供从原理图到可执行程序的一整套参考实现。压缩包内共131个文件以头文件和C源文件为主并配有MDK工程文件、可执行hex、启动文件、链接脚本、映射文件以及原理图图片整体约2.22MB便于直接导入工程查看、编译和烧录。核心功能实现采用MAX31865芯片完成三线制铂电阻高精度测温代码中MAX31865头文件里的参考电阻阻值可按实际传感器改为四百欧姆原理图上的DRDY报警部分可省略该引脚直接连接单片机即可工作若需改用二线或四线铂电阻也只需小幅调整原理图整体结构清晰利于阅读和二次移植。已有780人学习下载适合正在做PT100/PT1000测温项目、需要研究数字转换器驱动逻辑或快速搭建设备原型的开发者。 做高精度温度采集绕不开PT100铂电阻。这东西温度特性好、长期稳定工业控制里最常用的测温方案就是它但直接拿单片机ADC去采会碰上一个很尴尬的问题PT100在0°C时只有100Ω放到1米长的引线上线电阻本身就可能带来好几摄氏度的误差。所以我这次搭了一套基于STM32F103和MAX31865、配合三线制PT100铂电阻测温的完整方案把原理图和可执行代码都整理出来了给做温度采集、工业模温控制、冷链监控这些方向的朋友一个可以直接抄作业的底子。整套系统做下来成本不高稳定性却不含糊MAX31865这颗专用芯片负责把模拟前端全部打包STM32F103只负责通过SPI读数据和换算温度测温分辨率能做到0.034°C左右配合校准在工业模温控制里达到正负0.1°C是有可能的。下面我会把方案选型、原理图设计要点、完整代码实现、以及我在实际调试中踩过的坑全部写出来。1. 项目整体方案与选型思路1.1 为什么用MAX31865而不是单片机ADC直采PT100的电阻变化率很小每摄氏度只变化约0.385Ω。如果直接用STM32F103内部12位ADC配合分压电阻去测满量程对应的电阻分辨率、温漂、参考电压稳定性都很难控制。我自己以前用分立方案做过一版恒流源加运放加STM32内部ADC调了整整一周低温段重复性还是达不到要求最后老老实实换成了专用芯片。MAX31865是ADI原Maxim推出的RTD专用数字转换芯片内部集成15位ADC、激励电流源、开短路检测、比值测量架构MCU只需要通过标准SPI接口读回15位ADC结果再用公式换算成温度即可。它最大的价值在于把“模拟前端”这块最头疼的部分全打包好了外围只需要一颗精密参考电阻和几个滤波电容从焊接完成到读数稳定基本半小时内搞定。选择STM32F103作为主控也很直接它算力足够、外设丰富、资料多而且大部分工程师手上都有现成的开发板。对于这种单路温度采集场景STM32F103C8T6的资源和价格都合适没必要上更强的型号。1.2 三线制PT100到底解决了什么问题用一个生活类比PT100的引线电阻就像水管内壁附着的污垢你想测水箱里的真实水位但水表前面有一段脏水管读数自然偏高。两线制测电阻时两根引线的电阻被直接串联进测量回路产生系统误差而三线制把激励电流回路和电压检测回路分开引线电阻上的压降不再被测量环路拾取是工业现场最常用的折中方案。MAX31865芯片上有一组关键引脚FORCE和FORCE-是激励电流输出/回流端RTDIN和RTDIN-是高阻电压检测端。三线制PT100的标准接法如下PT100的一端通常红色引线接FORCEPT100的另一端先引出一根线接RTDIN这是电压检测正端PT100同一个端点再引出第三根线同时接FORCE-和RTDIN-。这样电流从FORCE流入PT100从第三根线流回FORCE-而电压检测端RTDIN和RTDIN-都处于高阻状态几乎没有电流流过线上的压降不参与测量这就是三线制能抵消引线电阻的核心原理。如果传感器是四线制激励和检测线完全分开效果更好两线制则只适合引线很短的场景。1.3 系统整体架构整个系统分为四个部分STM32F103最小系统、MAX31865测温前端、三线制PT100传感器、以及上位机通信串口。软件层面用HAL库或标准库均可我这次提供的是HAL库版本核心代码包含SPI驱动、MAX31865寄存器读写、温度换算、故障检测四个模块。2. 原理图设计核心细节2.1 STM32F103最小系统必备电路STM32F103C8T6最小系统说起来简单但有些细节容易踩坑。首先是电源VDD引脚每个都要加100nF去耦电容VDDA引脚建议单独加1µF和10nF并联电容模拟供电质量直接影响ADC性能——虽然本项目用外部芯片测温但MCU供电不稳SPI通信波形也会受影响。其次是时钟主晶振用8MHz贴片晶振两个负载电容用18pF或20pF均可布局时尽量靠近OSC_IN和OSC_OUT引脚。如果不想用外部晶振配置成内部RC模式也能跑但串口波特率会偏建议对时序要求高的项目还是上外部晶振。复位电路、BOOT0和BOOT1引脚也不能省NRST引脚接10kΩ上拉电阻再加100nF电容到地BOOT0和BOOT1都接10kΩ下拉电阻确保从Flash正常启动。调试接口推荐用SWD四线制SWDIO、SWCLK、GND、3.3V只占用PA13和PA14两个引脚比JTAG省资源。电源方案上如果板子上只有一路5V输入用AMS1117-3.3转出3.3V即可注意输入输出电容都要加上否则负载突变时电压跌落可能引起复位。2.2 MAX31865外围电路设计要点MAX31865的外围电路是整张板子的灵魂。参考电阻RREF选型是第一优先级PT100在850°C时阻值约390Ω所以RREF要大于传感器最大电阻常见选430Ω。这个电阻的精度和温漂直接决定系统精度0.1%精度、温漂5ppm/°C起步有条件上0.01%的低温漂电阻。REF和REF-之间除了参考电阻还要并联一个1µF到10µF的滤波电容用于稳定参考电压。RTDIN和RTDIN-之间建议加10nF到100nF差分电容抑制线缆耦合的共模噪声。如果测温现场有电机、变频器等强干扰源在传感器线缆入口处加共模电感或磁珠会有明显改善。FAULT引脚是开漏输出必须配上拉电阻10kΩ才能输出有效电平接STM32的一个GPIO作为故障中断输入。DRDY引脚是数据就绪指示可选接我项目里直接悬空用轮询方式读取转换结果。为了让大家核对关键器件参数我把原理图里的核心元件列表整理在下面元件参数/型号说明U1STM32F103C8T6主控MCULQFP48封装U2MAX31865RTD数字转换器SOIC-16封装RREF430Ω0.1%5ppm/°CPT100参考电阻精度关键Y18MHz无源晶振负载电容18pF主时钟C1-C6100nF X7RMCU电源去耦R110kΩNRST上拉J14P-2.54mmSWD调试接口J26P-2.54mm三线制PT100接入端子2.3 SPI接口连接与PCB布局MAX31865和STM32F103之间用标准四线SPI连接SCLK接PA5MISO接PA6接DOUTMOSI接PA7接DINCS任意GPIO即可我习惯用PA4。CS用普通GPIO控制比硬件NSS更灵活也避免芯片上电时序产生误读。PCB布局上MAX31865距离PT100接线端子越近越好这样可以减少传感器引线在板上的走线长度。参考电阻附近不要走大电流信号避免温度梯度影响阻值。STM32F103的去耦电容要靠近对应电源引脚晶振下方铺地并且不要走其他信号线。SPI信号线建议等长但频率不高实际布线时保持短、直远离电源电感附近即可。如果画原理图用嘉立创EDA或AD注意MAX31865的封装和引脚顺序别搞反画完用ERC检查一遍重点确认FORCE和RTDIN没有接反否则三线制补偿会失效。3. 固件实现与可执行代码3.1 SPI初始化与模式选择MAX31865的SPI时序比较严格我在HAL库配置里选用SPI Mode 3即CPOL1、CPHA2Edge。第一次调试时如果读出来的数据全是0xFF或0x00八成就是SPI模式没对上。下面这段是CubeMX生成后手动调整的SPI初始化代码static void MX_SPI1_Init(void) { hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_HIGH; hspi1.Init.CLKPhase SPI_PHASE_2EDGE; // Mode 3 hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; HAL_SPI_Init(hspi1); // 配置CS引脚PA4推挽输出默认高电平 GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin GPIO_PIN_4; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_PULLUP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); }SPI时钟分频用的是32APB2时钟72MHz时SCLK约2.25MHzMAX31865完全扛得住。如果想进一步拉高吞吐分频系数可以降到8或16但线缆较长时建议保守一点减少信号反射。3.2 MAX31865寄存器读写驱动MAX31865的寄存器读写都是通过SPI完成的读操作在命令字节最高位置1写操作置0。芯片的SPI时序要求CS拉低后发送地址字节紧接着不管是读还是写都要产生足够的SCLK时钟所以我在收发时采用“地址字节数据字节”两字节连续收发的方式简洁可靠。uint8_t MAX31865_ReadReg(uint8_t reg) { uint8_t tx[2] {reg | 0x80, 0x00}; // 高位置1表示读 uint8_t rx[2] {0x00, 0x00 p a hrefhttps://download.csdn.net/download/weixin_43190676/89478224 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表