一、MAX31865 溫濕度傳感器
- MAX31865 是 RTD 數(shù)字轉(zhuǎn)換器,內(nèi)置 15 位模/數(shù)轉(zhuǎn)換器(ADC)、輸入保護、數(shù)字控制器、SPI 兼容接口以及相關(guān)的控制邏輯電路。
信號調(diào)理電路優(yōu)化用于 PT100-PT1000 RTD,也支持其它熱敏電阻。- 電阻溫度檢測器(RTD)是一種阻值隨溫度變化的電阻。
鉑是最常見、精度最高的測溫金屬絲材料。鉑 RTD 稱為 PT-RTD。- 對于 PT-RTD,最常見的電阻是:0°C 下標稱值為 100Ω 和 1kΩ,當然也有其它阻值。0°C 和+100°C 之間的平均斜率稱為阿爾法(α),斜率與鉑的雜質(zhì)及密度有關(guān)。
最常見的兩個 α 值是:0.00385 和 0.00392,分別對應(yīng)于 IEC 751 (PT100) 和 SAMA 標準。
1、MAX31865 相關(guān)寄存器
- MAX31865 通過 8 個 8 位寄存器實現(xiàn)轉(zhuǎn)換、狀態(tài)和配置數(shù)據(jù)功能。
- 存取寄存器時,地址 0Xh 為讀操作,地址 8Xh 為寫操作。
①、配置寄存器(00h)
- 配置寄存器選擇轉(zhuǎn)換模式(自動模式或單次轉(zhuǎn)換命令觸發(fā)模式)、使能和禁止 BIAS 引腳輸出 V_{BIAS}、發(fā)送單次轉(zhuǎn)換命令、選擇 RTD 連接方式(3 線或 2/4 線)、啟動一次故障檢測、清空故障狀態(tài)寄存器,以及選擇濾波器陷波頻率。
- D7(BIAS)位:不進行溫度轉(zhuǎn)換時,可禁止 V_{BIAS},以降低功耗。
- 發(fā)送單次轉(zhuǎn)換(1-Shot)指令之前,可通過向該位寫 1 使能 V_{BIAS}。
- 選擇自動(連續(xù))轉(zhuǎn)換模式時, **V_{BIAS}**保持有效狀態(tài)。
- D6(轉(zhuǎn)換模式)位:向該位寫 1 時,選擇自動轉(zhuǎn)換模式,以 50/60 Hz 速率連續(xù)轉(zhuǎn)換;向該位寫 0 時,退出自動轉(zhuǎn)換模式,進入 “常閉” 模式,該模式下可發(fā)送單次轉(zhuǎn)換命令。
- D5(1-Shot)位:轉(zhuǎn)換模式為 “常閉” 時,向該位寫 1 啟動一次電阻測試轉(zhuǎn)換。向該位寫 1 后,overline{text{CS}} 變?yōu)楦唠娖綍r觸發(fā)轉(zhuǎn)換。
- 在啟動轉(zhuǎn)換之前開啟 V_{BIAS},并等待至少 10.5 倍的輸入RC網(wǎng)絡(luò)時間常數(shù)加上 1ms。
- 單次轉(zhuǎn)換完成時間在 60Hz 濾波模式下需要約 52ms,在 50Hz 濾波模式下需要 62.5ms。
- 1-Shot 為自動清零位。
- D4(3-Wire)位:使用 3 線 RTD 連接時,該位寫 1;使用 2 線或 4 線連接時,向該位寫 0。
- D3:D2(故障檢測周期)位:主控制器啟動的故障檢測周期有兩種工作模式:手動和自動模式。
- 如果外部 RTD 接口電路包括時間常數(shù)大于 100μs 的輸入濾波器,故障檢測周期時序應(yīng)采用手動模式控制。
- 為進入自動故障檢測,向配置寄存器寫 100X010Xb,此時 ADC 處于“常閉”模式。
自動故障檢測周期在檢查故障之前插入 100μs 延遲,允許外部輸入濾波器達到穩(wěn)定。完成檢測后,故障檢測周期設(shè)置位(D[3:2])自動清除為00b。- D1(故障狀態(tài)清零)位:向 D5、D3 和 D2 位寫 0 的同時向該位寫 1,將使故障寄存器的全部故障狀態(tài)位(D[7:2])清零。
如果仍然存在過壓/欠壓故障,故障寄存器的 D2 位、RTD LSB 寄存器的 D0 位可能立即再次置位。故障狀態(tài)清除位 D1 自動清零。- D0(50/60Hz)位:選擇噪聲抑制濾波器的陷波頻率。向該位寫 0 時,抑制 60Hz 及其諧波;向該位寫 1 時抑制 50Hz 及其諧波。
注意: 自動轉(zhuǎn)換模式下,不要更改陷波頻率 。
②、RTD 電阻寄存器(01h?02h)
- RTD MSB 和 RTD LSB 兩個 8 位寄存器包含 RTD 電阻數(shù)據(jù)。
- 數(shù)據(jù)格式為 RTD 電阻與參考電阻的比值,包含 15 位有效數(shù)據(jù)。
- RTD LSB 寄存器的 D0 為故障位,表示是否檢測到任意 RTD 故障。
- 將 RTD 數(shù)據(jù)寄存器中 15 位 ADC 轉(zhuǎn)換結(jié)果轉(zhuǎn)換為 RTD 的阻值:
R_{RTD} = (ADC Code × R_{REF})/2^{15}
ADC 編碼 = RTD 數(shù)據(jù)寄存器(01h – 02h)中的 15 位 ADC 轉(zhuǎn)換結(jié)果
R_{REF} = 基準電阻的阻值
③、故障門限寄存器(03h?06h)
- 故障上限和故障下限寄存器用于選擇 RTD 故障檢測的觸發(fā)門限。將 RTD 轉(zhuǎn)換結(jié)果與這些寄存器值進行比較,在故障狀態(tài)寄存器中置位 “Fault” (D[7:6])。
- 如果 RTD 電阻寄存器值大于或等于故障上限寄存器值,置位故障狀態(tài)寄存器的 RTD High。
- 如果 RTD 電阻值小于或等于故障下限寄存器值,則置位故障狀態(tài)寄存器的 RTD Low。
④、故障狀態(tài)寄存器(07h)
- 故障狀態(tài)寄存器鎖存所有檢測到的故障位。
- 向配置寄存器中的故障狀態(tài)清除位寫 1 時,將全部故障狀態(tài)位清零。
2、MAX31865 通過 SPI 進行通信
- MAX31865 支持 SPI 模式 1 和 3 。
- SPI 通信使用四個引腳:SDO(串行數(shù)據(jù)輸出)、SDI(串行數(shù)據(jù)輸入)、CS(片選)和 SCLK(串行時鐘)。
- SDI 和 SDO 分別是器件的串行數(shù)據(jù)輸入和輸出引腳。
讀操作時,從 SDO 輸出數(shù)據(jù);寫操作時,數(shù)據(jù)輸入至 SDI。- overline{text{CS}} 輸入啟動和終止數(shù)據(jù)傳輸。
- SCLK 同步主機(微控制器)和從機(MAX31865)之間的數(shù)據(jù)傳輸。
- 地址和數(shù)據(jù)字節(jié)移入串行數(shù)據(jù)輸入(SDI)和移出串行數(shù)據(jù)輸出(SDO)時, MSB 在前 。
- 任何傳輸都需要地址字節(jié)指定寫或讀操作,后面跟一個或多個數(shù)據(jù)字節(jié)。
- overline{text{CS}} 驅(qū)動為低電平后,傳輸?shù)牡谝粋€字節(jié)總為地址字節(jié),該字節(jié)的 MSB(A7)決定隨后的字節(jié)為寫還是為讀操作。
- 如果 A7 為 0,地址字節(jié)后為一個或多個字節(jié)讀操作;
- 如果 A7 為 1,地址字節(jié)后為一個或多個字節(jié)寫操作。
- 對于單字節(jié)傳輸,讀或?qū)?1 個字節(jié),然后 overline{text{CS}} 驅(qū)動為高電平。
- 對于多字節(jié)傳輸,寫入地址后,可以讀或?qū)懚鄠€字節(jié)。
- 只要 overline{text{CS}} 保持為低電平,地址則連續(xù)在全部存儲器內(nèi)遞增。
- 如果繼續(xù)移入或移出數(shù)據(jù),地址則從 7Fh/FFh 返回至 00h/80h。
- 存儲器地址無效時,報告 FFh 值。
- 注意: 如果對只讀寄存器執(zhí)行寫操作,不改變該寄存器的值 。
- 注意: CPHA 位極性必須設(shè)置為 1 。
二、硬件設(shè)計
1、接線說明
MAX31865 模塊 | STM32F407ZGT6 | 引腳定義 |
---|---|---|
VIN | 3.3V | 電源正極 VCC |
GND | GND | 電源負極 GND |
SCLK | B3 | 串行數(shù)據(jù)時鐘輸入引腳 |
SDO | B4 | 串行數(shù)據(jù)輸出引腳 |
SDI | B5 | 串行數(shù)據(jù)輸入引腳 |
nCS | B6 | 低電平有效片選引腳 |
MAX31865 模塊 | PT100/PT1000 | 引腳定義 |
---|---|---|
FORCE+ | 紅線 | 高邊RTD驅(qū)動 |
RTD+ | 紅線 | RTD輸入正端 |
RTD- | 藍線 | RTD輸入負端 |
FORCE- | 藍線 | 低邊RTD回路 |
2、模塊設(shè)計
- 只截取了 MAX31865 及其外圍電路,電源和隔離部分電路可以參考用戶手冊。
3、PT100/PT1000
- 默認是 4 線模式。
三、程序設(shè)計
1、讀取溫度數(shù)據(jù)的步驟
2、max31865_hardspi.h
#ifndef __MAX31865_HARDSPI_H
#define __MAX31865_HARDSPI_H
#include "./SYSTEM/sys/sys.h"
/******************************************************************************************/
/* 基準電阻的阻值 */
#define PT100_Resistance_Ref 402.0f /* PT100基準電阻的阻值 */
#define PT1000_Resistance_Ref 4020.0f /* PT1000基準電阻的阻值 */
/******************************************************************************************/
/******************************************************************************************/
/* 指令表 */
#define MAX31865_CONFIG_REG 0x00 /* 配置寄存器(00h、80h) */
#define MAX31865_RTD_MSB_REG 0x01 /* RTD電阻寄存器 - RTD MSBS(01h) */
#define MAX31865_RTD_LSB_REG 0x02 /* RTD電阻寄存器 - RTD LSBS(02h) */
#define MAX31865_RTD_HIGH_MSB_THRESHOLD_REG 0x03 /* 故障門限寄存器(03h、83h) */
#define MAX31865_RTD_HIGH_LSB_THRESHOLD_REG 0x04 /* 故障門限寄存器(04h、84h) */
#define MAX31865_RTD_LOW_MSB_THRESHOLD_REG 0x03 /* 故障門限寄存器(05h、85h) */
#define MAX31865_RTD_LOW_LSB_THRESHOLD_REG 0x04 /* 故障門限寄存器(06h、86h) */
#define MAX31865_FAULT_STATUS_REG 0x07 /* 故障狀態(tài)寄存器(07h) */
/******************************************************************************************/
/******************************************************************************************/
/* 配置寄存器 */
#define MAX31865_Init_2_4_Line 0xC1 /* 2、4線模式 */
#define MAX31865_Init_3_Line 0xD1 /* 3線模式 */
/******************************************************************************************/
/******************************************************************************************/
/* 函數(shù)聲明 */
void MAX31865_Init_HardSPI(void); /* 硬件SPI初始化MAX31865 */
uint8_t MAX31865_ReadRegister_HardSPI(uint8_t reg); /* 硬件SPI讀取MAX31865寄存器 */
void MAX31865_WriteRegister_HardSPI(uint8_t reg, uint8_t data); /* 硬件SPI寫MAX31865寄存器 */
float MAX31865_Get_Temperature_HardSPI(void); /* 獲取溫度值 */
uint8_t MAX31865_Set_Configuration(uint8_t data); /* 設(shè)置配置寄存器 */
uint8_t MAX31865_Read_Fault_Status(void); /* 讀取故障狀態(tài)寄存器 */
/******************************************************************************************/
#endif /* __MAX31865_HARDSPI_H */
3、max31865_hardspi.c
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/SPI/hardspi.h"
#include "./BSP/MAX31865/max31865_hardspi.h"
/**
* @brief 硬件SPI初始化MAX31865
* @param 無
* @retval 無
*/
void MAX31865_Init_HardSPI(void)
{
HardSPI1_CS1_Init(); /* 初始化CS1引腳 */
HSPI1_CS1(1);
HardSPI1_Init(); /* 初始化硬件SPI:SCK、MISO、MOSI */
HSPI1_Set_Speed(SPI_SPEED_32); /* 設(shè)置SPI1速度 */
MAX31865_Set_Configuration(MAX31865_Init_2_4_Line); /* 設(shè)置配置寄存器 */
}
/**
* @brief 硬件SPI讀取MAX31865寄存器
* @param reg:寄存器
* @retval data:讀取到的寄存器的值
*/
uint8_t MAX31865_ReadRegister_HardSPI(uint8_t reg)
{
uint8_t data = 0;
HSPI1_CS1(0);
HSPI1_Read_Write_Byte(reg & 0x7F);
data = HSPI1_Read_Write_Byte(0xFF);
HSPI1_CS1(1);
return data;
}
/**
* @brief 硬件SPI寫MAX31865寄存器
* @param reg:寄存器
* @param data:寫寄存器的值
* @retval 無
*/
void MAX31865_WriteRegister_HardSPI(uint8_t reg, uint8_t data)
{
HSPI1_CS1(0);
HSPI1_Read_Write_Byte(reg | 0x80);
HSPI1_Read_Write_Byte(data);
HSPI1_CS1(1);
}
/**
* @brief 獲取溫度值
* @param 無
* @retval temperature:溫度值
*/
float MAX31865_Get_Temperature_HardSPI(void)
{
uint16_t adc_code[2];
uint16_t data_adc_code;
float resistance;
float temperature;
/* RTD LSB寄存器的D0為故障位,表示是否檢測到任意RTD故障。 */
adc_code[0] = MAX31865_ReadRegister_HardSPI(MAX31865_RTD_MSB_REG); /* 讀取RTD MSBS(01h)寄存器 */
printf("RTD_MSB:%xrn", adc_code[0]);
adc_code[1] = MAX31865_ReadRegister_HardSPI(MAX31865_RTD_LSB_REG); /* 讀取RTD LSBS(02h)寄存器 */
printf("RTD_LSB:%xrn", adc_code[1]);
data_adc_code = (adc_code[0] < < 7) | (adc_code[1] > > 1); /* 獲取15位有效數(shù)據(jù) */
printf("ADC_Code:%xrn", data_adc_code);
resistance = ((float)data_adc_code * PT100_Resistance_Ref) / 32768.0f; /* 計算RTD的電阻值:Rrtd = (ADC Code * Rref)/(2^15)*/
printf("Resistance:%.2frn", resistance);
temperature = (resistance - 100.0f) / 0.385055f; /* 計算溫度值 */
printf("Temperature:%.2frn", temperature);
return temperature; /* 返回接收到的溫度值 */
}
/**
* @brief 設(shè)置配置寄存器
* @param data:要設(shè)置配置寄存器的值
* @retval Cfg_data:讀取配置寄存器的值
*/
uint8_t MAX31865_Set_Configuration(uint8_t data)
{
uint8_t Cfg_data;
MAX31865_WriteRegister_HardSPI(MAX31865_CONFIG_REG, data); /* 設(shè)置配置寄存器 */
Cfg_data = MAX31865_ReadRegister_HardSPI(MAX31865_CONFIG_REG); /* 讀取配置寄存器 */
printf("MAX31865_CONFIG_REG:%xrn", Cfg_data);
return Cfg_data;
}
/**
* @brief 讀取故障狀態(tài)寄存器
* @param 無
* @retval data:讀取到的故障狀態(tài)寄存器的值
*/
uint8_t MAX31865_Read_Fault_Status(void)
{
uint8_t data;
uint8_t config_data;
data = MAX31865_ReadRegister_HardSPI(MAX31865_FAULT_STATUS_REG); /* 讀取故障狀態(tài)寄存器 */
printf("MAX31865_FAULT_STATUS_REG:%xrn", data);
config_data = MAX31865_ReadRegister_HardSPI(MAX31865_CONFIG_REG); /* 讀取配置寄存器 */
MAX31865_WriteRegister_HardSPI(MAX31865_CONFIG_REG, config_data | 0x02); /* 清除故障狀態(tài)位 */
data = MAX31865_ReadRegister_HardSPI(MAX31865_FAULT_STATUS_REG); /* 讀取故障狀態(tài)寄存器 */
printf("MAX31865_FAULT_STATUS_REG:%xrn", data);
return data;
}
4、main.c
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./SYSTEM/usart/usart.h"
#include "configure.h"
#include "./BSP/MAX31865/max31865_hardspi.h"
int main(void)
{
Configure_Init();
while(1)
{
MAX31865_Set_Configuration(MAX31865_Init_2_4_Line); /* 設(shè)置配置寄存器 */
MAX31865_Get_Temperature_HardSPI(); /* 獲取溫度值 */
MAX31865_Read_Fault_Status(); /* 讀取故障狀態(tài)寄存器 */
delay_ms(2000);
}
}
四、功能展示 - 串口顯示
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
寄存器
+關(guān)注
關(guān)注
31文章
5492瀏覽量
127685 -
溫濕度傳感器
+關(guān)注
關(guān)注
6文章
614瀏覽量
37096 -
MAX31865
+關(guān)注
關(guān)注
1文章
9瀏覽量
9762 -
STM32F407ZGT6
+關(guān)注
關(guān)注
4文章
5瀏覽量
5302
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
stm32f407ZGT6生成的bootloader打印的app分區(qū)偏移地址正常嗎?
stm32f407ZGT6生成的bootloader打印的app分區(qū)偏移地址正常嗎?bootloader使用iot平臺配置自動生成的,日志信息如下圖
發(fā)表于 08-15 08:24
零知開源——STM32F4驅(qū)動MAX31865實現(xiàn)PT100高精度測溫
本教程詳細介紹了零知增強板(STM32F407VET6)通過MAX31865模塊讀取三線制PT100鉑電阻溫度的完整實現(xiàn)方案。重點包括:1)硬件配置,需修改

