赞
踩
本章内容使用 STM32CubeMX 软件配置 STM32F407ZGT6 的 SPI 功能,读取 MAX31865 模块采集的 PT100 铂电阻模块的电压,并将它转化为温度,使用 SPI 前可以参考以往的文章了解一下 SPI 总线:SPI总线详解
教程包含通用步骤以及专用步骤,其中,通用步骤为STM32CubeMX配置其他外设工程的通用操作,STM32CubeMX系列教程基本通用,专用操作则是针对当前工程进行的配置
本项目资料以及上传 CSDN:STM32_MAX31865_HAL库程序及资料
主控使用正点原子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模块要点说明
STM32CubeMX软件平台 V6.2.1
Keil5软件平台 V5.32
STM32CubeProgrammer下载平台
MAX31865 和 开发板以及 PT100 接线如下:
PT100 和 MAX31865 接线如下:(三线接法)
三线接法里面要补上一些焊锡同时断开一些连接点,具体可以参考这篇文章:
打开cube软件,选择从芯片来创建工程,一般开发都是使用这个来开发,有的时候也可能使用另外两个,但不多,第二个基于ST提供的开发板创建工程,针对性高,第三个则选择ST提供的例程来创建工程
F4探索者的主控为STM32F407ZGT6,所以在搜索框找到STM32F407ZG后点击具体芯片,再开始工程
我们点开SystemCore(系统内核设置),再点击RCC配置HSE和LSE时钟源,这里我都选择使用外部时钟,配置后,我们可以看到右边芯片引脚分配图的两个时钟源引脚点亮,表示时钟配置为外部源
我们进入ClockConfiguration配置时钟树,使时钟的输入路径和大小符合我们预期,探索者的晶振和时钟倍频如下
一般配置正确时颜色蓝白为主,配置错误时则会出现紫色,提示我们要修改值
具体时钟树的了解可以看我很久之前的文章,有做一些分析
开启串口通信,方便我们通过上位机发送数据进行调试,不熟悉配置的话可以参考我以前的文章:
配置后引脚图如下:
配置完成后我们再添加重映射代码到 printf 函数,具体步骤可以参考 mculover666 的文章:
【STM32Cube_09】重定向printf函数到串口输出的多种方法
在 STM32CubeMX 内开启 SPI 然后选择全双工主机模式
开启硬件 CS,开启后当使用 SPI 时会自动拉低片选引脚
进入到 SPI 的配置项中,基础参数保存默认,主要看第二项时钟设置,时钟分频我使用128分频,CPOL 设置为 HIGH(空闲为高电平),CPHA 设置为 2Edge(即第二个边沿传输数据)
在 NVIC 管理里面开启对应中断
配置 PA0 为 GPIO 输入,用于读取 MAX31865 模块的转换完成电平,即 RDY 引脚,当转化完成后,该引脚会输出低电平:
点击进入Project Manager 配置生成工程的名字,存储路径**(不要有中文)**以及编译器,这里我们选MDK-ARM(Keil被收购后改名)
配置生成选项,主要为下面三大块,第一个我们选择只拷贝必要的库,第二个选择为每个外设生成.c和.h文件,保存之前的用户代码,以及删除之前的生成代码,第三个不选择
PS:用户代码段是一下注释之间的代码,只有原始的用户代码段注释才有效,用户自己添加的无效
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
最后点击生成代码
生成代码后打开工程:
我们在项目文件夹目录下创建 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 用于存储转换后的电阻值,我们读取那个值就能获得电阻值,经过自己的算法转化就能获得温度值:
大致程序就是如上
程序下载我一般用两种方式:
第一种是使用MDK自带的下载环境下载程序,我们给单片机连接ST-Link后配置下载,点击魔术棒,选择debug
选择ST-link后,点击setting
添加对应F4的Flash
keil界面点击下载
第二种是使用Stm32Programmer下载软件,该下载软件下载方式多,下载快,下面我使用st-link下载
打开软件,点击connect左边选择stlink后再点击connect连接下载器
点击open file,找到工程路径下MDK文件夹下工程生成的hex文件
之后点击downlod下载,下载结果如下
获取温度数据,打印到串口上:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。