日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/20 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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读取铂电阻温度的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。