零知開源——STM32F4驅(qū)動MAX31865實現(xiàn)PT100高精度測溫
? 簡介本教程基于零知增強板(主控芯片STM32F407VET6),演示如何通過MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過I2C OLED實時顯示
發(fā)表于 05-26 18:52

零知開源——STM32F1驅(qū)動MAX31865讀取三線PT100溫度傳感器
簡介本教程基于零知標準板(主控芯片STM32F103RBT6),演示如何通過MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過I2C OLED實時顯示
發(fā)表于 05-23 18:27
零知開源——STM32F1驅(qū)動MAX31865讀取三線PT100溫度傳感器
本教程詳細介紹了如何使用零知標準板(STM32F103RBT6)通過MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過I2C OLED實時顯示

PT100溫度采集模塊:數(shù)字濾波、線阻修正
PT100溫度采集模塊是一種基于鉑電阻(Pt100)的高精度溫度檢測裝置,憑借其穩(wěn)定性、抗干擾能力和寬溫度范圍(-200℃~+850℃),廣
PT100熱電阻溫度采集模塊:數(shù)字濾波,線阻修正
PT100熱電阻溫度采集模塊是一種廣泛應(yīng)用于工業(yè)自動化、環(huán)境監(jiān)測、醫(yī)療設(shè)備等領(lǐng)域的精密溫度測量裝置。以鉑電阻(Pt100)為核心傳感元件,通過高精度信號調(diào)理電路和數(shù)字化處理技術(shù),實現(xiàn)對
max31865測溫跳變大
pt100和max31865測室溫跳變比較大,會從23.04跳到23.47,23.75反復(fù)跳變超過了0.5的誤差范圍,在VDD和GND之間加上0.1和10的濾波電容也不行,該怎么解決
發(fā)表于 04-30 23:34
使用STM32F407ZGT6芯片做小車主控時,總是在運行時芯片突然被鎖,無法下載程序怎么解決?
在使用STM32F407ZGT6芯片做小車主控時,總是在運行時芯片突然被鎖,無法下載程序。
使用STM32 ST-LINK Utility也無法解除保護
發(fā)表于 03-11 06:20
stm32f407zgt6使用ADC設(shè)備,終端沒得任何反應(yīng)是怎么回事?
使用的stm32f407zgt6,想使用ADC設(shè)備來著,也用cubemx重新打開usart1了,最后程序編譯成功,下載成功看了,但是終端沒得任何反應(yīng),換了一個串口助手也是沒有反應(yīng),不知道哪里出了問題。
發(fā)表于 03-07 06:08
ADS1247使用三線制PT100,如何判定PT100是否接入?
ADS1247使用三線制PT100的時候,我發(fā)現(xiàn)一個問題,就是不接PT100的話,仍然有溫度顯示,這個溫度可能是固定不變的,也可能是隨機跳動的,但是卻在我的測溫范圍內(nèi),我怎么才能判定
發(fā)表于 01-24 07:34
PT100溫度采集模塊性能特點
PT100溫度采集模塊作為現(xiàn)代工業(yè)自動化、環(huán)境監(jiān)測以及遠程監(jiān)控系統(tǒng)中的重要組成部分,憑借其高精度、穩(wěn)定性強的特點,發(fā)揮著至關(guān)重要的作用。 工作原理 聚英PT100溫度采集模塊的工作原理
PT100溫度采集模塊
PT100溫度采集模塊,作為現(xiàn)代工業(yè)自動化和遠程監(jiān)控系統(tǒng)中的重要組成部分,作為一種高精度、穩(wěn)定性強的溫度傳感器,在工業(yè)自動化、環(huán)境監(jiān)測以及遠程監(jiān)控系統(tǒng)等領(lǐng)域中發(fā)揮著至關(guān)重要的作用。 一、工作原理 聚
ADS1220用于三線制PT100溫度采樣,溫度變化緩慢的原因?怎么解決?
最近開發(fā)產(chǎn)品,用了TI的ADS1220作為三線制PT100的溫度采樣,電路圖和PCB布局如下,程序里的參考電壓設(shè)置在1.65V,但是如果當前環(huán)溫是20℃的話,用手捏一下PT100,溫度
發(fā)表于 12-20 06:07
評論