当前位置:   article > 正文

STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度

max31865

STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度

本章内容使用 STM32CubeMX 软件配置 STM32F407ZGT6 的 SPI 功能,读取 MAX31865 模块采集的 PT100 铂电阻模块的电压,并将它转化为温度,使用 SPI 前可以参考以往的文章了解一下 SPI 总线:SPI总线详解

教程包含通用步骤以及专用步骤,其中,通用步骤为STM32CubeMX配置其他外设工程的通用操作,STM32CubeMX系列教程基本通用,专用操作则是针对当前工程进行的配置

本项目资料以及上传 CSDN:STM32_MAX31865_HAL库程序及资料

一、初始准备

1.硬件平台

主控使用正点原子STM32F4探索者:

IMG_20210207_234256

RTD铂电阻数字转换器–MAX31865:

MAX31865 是简单易用的热敏电阻至数字输出转换器,优化用于铂电阻温度检测器 (RTD),外部电阻设置 RTD 灵敏度,高精度 ADC 将 RTD 电阻与基准电阻之比转换为数字输出,MAX31865 输入具有高达 +45V 的过压保护,提供可配置的RTD及电缆开路、短路检测

20211220103247

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:

20211220104506

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

2.软件平台

STM32CubeMX软件平台 V6.2.1

Keil5软件平台 V5.32

STM32CubeProgrammer下载平台

20210207234636

3.原理图接线

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

请添加图片描述

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

20211220113739

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

MAX31865和PT100 PT1000的小白避坑攻略

二、操作步骤

1.CubeMX生成初始化代码

1.1 建立工程(通用步骤)
  • 芯片选择

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

20210519191302

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

20210810215634

  • 配置时钟源

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

20210519191953

  • 配置时钟树

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

20210208003321

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

20210208003622

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

CSDN文章链接-时钟树分析

1.2 开启串口

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

STM32CubeMX-串口中断实验

配置后引脚图如下:

20210810222541

配置完成后我们再添加重映射代码到 printf 函数,具体步骤可以参考 mculover666 的文章:

【STM32Cube_09】重定向printf函数到串口输出的多种方法

1.3 配置 SPI
  • 开启 SPI

在 STM32CubeMX 内开启 SPI 然后选择全双工主机模式

20211220143553

开启硬件 CS,开启后当使用 SPI 时会自动拉低片选引脚

20211220143833

  • 配置 SPI 详细参数

进入到 SPI 的配置项中,基础参数保存默认,主要看第二项时钟设置,时钟分频我使用128分频,CPOL 设置为 HIGH(空闲为高电平),CPHA 设置为 2Edge(即第二个边沿传输数据)

20211220143919

  • 开启 NVIC 中断

在 NVIC 管理里面开启对应中断

20211220145040

1.4 配置 GPIO

配置 PA0 为 GPIO 输入,用于读取 MAX31865 模块的转换完成电平,即 RDY 引脚,当转化完成后,该引脚会输出低电平:
20211220144943

1.5 生成代码(通用步骤)

点击进入Project Manager 配置生成工程的名字,存储路径**(不要有中文)**以及编译器,这里我们选MDK-ARM(Keil被收购后改名)

20210519193401

配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择

PS:用户代码段是一下注释之间的代码,只有原始的用户代码段注释才有效,用户自己添加的无效

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
  • 1
  • 2
  • 3

20210519193757

最后点击生成代码

20210208004314

2.编写代码

生成代码后打开工程:

20211220145257

我们在项目文件夹目录下创建 Hardware 文件夹,文件夹下创建 MAX31865 文件夹,下面创建 max31865 文件

20211221111140

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

然后我们在工程里面添加文件,导入路径,在主函数调用该函数:

20211221112222

主函数代码:

  /* 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 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

MAX31865_SB_Read(0x07) 是获取错误标志位,对应位如下,返回 1 是表示该位错误:

20211221112336

0x01 和 0x02 用于存储转换后的电阻值,我们读取那个值就能获得电阻值,经过自己的算法转化就能获得温度值:

20211221112427

大致程序就是如上

3.程序下载(通用步骤)

程序下载我一般用两种方式:

第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug

20210208181431

选择ST-link后,点击setting

20210208181619

添加对应F4的Flash

20210208181825

keil界面点击下载

20210208182113

第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载

打开软件,点击connect左边选择stlink后再点击connect连接下载器

20210208182703

点击open file,找到工程路径下MDK文件夹下工程生成的hex文件

20210208182650

之后点击downlod下载,下载结果如下

20210208182721

三、实验现象

获取温度数据,打印到串口上:

max31865

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/219959
推荐阅读
相关标签
  

闽ICP备14008679号