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 具有以下特点和优点:

  1. 支持100Ω至1kΩ (0°C时)铂电阻RTD

  2. 兼容于2线、 3线和4线传感器连接

  3. SPI 兼容接口

  4. 15 位ADC分辨率,标称温度分辨率为 0.03125°C (随RTD非线性变化)

  5. 整个工作条件下,总精度保持在 0.5°C (0.05%满量程)

  6. 全差分 VREF 输入

  7. 转换时间: 21ms (最大值)

  8. 集成故障检测,增加系统稳定性: (RTD开路、 RTD短路到量程范围以外的电压或RTD元件短路)

MAX31864 接的 PT100 铂热电阻具有 宽温度范围的特点,我使用的温度范围为 -200C 到 450C:

该模块的一些其他细节可以参考其他文章:MAX31865模块要点说明

2.软件平台

STM32CubeMX软件平台 V6.2.1

Keil5软件平台 V5.32

STM32CubeProgrammer下载平台

3.原理图接线

MAX31865 和 开发板以及 PT100 接线如下:

PT100 和 MAX31865 接线如下:(三线接法)

三线接法里面要补上一些焊锡同时断开一些连接点,具体可以参考这篇文章:

MAX31865和PT100 PT1000的小白避坑攻略

二、操作步骤

1.CubeMX生成初始化代码

1.1 建立工程(通用步骤)

  • 芯片选择

打开cube软件,选择从芯片来创建工程,一般开发都是使用这个来开发,有的时候也可能使用另外两个,但不多,第二个基于ST提供的开发板创建工程,针对性高,第三个则选择ST提供的例程来创建工程

F4探索者的主控为STM32F407ZGT6,所以在搜索框找到STM32F407ZG后点击具体芯片,再开始工程

  • 配置时钟源

我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示时钟配置为外部源

  • 配置时钟树

我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,探索者的晶振和时钟倍频如下

一般配置正确时颜色蓝白为主,配置错误时则会出现紫色,提示我们要修改值

具体时钟树的了解可以看我很久之前的文章,有做一些分析

CSDN文章链接-时钟树分析

1.2 开启串口

开启串口通信,方便我们通过上位机发送数据进行调试,不熟悉配置的话可以参考我以前的文章:

STM32CubeMX-串口中断实验

配置后引脚图如下:

配置完成后我们再添加重映射代码到 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之FATFS+SPI驱动W25QXX

STM32CubeMX之FATFS+SPI驱动W25QXX

STM32Cubemx——硬件SPI驱动七针0.96寸OLED

STM32Cubemx——硬件SPI驱动七针0.96寸OLED

STM32Cubemx——硬件SPI驱动七针0.96寸OLED

STM32F1基于STM32CubeMX配置硬件SPI驱动nRF24L01数据收发