? 簡介
本教程基于主控芯片為STM32F407VET6的零知增強板,演示如何通過MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過I2C OLED實時顯示溫度值和電阻值。重點包含硬件接線配置、三線制PT100的特殊跳線修改,以及完整的代碼解析。文中還將解析PT100的溫度計算原理,并展示實際運行效果。
一、硬件簡介
1.MAX31865模塊
MAX31865是專用于RTD(電阻溫度檢測器)的信號調(diào)理芯片,支持2/3/4線制PT100/PT1000傳感器。其內(nèi)置ADC可將鉑電阻的阻值變化轉(zhuǎn)換為數(shù)字信號,并通過SPI接口與主控通信。關(guān)鍵特性:
15位分辨率
支持自動誤差補償
可配置參考電阻(Rref)
2.PT100鉑電阻
PT100是一種基于鉑材料的溫度傳感器,0℃時阻值為100Ω,溫度系數(shù)為0.385Ω/℃。其阻值與溫度的關(guān)系可通過以下方式計算:
線性近似公式(適用于0~100℃):

其中R0=100Ω,α=0.00385,T為溫度(℃)。
精確計算(使用Callendar-Van Dusen方程):

(適用于-200℃~850℃)
MAX31865的溫度計算
芯片內(nèi)部通過測量RTD電阻與參考電阻(Rref)的比例,結(jié)合查表法或公式計算實際溫度值。本代碼中調(diào)用max.temperature()函數(shù)即自動完成此過程。
二、硬件準備
1.所需材料
零知增強板(STM32F407VET6)
MAX31865模塊(支持三線制PT100)
三線制PT100傳感器
0.96寸I2C OLED顯示屏(SSD1306驅(qū)動)
杜邦線若干
2.PT100特性曲線
溫度(℃) | 0 | 100 | 200
電阻(Ω) | 100 | 138.5 | 175.8
3.MAX31865跳線修改
三線制PT100必須修改模塊電路板跳線!
找到MAX31865模塊上的Rref電阻附近的兩個跳線(標記為2和4的焊盤)。
切斷Rref正上方左側(cè)的跳線(即斷開焊盤2的連接,保留焊盤3并短接),模塊使用三線制模式。采用三線PT100,其接法如下
修改后示意圖:

接線時,請根據(jù)線纜顏色進行正確連接:對于兩紅一藍的線纜,將藍線接至RTD-,紅線分別接至RTD+和F+。請參照圖示,確保將觸點(2/3 Wire)焊接牢固。若遇到兩藍一紅的線纜,則需反向連接。
重要提示:若未斷開24號連接,通電測量時PT100的電阻值將僅為正常值的一半。未通電時測量值約為120Ω,但通電后可能降至60Ω左右。這是由于24號連接之間存在接地,且存在并聯(lián)電阻,導(dǎo)致整體電阻值降低。
4.接線配置表
MAX31865與零知標準板連接:
| MAX31865引腳 | 零知增強板引腳 | 功能說明 |
|---|---|---|
| VCC | 3V3 | 電源正極 |
| GND | GND | 電源地 |
| CLK | 52 | SPI時鐘線 |
| SDO | 50 | 數(shù)據(jù)輸出 |
| SDI | 51 | 數(shù)據(jù)輸入 |
| CS | 53 | 片選信號 |
OLED與零知標準板連接:
| OLED引腳 | 零知標準板引腳 | 功能說明 |
|---|---|---|
| VCC | 3V3 | 電源正極 |
| GND | GND | 電源地 |
| SDA | SDA/20 | I2C數(shù)據(jù)線 |
| SCL | SCL/21 | I2C時鐘線 |
硬件連接圖:

硬件實物圖:

