news 2026/5/26 11:36:49

保姆级教程:用STM32F103C8T6和MAX6675搞定K型热电偶测温(附模拟/硬件SPI双版本代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:用STM32F103C8T6和MAX6675搞定K型热电偶测温(附模拟/硬件SPI双版本代码)

STM32F103C8T6与MAX6675实现K型热电偶高精度测温全指南

在工业控制、实验室设备或家用电器维修中,温度测量往往是关键环节。K型热电偶因其宽温域(-200℃~1350℃)和成本优势成为首选,而MAX6675作为专用信号调理芯片,能直接将微弱的热电偶信号转换为数字温度值。本文将基于STM32F103C8T6这款性价比极高的ARM Cortex-M3芯片,手把手教你实现稳定可靠的热电偶测温系统。

1. 硬件准备与电路连接

1.1 元器件选型要点

  • 核心控制器:STM32F103C8T6最小系统板(俗称"蓝 pill"),具备丰富的外设接口和足够的处理能力
  • 温度传感器:MAX6675模块(注意与MAX31855区分,后者精度更高但价格更贵)
  • 热电偶:K型热电偶(推荐使用带玻璃纤维绝缘层的型号,如OMEGA的KMQSS系列)
  • 其他配件:杜邦线、0.1μF去耦电容、10KΩ上拉电阻(用于SPI总线)

注意:购买MAX6675时需确认支持K型热电偶,J型热电偶需要不同的转换芯片。

1.2 电路连接示意图

以下是推荐连接方式(以硬件SPI为例):

STM32引脚MAX6675引脚连接说明
PA5SCK时钟信号
PA6MISO数据输入
PA7MOSI不连接
PB0CS片选信号
3.3VVCC电源正极
GNDGND电源地
// 引脚初始化代码示例 GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置SPI引脚(SCK/MISO) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置片选引脚(CS) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_SetBits(GPIOB, GPIO_Pin_0); // 初始置高

2. 硬件SPI驱动实现

2.1 SPI外设配置

STM32的硬件SPI需要正确设置时钟极性和相位,MAX6675要求:

  • 模式0(CPOL=0,CPHA=0)
  • 8位数据格式
  • MSB先行
  • 最大时钟频率4MHz
void SPI1_Init(void) { SPI_InitTypeDef SPI_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // 4.5MHz @72MHz SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStruct.SPI_CRCPolynomial = 7; SPI_Init(SPI1, &SPI_InitStruct); SPI_Cmd(SPI1, ENABLE); }

2.2 温度数据读取与处理

MAX6675的输出为12位分辨率,每0.25℃对应一个LSB。读取流程:

  1. 拉低CS引脚启动转换
  2. 通过SPI读取16位数据
  3. 拉高CS引脚结束通信
  4. 解析有效温度数据
float MAX6675_ReadTemp(void) { uint16_t temp_raw = 0; float temperature = 0; GPIO_ResetBits(GPIOB, GPIO_Pin_0); // CS拉低 // 读取16位数据 temp_raw = SPI_I2S_ReceiveData(SPI1) << 8; temp_raw |= SPI_I2S_ReceiveData(SPI1); GPIO_SetBits(GPIOB, GPIO_Pin_0); // CS拉高 // 检查热电偶连接状态 if(temp_raw & 0x04) { return -1000; // 热电偶开路错误 } // 提取温度值(右移3位,乘以0.25) temperature = (temp_raw >> 3) * 0.25; return temperature; }

3. 模拟SPI实现方案

当硬件SPI引脚被占用时,可用GPIO模拟SPI时序。关键点在于精确控制时钟沿和数据采样时机。

3.1 模拟SPI时序实现

void SoftSPI_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置SCK(PA5), MISO(PA6), CS(PB0) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_SetBits(GPIOA, GPIO_Pin_5); // SCK初始高电平 GPIO_SetBits(GPIOB, GPIO_Pin_0); // CS初始高电平 } uint16_t SoftSPI_Read16Bits(void) { uint16_t data = 0; uint8_t i; GPIO_ResetBits(GPIOB, GPIO_Pin_0); // CS拉低 Delay_us(1); // 等待tCSC周期 for(i=0; i<16; i++) { GPIO_ResetBits(GPIOA, GPIO_Pin_5); // SCK下降沿 Delay_us(1); data <<= 1; if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)) { data |= 0x01; } GPIO_SetBits(GPIOA, GPIO_Pin_5); // SCK上升沿 Delay_us(1); } GPIO_SetBits(GPIOB, GPIO_Pin_0); // CS拉高 return data; }

3.2 两种实现方式对比

特性硬件SPI模拟SPI
速度快(最高4MHz)慢(通常<1MHz)
CPU占用
时序精度由硬件保证依赖软件延时
引脚灵活性固定引脚任意GPIO
开发难度需配置外设时序控制较复杂
适用场景高频采样引脚资源紧张时

4. 常见问题排查与优化

4.1 典型故障现象及解决方案

  • 读取值始终为0

    • 检查CS引脚是否正常切换
    • 确认SPI模式设置正确(模式0)
    • 测量VCC电压是否在3.3V±10%范围内
  • 温度值跳变剧烈

    • 在VCC与GND之间添加0.1μF陶瓷电容
    • 缩短热电偶与MAX6675之间的导线长度
    • 检查热电偶接头是否氧化
  • 返回-1000(开路错误)

    • 检查热电偶两极是否接触良好
    • 尝试更换热电偶测试
    • 确认热电偶类型为K型

4.2 精度提升技巧

  1. 冷端补偿:MAX6675内置环境温度传感器,但受自发热影响。可将模块远离热源,或在软件中补偿偏移量。
  2. 数字滤波:采用滑动平均滤波算法处理连续采样值:
#define FILTER_LEN 5 float TempFilter(float new_val) { static float buffer[FILTER_LEN] = {0}; static uint8_t index = 0; float sum = 0; uint8_t i; buffer[index] = new_val; index = (index + 1) % FILTER_LEN; for(i=0; i<FILTER_LEN; i++) { sum += buffer[i]; } return sum / FILTER_LEN; }
  1. 定期校准:使用标准温度源对比测量值,记录修正系数。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 11:36:47

基于ESP32与MQTT的移动环境感知节点:从硬件选型到数据可视化全流程实践

1. 项目概述&#xff1a;打造一个全屋移动环境感知节点几年前&#xff0c;我开始琢磨怎么把家里的环境数据“管”起来。不是那种插在墙上的固定传感器&#xff0c;而是能随手放在床头柜、书桌、厨房&#xff0c;甚至跟着宠物移动的“小眼睛”。我想知道不同房间的温湿度差异到底…

作者头像 李华
网站建设 2026/5/26 11:36:46

STM32G431RBT6芯片手册没讲的细节:蓝桥杯嵌入式客观题高频考点避坑指南

STM32G431RBT6芯片手册没讲的细节&#xff1a;蓝桥杯嵌入式客观题高频考点避坑指南在蓝桥杯嵌入式组的备赛过程中&#xff0c;STM32G431RBT6作为第十四届比赛新更换的微控制器芯片&#xff0c;其特性与配置细节成为客观题的重要考察点。许多参赛者发现&#xff0c;仅凭芯片手册…

作者头像 李华
网站建设 2026/5/26 11:36:20

Ubuntu 20.04 LTS 部署 RT-PREEMPT 实时内核与NVIDIA驱动兼容性实战【避坑指南】

1. 为什么需要RT-PREEMPT实时内核&#xff1f; 如果你正在开发机器人控制、工业自动化或者音频处理应用&#xff0c;肯定遇到过系统响应延迟导致的性能瓶颈。普通Linux内核虽然稳定&#xff0c;但任务调度机制决定了它无法保证严格的实时性。我去年在做机械臂轨迹规划时就深有体…

作者头像 李华
网站建设 2026/5/26 11:36:11

注意了,电脑的以太网口不只是连路由器,还有这5个用处

在无线网络主导的今天,很多电脑用户已经很少留意机身上的以太网端口。但实际上,这个端口远不止连接路由器上网那么简单。它能带来更高的传输速度、更稳定的连接、更低的延迟和更好的隐私保护,尤其适合需要处理大文件、搭建私有网络或追求极致体验的场景。2026年,即便Wi-Fi …

作者头像 李华
网站建设 2026/5/26 11:35:38

Windows 11终极优化指南:3分钟用Win11Debloat让你的系统焕然一新

Windows 11终极优化指南&#xff1a;3分钟用Win11Debloat让你的系统焕然一新 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declut…

作者头像 李华