STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度
Posted JeckXu666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度相关的知识,希望对你有一定的参考价值。
文章目录
STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度
本章内容使用 STM32CubeMX 软件配置 STM32F407ZGT6 的 SPI 功能,读取 MAX31865 模块采集的 PT100 铂电阻模块的电压,并将它转化为温度,使用 SPI 前可以参考以往的文章了解一下 SPI 总线:SPI总线详解
教程包含通用步骤以及专用步骤,其中,通用步骤为STM32CubeMX配置其他外设工程的通用操作,STM32CubeMX系列教程基本通用,专用操作则是针对当前工程进行的配置
本项目资料以及上传 CSDN:STM32_MAX31865_HAL库程序及资料
一、初始准备
1.硬件平台
主控使用正点原子STM32F4探索者:
RTD铂电阻数字转换器–MAX31865:
MAX31865 是简单易用的热敏电阻至数字输出转换器,优化用于铂电阻温度检测器 (RTD),外部电阻设置 RTD 灵敏度,高精度 ADC 将 RTD 电阻与基准电阻之比转换为数字输出,MAX31865 输入具有高达 +45V 的过压保护,提供可配置的RTD及电缆开路、短路检测
MAX31865 具有以下特点和优点:
-
支持100Ω至1kΩ (0°C时)铂电阻RTD
-
兼容于2线、 3线和4线传感器连接
-
SPI 兼容接口
-
15 位ADC分辨率,标称温度分辨率为 0.03125°C (随RTD非线性变化)
-
整个工作条件下,总精度保持在 0.5°C (0.05%满量程)
-
全差分 VREF 输入
-
转换时间: 21ms (最大值)
-
集成故障检测,增加系统稳定性: (RTD开路、 RTD短路到量程范围以外的电压或RTD元件短路)
MAX31864 接的 PT100 铂热电阻具有 宽温度范围的特点,我使用的温度范围为 -200C 到 450C:
该模块的一些其他细节可以参考其他文章:MAX31865模块要点说明
2.软件平台
STM32CubeMX软件平台 V6.2.1
Keil5软件平台 V5.32
STM32CubeProgrammer下载平台
3.原理图接线
MAX31865 和 开发板以及 PT100 接线如下:
PT100 和 MAX31865 接线如下:(三线接法)
三线接法里面要补上一些焊锡同时断开一些连接点,具体可以参考这篇文章:
二、操作步骤
1.CubeMX生成初始化代码
1.1 建立工程(通用步骤)
- 芯片选择
打开cube软件,选择从芯片来创建工程,一般开发都是使用这个来开发,有的时候也可能使用另外两个,但不多,第二个基于ST提供的开发板创建工程,针对性高,第三个则选择ST提供的例程来创建工程
F4探索者的主控为STM32F407ZGT6,所以在搜索框找到STM32F407ZG后点击具体芯片,再开始工程
- 配置时钟源
我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示时钟配置为外部源
- 配置时钟树
我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,探索者的晶振和时钟倍频如下
一般配置正确时颜色蓝白为主,配置错误时则会出现紫色,提示我们要修改值
具体时钟树的了解可以看我很久之前的文章,有做一些分析
1.2 开启串口
开启串口通信,方便我们通过上位机发送数据进行调试,不熟悉配置的话可以参考我以前的文章:
配置后引脚图如下:
配置完成后我们再添加重映射代码到 printf 函数,具体步骤可以参考 mculover666 的文章:
【STM32Cube_09】重定向printf函数到串口输出的多种方法
1.3 配置 SPI
- 开启 SPI
在 STM32CubeMX 内开启 SPI 然后选择全双工主机模式
开启硬件 CS,开启后当使用 SPI 时会自动拉低片选引脚
- 配置 SPI 详细参数
进入到 SPI 的配置项中,基础参数保存默认,主要看第二项时钟设置,时钟分频我使用128分频,CPOL 设置为 HIGH(空闲为高电平),CPHA 设置为 2Edge(即第二个边沿传输数据)
- 开启 NVIC 中断
在 NVIC 管理里面开启对应中断
1.4 配置 GPIO
配置 PA0 为 GPIO 输入,用于读取 MAX31865 模块的转换完成电平,即 RDY 引脚,当转化完成后,该引脚会输出低电平:
1.5 生成代码(通用步骤)
点击进入Project Manager 配置生成工程的名字,存储路径**(不要有中文)**以及编译器,这里我们选MDK-ARM(Keil被收购后改名)
配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择
PS:用户代码段是一下注释之间的代码,只有原始的用户代码段注释才有效,用户自己添加的无效
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
最后点击生成代码
2.编写代码
生成代码后打开工程:
我们在项目文件夹目录下创建 Hardware 文件夹,文件夹下创建 MAX31865 文件夹,下面创建 max31865 文件
max31865.c 编写如下代码:
#include "max31865.h"
void MAX31865_Init()
//MAX31865_SB_Write(0x80,0xC1);//二线、四线配置
MAX31865_SB_Write(0x80,0xD1);//三线配置
HAL_Delay(10);
float Get_tempture(void)//PT100
float temps;
uint16_t data_r;
data_r = MAX31865_SB_Read(0x01) << 8;
data_r |= MAX31865_SB_Read(0x02);
data_r >>= 1;
temps=data_r;
temps=(temps*402.0f)/32768.0f;//获得转换的电阻值
temps=(temps-100.0f)/0.385055f;
//电阻转化为温度,此处直接使用网上的线性拟合,误差很大!
//想要提高精度需要标定电阻和温度关系
return temps;
uint8_t MAX31865_SB_Read(uint8_t addr)//SPI Single-Byte Read
uint8_t read;
MAX31685_CS_LOW();
HAL_SPI_Transmit(&hspi1, &addr, 1, 60);
HAL_SPI_Receive(&hspi1, &read, 1, 60);
MAX31685_CS_HIGH();
return read;
void MAX31865_SB_Write(uint8_t addr,uint8_t wdata)//SPI Single-Byte Write
uint8_t dat[2];
dat[0] = addr;
dat[1] = wdata;
MAX31685_CS_LOW();
HAL_SPI_Transmit(&hspi1,dat,2,60);
MAX31685_CS_HIGH();
max31865.h 编写如下代码:
#ifndef __MAX31865_H
#define __MAX31865_H
#include "spi.h"
#include "gpio.h"
#include "stm32f4xx_hal.h"
#define MAX31685_RDY() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) //iso module is not connect
#define MAX31685_CS_HIGH() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)
#define MAX31685_CS_LOW() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)
void MAX31865_Init(void);
uint8_t MAX31865_SB_Read(uint8_t addr);
void MAX31865_SB_Write(uint8_t addr,uint8_t wdata);
float Get_tempture(void);
#endif
然后我们在工程里面添加文件,导入路径,在主函数调用该函数:
主函数代码:
/* USER CODE BEGIN 2 */
MAX31865_Init();
printf("System Init! \\r\\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(MAX31685_RDY() == 0)
tempture=Get_tempture();
Fault_Status=MAX31865_SB_Read(0x07);//Get Fault_Status
printf("tempture: %f C\\r\\n Fault_Status: %d\\r\\n",tempture,Fault_Status);
HAL_Delay(1000);
/* USER CODE END 3 */
MAX31865_SB_Read(0x07) 是获取错误标志位,对应位如下,返回 1 是表示该位错误:
0x01 和 0x02 用于存储转换后的电阻值,我们读取那个值就能获得电阻值,经过自己的算法转化就能获得温度值:
大致程序就是如上
3.程序下载(通用步骤)
程序下载我一般用两种方式:
第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug
选择ST-link后,点击setting
添加对应F4的Flash
keil界面点击下载
第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载
打开软件,点击connect左边选择stlink后再点击connect连接下载器
点击open file,找到工程路径下MDK文件夹下工程生成的hex文件
之后点击downlod下载,下载结果如下
三、实验现象
获取温度数据,打印到串口上:
以上是关于STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度的主要内容,如果未能解决你的问题,请参考以下文章
STM32Cubemx——硬件SPI驱动七针0.96寸OLED
STM32Cubemx——硬件SPI驱动七针0.96寸OLED