三、軟件實現(xiàn)
1.核心庫說明
#include ?Arduino.h??> #include ?SPI.h??> #include ?Wire.h??> #include ?Adafruit_GFX.h??> #include ?Adafruit_SSD1306.h??> //OLED顯示驅(qū)動庫 #include ?Adafruit_MAX31865.h??> //MAX31865溫度傳感器庫文件
2.硬件初始化
// SSD1306 OLED 顯示屏初始化 #define SCREEN_HEIGHT 64 #define OLED_RESET -1 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // MAX31865 初始化 #define RREF 430.0 #define RTD 100.0 Adafruit_MAX31865 max1 = Adafruit_MAX31865(53);//使用硬件SPI,如果是軟件SPI則使用: (53,51,50,52)
3. 主程序邏輯
setup()函數(shù),
初始化串口、OLED和MAX31865,設(shè)置三線制模式:
void setup() {
Serial.begin(115200);
// Initialize SSD1306 display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.display();
// Initialize MAX31865
max1.begin(MAX31865_3WIRE);
}
loop()函數(shù),
循環(huán)讀取溫度并顯示:
void loop() {
uint16_t rtd = max1.readRTD();
float ratio = rtd;
ratio /= 32768;
float temp = max1.temperature(RTD, RREF);
// Prepare display buffer
display.clearDisplay();
// Display temperature and resistance
display.setCursor(0, 0);
display.print(F("MAX31865 PT100 Sensor"));
display.setCursor(0, 15);
display.print(F("Temp: "));
display.print(temp);
display.print(F(" C"));
display.setCursor(0, 30);
display.print(F("Resistance: "));
display.print(RREF * ratio);
display.print(F(" "));
display.print("Om"); // Omega symbol
// Check error status
uint8_t fault = max1.readFault();
if(fault) {
display.setCursor(0, 45);
display.print(F("FAULT DETECTED:"));
if(fault & MAX31865_FAULT_HIGHTHRESH) {
display.setCursor(0, 55);
display.print(F("RTD_high"));
}
if(fault & MAX31865_FAULT_LOWTHRESH) {
display.setCursor(0, 55);
display.print(F("RTD_low"));
}
max1.clearFault();
} else {
display.setCursor(0, 45);
display.print(F("Status: OK"));
}
// Serial output for debugging
Serial.print(F("RTD value: ")); Serial.println(rtd);
Serial.print(F("Temperature: ")); Serial.print(temp);
Serial.println(F(" C"));
// Check and print any faults
if (fault) {
Serial.print(F("Fault 0x")); Serial.println(fault, HEX);
if (fault & MAX31865_FAULT_HIGHTHRESH) {
Serial.println(F("RTD high threshold"));
}
if (fault & MAX31865_FAULT_LOWTHRESH) {
Serial.println(F("RTD low threshold"));
}
max1.clearFault();
}
display.display();
delay(1000);
}
四、運行效果
1.OLED顯示正常狀態(tài)


第1行:標題 "MAX31865 PT100 Sensor"
第2行:實時溫度(如 "Temp: 30.3 C")
第3行:鉑電阻阻值(如 "Resistance: 112.89Ω")
第4~5行:狀態(tài)信息(正常顯示 "Status: OK",異常顯示具體錯誤)
2.串口輸出內(nèi)容
打開零知開源平臺的串口監(jiān)視器(波特率115200),將看到以下格式數(shù)據(jù)和檢測到的故障碼:


3.數(shù)據(jù)關(guān)聯(lián)說明
RTD Raw值:MAX31865直接讀取的16位ADC原始數(shù)據(jù)(范圍0~32768)。
Resistance:根據(jù)公式

計算得出。
Temperature:調(diào)用庫函數(shù)自動轉(zhuǎn)換的溫度值,內(nèi)部使用Callendar-Van Dusen方程計算。
4.演示視頻
https://live.csdn.net/v/478784?spm=1001.2014.3001.5501
零知增強板驅(qū)動MAX31865讀取三線PT100溫度傳感器
5.完整工程獲取:
通過網(wǎng)盤分享的文件:F4_MAX31865_PT100.zip 鏈接: https://pan.baidu.com/s/1eH20AzfXBWHDDwlJ15GRAw?pwd=x6na 提取碼: x6na
注意事項:
長距離傳輸時建議使用屏蔽雙絞線
定期使用無水酒精清潔PT100探頭
避免在強電磁干擾環(huán)境下安裝傳感器
五、問題排查指南
常見異常處理
顯示白屏
檢查I2C地址是否為0x3C
確認Wire.begin()是否執(zhí)行
溫度值-245℃
驗證begin()參數(shù)是否為MAX31865_3WIRE
測量RTD對地阻抗(正常應(yīng)>10MΩ)
持續(xù)報錯
檢查MAX31865的24焊盤跳線是否已切斷左側(cè)焊盤、2/3 Wire焊盤和43焊盤焊錫短接。
用萬用表測量PT100阻值是否正常(0℃時約100Ω,室溫30℃時約120Ω)。
校準建議
冰點校準:將PT100置于0℃環(huán)境,調(diào)整RREF使顯示0±0.3℃
滿量程校準:100℃沸水環(huán)境,微調(diào)RTD參數(shù)
線性校準:使用標準溫度源進行三點校正
審核編輯 黃宇
-
RTD
+關(guān)注
關(guān)注
1文章
162瀏覽量
29135 -
測溫
+關(guān)注
關(guān)注
1文章
262瀏覽量
32594 -
STM32F4
+關(guān)注
關(guān)注
3文章
204瀏覽量
29848 -
MAX31865
+關(guān)注
關(guān)注
1文章
9瀏覽量
9801
發(fā)布評論請先 登錄
STM32F407ZGT6驅(qū)動MAX31865獲取PT100溫度數(shù)據(jù)
零知開源——STM32F4實現(xiàn)ILI9486顯示屏UI界面系列教程(二):日歷功能實現(xiàn)
零知開源——STM32F4驅(qū)動MAX31865實現(xiàn)PT100高精度測溫
零知開源——STM32F1驅(qū)動MAX31865讀取三線PT100溫度傳感器
零知開源——STM32F1驅(qū)動MAX31865讀取三線PT100溫度傳感器

零知開源——STM32F4驅(qū)動MAX31865實現(xiàn)PT100高精度測溫
評論