STM32CubeMX-配置SPI驱动MAX31865读取铂电阻温度
文章目錄
- STM32CubeMX-配置SPI驅動MAX31865讀取鉑電阻溫度
- 一、初始準備
- 1.硬件平臺
- 2.軟件平臺
- 3.原理圖接線
- 二、操作步驟
- 1.CubeMX生成初始化代碼
- 1.1 建立工程(通用步驟)
- 1.2 開啟串口
- 1.3 配置 SPI
- 1.4 配置 GPIO
- 1.5 生成代碼(通用步驟)
- 2.編寫代碼
- 3.程序下載(通用步驟)
- 三、實驗現象
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 接線如下:(三線接法)
三線接法里面要補上一些焊錫同時斷開一些連接點,具體可以參考這篇文章:
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_Statusprintf("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读取铂电阻温度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: タイトル キャッスルファンタジア ~エレ
- 下一篇: c语言输入平行四边形的图案,巧妙输入平行