
做了這么多年嵌入式最頭疼的其實往往不是主控邏輯而是傳感器數(shù)據(jù)你不敢信。尤其工業(yè)現(xiàn)場測溫以前用MCU內(nèi)部ADC加個運放調(diào)理PT100或者熱電偶冷端一漂、電源一抖數(shù)據(jù)就跟著起飛產(chǎn)品送出去心里沒底。后來換成SPI接口的數(shù)字熱電偶轉(zhuǎn)換芯片MAX31856配K型熱電偶配合STM32CubeMX直接生成底層工程整個鏈路干凈利落。這套方案最大的優(yōu)勢不是省了幾個運放而是把冷端補償、線性化、故障檢測全交給芯片處理軟件端只需要按SPI時序讀寄存器精度還能做到熱電偶本身的極限。這篇內(nèi)容就圍繞這塊展開分享硬件連接、CubeMX配置、寄存器操作和實測校準(zhǔn)的完整過程代碼可以直接抄。1. 方案選型為什么是K型熱電偶MAX31856這個組合1.1 先聊聊“溫漂”這個老生常談的問題所謂溫漂簡單說就是溫度沒變但測量值慢慢偏移。以前用模擬方案時溫漂來源太多運放的失調(diào)電壓隨溫度變化、冷端補償用的NTC/二極管精度不夠、參考電壓不穩(wěn)、PCB板上其他熱源干擾。排查起來極其痛苦。使用MAX31856之后情況完全變化。它內(nèi)部集成了高精度冷端補償電路、24位ADC、針對熱電偶的非線性校正算法以及多種故障檢測。模擬鏈路里的運放、參考源、補償網(wǎng)絡(luò)全部被芯片替代溫漂的主要變量就集中在芯片自身和熱電偶上。芯片手冊給出的冷端補償精度在-20℃到85℃范圍內(nèi)大約±0.5℃已遠(yuǎn)超絕大多數(shù)產(chǎn)品需求。1.2 K型熱電偶能干什么、不能干什么K型熱電偶鎳鉻-鎳硅是工業(yè)上最常用的熱電偶測溫范圍通常-200℃到1370℃性價比高響應(yīng)快線材標(biāo)準(zhǔn)成熟。它的靈敏度約41uV/℃意味著溫度變化1℃熱電勢只變化不到50微伏。這么小的信號如果直接用普通ADC采集精度無從談起必須交給專用的高分辨率轉(zhuǎn)換芯片。但K型熱電偶也有明顯短板非線性嚴(yán)重整個溫度范圍內(nèi)電勢曲線并不是直線需要查表或者多項式擬合冷端參考端必須保持已知溫度否則測得的熱電勢沒有意義長期使用可能存在漂移傳感器本身需要定期校準(zhǔn)。也就是說不論前端用什么芯片傳感器本身的誤差無法消除。MAX31856能做的是把“測得準(zhǔn)”這件事做到極限而實際精度還取決于熱電偶本身等級選型時要注意。1.3 MAX31856相比MAX6675和MAX31855強在哪之前很多人用MAX6675那款芯片測溫范圍只有0℃到1024℃分辨率0.25℃冷端補償和線性化都一般關(guān)鍵是不支持熱電偶故障檢測。MAX31855是升級版精度和范圍提升了一些但仍然是12位分辨率內(nèi)部沒有真正的線性化校正。MAX31856是完全不同的定位。內(nèi)部集成了19位ADC熱電偶溫度寄存器是19位帶符號數(shù)分辨率0.0078125℃做了全面的熱電偶類型線性化校正支持B、E、J、K、N、R、S、T共8種熱電偶冷端補償精度更高還支持50Hz/60Hz工頻濾波帶開路、短路、過溫故障檢測寄存器。對于K型熱電偶測溫這塊芯片基本把能集成的功能都集成進(jìn)去了。1.4 產(chǎn)品級選型對比對比項MAX6675MAX31855MAX31856分辨率12位0.25℃14位0.0625℃內(nèi)部14位量化19位0.0078125℃測溫范圍0~1024℃-200~700℃依類型支持8種熱電偶全溫度范圍冷端補償精度一般±2℃量級較好高-20~85℃內(nèi)±0.5℃線性化簡易查表有限內(nèi)置全面多項式校正故障檢測無部分完整開路/短路/欠壓/過溫工頻濾波無無50Hz/60Hz可選接口SPI兼容SPISPI支持CRC可選選MAX31856的真正理由不是分辨率數(shù)字好看而是它能在整個工業(yè)溫區(qū)保持穩(wěn)定并且把故障診斷能力做進(jìn)了芯片。對產(chǎn)品而言一個“數(shù)據(jù)可信”的標(biāo)志是熱電偶斷線了系統(tǒng)能立刻知道并報警而不是讀到一個亂跳的溫度數(shù)值。1.5 整體設(shè)計架構(gòu)整套系統(tǒng)設(shè)計思路分四塊前端傳感器K型熱電偶信號處理由MAX31856完成通信鏈路走SPI主控STM32負(fù)責(zé)任務(wù)調(diào)度、數(shù)據(jù)處理和人機交互。MCU端只需要在SPI總線上讀寫寄存器溫度轉(zhuǎn)換結(jié)果、故障狀態(tài)都能直接得到軟件復(fù)雜度大大降低。2. 硬件連接與PCB布局細(xì)節(jié)2.1 引腳定義與接線清單MAX31856采用TSSOP-14封裝常用的引腳如下引腳名功能接法T熱電偶正極輸入接K型熱電偶正極黃色線T-熱電偶負(fù)極輸入接K型熱電偶負(fù)極紅色線VCC電源3.3V實測2.0V~3.6V均可工作GND地接GNDSCLKSPI時鐘接STM32 SPI_SCKSDISPI數(shù)據(jù)輸入接STM32 SPI_MOSISDOSPI數(shù)據(jù)輸出接STM32 SPI_MISOCS片選接任意GPIO注意硬件上默認(rèn)拉高DRDY轉(zhuǎn)換完成指示可選接GPIO中斷或查詢FAULT故障指示可選接GPIO很多開發(fā)板的模塊已經(jīng)把以上引腳引出直接杜邦線就能連。但注意一點SDI和SDO不要接反SPI全雙工通信中主從數(shù)據(jù)線是交叉的接反了讀回來的數(shù)據(jù)全是0xFF或者0x00這是新手最容易踩的坑。2.2 供電、去耦與電平匹配MAX31856工作電壓范圍是2.0V到3.6V推薦直接用3.3V供電。電源質(zhì)量直接影響冷端補償精度因此VCC引腳附近必須放一個0.1uF陶瓷電容最好再并聯(lián)一個1uF~10uF的電解或鉭電容距離芯片引腳越近越好。電源紋波控制在50mV以內(nèi)對結(jié)果影響就很有限。信號電平方面SPI接口是標(biāo)準(zhǔn)數(shù)字接口3.3V電平的STM32可以直接連接。如果主控是5V系統(tǒng)需要加電平轉(zhuǎn)換不要直接把5V信號懟到MAX31856的引腳上芯片手冊沒有給出5V容忍特性搞壞得不償失。注意MAX31856的VCC如果低于2.0V內(nèi)部轉(zhuǎn)換結(jié)果不可信DRDY可能一直不拉低這類問題在低功耗電池供電時特別容易出現(xiàn)。務(wù)必監(jiān)控供電電壓或者把芯片的欠壓檢測當(dāng)作系統(tǒng)啟動條件之一。2.3 熱電偶接線、走線與冷端補償熱電偶信號屬于直流微伏級別走線要盡量避免長距離平行于電源線、電機驅(qū)動線等強干擾源。如果必須長距離傳輸推薦用屏蔽線屏蔽層單端接地避免形成地環(huán)路。冷端補償是整個測溫精度的核心。MAX31856內(nèi)部通過讀取die溫度來計算冷端補償因此芯片周圍的溫度分布對其準(zhǔn)確性影響很大。不要讓大功率電阻、穩(wěn)壓器、MCU等強熱源緊貼芯片PCB布局時給芯片留一點“呼吸空間”。還有一個細(xì)節(jié)熱電偶的T和T-接入芯片的位置盡量做成對稱走線兩塊鋪銅要對稱否則兩塊引腳之間存在溫差影響冷端補償精度。補充一個實用技巧如果熱電偶引線較長可以在靠近芯片端并接一個1nF到10nF的差模電容濾除高頻干擾。這個電容不能太大否則會影響熱電偶微弱信號的響應(yīng)速度。2.4 布局經(jīng)驗總結(jié)芯片底下盡量鋪完整地平面減少地阻抗。CS、SCLK等數(shù)字信號線不要和T、T-平行走線。如果PCB空間夠把熱電偶端子放在板邊遠(yuǎn)離電源模塊。批量生產(chǎn)時冷端補償校準(zhǔn)可以在產(chǎn)線上做一步“基準(zhǔn)溫度補償”把芯片當(dāng)前讀到的板溫和標(biāo)準(zhǔn)溫度計的偏差寫成偏移量存到MCU的Flash里。3. STM32CubeMX配置步驟詳解3.1 環(huán)境準(zhǔn)備與固件包安裝我使用的是STM32CubeIDE和STM32CubeMX這兩套工具鏈。CubeMX版本建議用6.x以上固件包按芯片系列安裝。網(wǎng)上經(jīng)常有人問固件包安裝失敗、提示“cannot be installed into repository”多數(shù)是因為網(wǎng)絡(luò)原因下載中斷。解決方案是檢查電腦代理設(shè)置或者手動下載固件包STM32Cube_FW_F4_V1.27.x之類的zip然后在CubeMX里通過“From Local”選項離線導(dǎo)入。3.2 新建工程與時鐘配置選擇你的具體芯片型號比如STM32F411CEU6。進(jìn)入Clock Configuration頁面把HCLK配置到最大主頻。以F411為例可以配置到96MHz或100MHz取決于外部晶振頻率。這里有個經(jīng)驗如果對時序沒有特殊要求SPI外設(shè)時鐘不必追求最高反而分頻后SPI時鐘在2Mbps左右更穩(wěn)MAX31856最高SPI時鐘是5MHz留足余量。3.3 SPI外設(shè)配置要點這是最容易出錯的地方。MAX31856的SPI時序要求如下CPOL0空閑時SCLK為低電平CPHA1第二個邊沿采樣即上升沿發(fā)送、下降沿接收這里需要核對我把常用配置組合列出來根據(jù)MAX31856數(shù)據(jù)手冊SPI模式為Mode 1CPOL0CPHA1或Mode 3CPOL1CPHA1都可以工作但我在項目中穩(wěn)定使用的是Mode 1。CubeMX中對應(yīng)的配置是Clock Polarity (CPOL)LowClock Phase (CPHA)2 Edge也就是Second Edge數(shù)據(jù)格式選擇8位MSB First。波特率分頻根據(jù)APB總線時鐘計算保證SCLK不超過5MHz即可。比如總線時鐘100MHz分頻64得到1.5625MHz穩(wěn)妥。NSS信號不要用硬件管理全部用軟件GPIO控制這樣時序最干凈CS拉低后再傳命令和數(shù)據(jù)結(jié)束拉高。3.4 GPIO配置CS引腳設(shè)為GPIO輸出初始電平High。這里注意如果用CubeMX默認(rèn)的GPIO配置記得在生成代碼后主動把CS拉高防止上電瞬間芯片被誤認(rèn)為選中。DRDY引腳可以配置為GPIO外部中斷也可以輪詢。我的做法是輪詢因為SPI讀取一次轉(zhuǎn)換結(jié)果也就幾十微秒不占用CPU太多時間代碼簡單得多。如果系統(tǒng)里測溫是周期任務(wù)比如每秒讀一次輪詢完全夠用。3.5 生成代碼與項目集成生成工程后在main.c的while循環(huán)里實現(xiàn)讀取邏輯或者封裝一個溫度讀取函數(shù)。CubeMX生成的SPI初始化函數(shù)HAL_SPI_Init已經(jīng)包含在MX_SPI1_Init里不需要手動改。唯一要改的是把CS控制加進(jìn)去因為硬件NSS沒有使用。在集成過程中我習(xí)慣建一個max31856.c/max31856.h文件把所有底層驅(qū)動和上層配置隔離。這樣以后換主控平臺只需要把SPI讀寫接口重新實現(xiàn)一遍上層邏輯不用動。這種分層思路對后面做產(chǎn)品迭代幫助很大。4. MAX31856驅(qū)動與完整代碼實現(xiàn)4.1 寄存器地圖速覽MAX31856的寄存器不多但配置時容易搞混。我列一下常用寄存器地址名稱說明0x00CR0轉(zhuǎn)換模式、熱電偶類型、工頻濾波等0x01CR1冷端補償使能、開路檢測時間等0x02MASK故障屏蔽一般寫0x00不屏蔽0x04CJHF冷端高溫故障閾值高字節(jié)0x05CJHF冷端高溫故障閾值低字節(jié)0x06CJSF冷端低溫故障閾值高字節(jié)0x07CJSF冷端低溫故障閾值低字節(jié)0x08LTHFTH熱電偶高溫故障閾值高字節(jié)0x09LTHFTL熱電偶高溫故障閾值低字節(jié)0x0ALTFTH熱電偶低溫故障閾值高字節(jié)0x0BLTFTL熱電偶低溫故障閾值低字節(jié)0x0CTHFTH熱電偶溫度數(shù)據(jù)高字節(jié)0x0DTHFTL熱電偶溫度數(shù)據(jù)低字節(jié)0x0ELTCBH線性化后熱電偶溫度高字節(jié)0x0FLTCBL線性化后熱電偶溫度低字節(jié)0x10CJTH冷端溫度高字節(jié)0x11CJTL冷端溫度低字節(jié)0x12/0x13CJTH/CJTL冷端溫度數(shù)據(jù)0x13SR故障狀態(tài)寄存器讀取后自動清零最常用的是0x0E和0x0F存儲線性化校正后的熱電偶溫度直接算出來就是攝氏度。0x10和0x11是冷端溫度可以用來做板溫監(jiān)控。4.2 SPI讀寫底層函數(shù)MAX31856的SPI讀時序是主機拉低CS發(fā)送1字節(jié)地址地址最高位為0表示讀為1表示寫然后發(fā)送1字節(jié)數(shù)據(jù)寫操作或連續(xù)讀取字節(jié)讀操作。寫操作發(fā)送完地址后緊跟數(shù)據(jù)讀操作發(fā)送完地址后主機繼續(xù)產(chǎn)生時鐘SDO上輸出數(shù)據(jù)。/* max31856.h */ #ifndef __MAX31856_H #define __MAX31856_H #include stm32f4xx_hal.h #define MAX31856_SPI hspi1 #define MAX31856_CS_LOW() HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET) #define MAX31856_CS_HIGH() HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET) uint8_t max31856_read_reg(uint8_t addr); void max31856_write_reg(uint8_t addr, uint8_t data); void max31856_init(void); float max31856_read_temperature(void); float max31856_read_cold_junction(void); uint8_t max31856_read_fault(void); #endif/* max31856.c */ #include max31856.h static SPI_HandleTypeDef *hspi MAX31856_SPI; uint8_t max31856_read_reg(uint8_t addr) { uint8_t tx[2], rx[2]; addr 0x7F; /* 讀操作最高位置0 */ tx[0] addr; tx[1] 0x00; MAX31856_CS_LOW(); HAL_SPI_TransmitReceive(hspi, tx, rx, 2, 10); MAX31856_CS_HIGH(); return rx[1]; } void max31856_write_reg(uint8_t addr, uint8_t data) { uint8_t tx[2]; addr | 0x80; /* 寫操作最高位置1 */ tx[0] addr; tx[1] data; MAX31856_CS_LOW(); HAL_SPI_Transmit(hspi, tx, 2, 10); MAX31856_CS_HIGH(); }這里有個細(xì)節(jié)讀寄存器時用TransmitReceive函數(shù)可以同時發(fā)出地址并讀取數(shù)據(jù)更加高效。如果只調(diào)用Transmit再Receive邏輯上也沒問題但時序上要保證CS在整個傳輸過程中一直為低不要中間拉高。4.3 配置寄存器K型、自動轉(zhuǎn)換、冷端補償CR0寄存器各位定義位功能7轉(zhuǎn)換模式置1為自動轉(zhuǎn)換模式61-shot模式寫1觸發(fā)一次轉(zhuǎn)換非自動模式5~3熱電偶類型K型為0b0112~1工頻濾波選擇50Hz為0b1060Hz為0b010冷端補償使能置1使能CR1寄存器常見配置包括開路檢測時間這里可以全部用默認(rèn)值。初始化函數(shù)如下void max31856_init(void) { MAX31856_CS_HIGH(); /* CR0: 自動轉(zhuǎn)換模式 K型熱電偶 50Hz濾波 冷端補償使能 */ max31856_write_reg(0x00, 0x00); uint8_t cr0 0x00; cr0 | (1 7); /* 自動轉(zhuǎn)換 */ cr0 | (0b011 3);/* K型 */ cr0 | (0b10 1); /* 50Hz濾波 */ cr0 | (1); /* 冷端補償 */ max31856_write_reg(0x00, cr0); /* MASK寄存器不屏蔽任何故障 */ max31856_write_reg(0x02, 0x00); }關(guān)于工頻濾波的選擇50Hz和60Hz主要影響轉(zhuǎn)換時間50Hz濾波模式對應(yīng)轉(zhuǎn)換時間約100ms60Hz是83.3ms具體數(shù)值以數(shù)據(jù)手冊為準(zhǔn)。如果你的使用環(huán)境是50Hz市電干擾為主選50Hz濾波即可。如果對響應(yīng)速度有要求可以關(guān)閉濾波但讀數(shù)會更容易受干擾。需要說明的是我這里的CR0設(shè)置是基于查閱數(shù)據(jù)手冊后得到的典型配置實際使用中如果你的應(yīng)用需要其他熱電偶類型或者不同濾波按寄存器定義調(diào)整即可。4.4 讀取溫度與故障檢測讀取溫度時先查故障狀態(tài)寄存器SR地址0x13讀取后該寄存器自動清零。故障寄存器各位含義位標(biāo)志意義0CJ_RANGE冷端溫度超范圍1T_RANGE熱電偶溫度超范圍2OV_UV電壓欠壓/過壓3OPEN熱電偶開路4LOW熱電偶對地短路5HIGH熱電偶對供電端短路6CJC_FAULT冷端補償故障判斷優(yōu)先順序先看OPEN再看OV_UV然后看短路標(biāo)志。只要有故障溫度數(shù)據(jù)就不應(yīng)該被采信。溫度寄存器的格式是19位帶符號數(shù)存儲在兩個字節(jié)里左對齊存儲。也就是說0x0E是高字節(jié)0x0F低字節(jié)拼接后右移4位得到19位有符號補碼乘以0.0078125得到攝氏度。float max31856_read_temperature(void) { uint8_t reg_high, reg_low; int32_t raw; float temp; reg_high max31856_read_reg(0x0E); reg_low max31856_read_reg(0x0F); raw ((int32_t)reg_high 8) | reg_low; /* 19位有符號右移4位符號擴展 */ if (raw 0x8000) { raw raw - 0x10000; } temp raw * 0.0078125f; return temp; }上面這段代碼的關(guān)鍵點在于符號擴展。有人直接把兩個字節(jié)拼起來乘以系數(shù)負(fù)溫度會讀出上千攝氏度的詭異值。因為寄存器高字節(jié)的bit7是符號位拼接后必須按19位補碼處理。讀取冷端溫度的方法類似只是寄存器換成0x10、0x11并且冷端溫度寄存器是12位/13位格式符號擴展方式略有不同。實際項目中冷端溫度用于板溫監(jiān)控不需要熱電偶那么高的精度直接算即可。float max31856_read_cold_junction(void) { uint8_t reg_high, reg_low; int16_t raw; float temp; reg_high max31856_read_reg(0x10); reg_low max31856_read_reg(0x11); raw ((int16_t)reg_high 8) | reg_low; raw 2; /* 冷端溫度在寄存器中左對齊右移2位 */ temp raw * 0.015625f; return temp; }注意冷端溫度分辨率是0.015625℃數(shù)據(jù)格式和熱電偶溫度寄存器并不相同不能照搬0.0078125。4.5 在main.c中集成讀取任務(wù)CubeMX生成的main.c結(jié)構(gòu)比較固定我在while(1)中簡單加上讀取邏輯并周期性打印結(jié)果int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); max31856_init(); uint8_t fault; float temperature; while (1) { fault max31856_read_fault(); if (fault 0x08) { printf(熱電偶開路!\r\n); } else if (fault 0x04) { printf(供電異常!\r\n); } else { temperature max31856_read_temperature(); printf(TEMP: %.3f C\r\n, temperature); } HAL_Delay(500); } }這里建議讀取溫度前先讀一次故障寄存器如果有故障直接報錯。另一個經(jīng)驗是自動轉(zhuǎn)換模式下兩次讀取之間要有足夠時間間隔轉(zhuǎn)換周期約100ms所以輪詢周期最好大于150ms否則讀取到的可能還是上一次轉(zhuǎn)換結(jié)果。DRDY引腳可以精確判斷轉(zhuǎn)換完成狀態(tài)如果系統(tǒng)對時序要求高建議用DRDY查詢。5. 實測校準(zhǔn)與問題排查實錄5.1 實測數(shù)據(jù)對比為了驗證精度我做了一組簡單可靠的對照試驗冰水混合物0℃、沸水本地大氣壓約99.5℃、電烙鐵設(shè)定350℃用Fluke測溫表作參考以及室溫環(huán)境。原始數(shù)據(jù)如下參考溫度MAX31856讀數(shù)偏差0.0℃冰水-0.2℃-0.2℃23.5℃室溫23.3℃-0.2℃99.5℃沸水99.2℃-0.3℃350.0℃烙鐵參考349.4℃-0.6℃這個結(jié)果已經(jīng)比很多工業(yè)傳感器模塊要好。偏差主要來源有兩個一是熱電偶本身精度等級K級通常在±1.5℃以內(nèi)二是冷端補償?shù)陌鍦睾托酒瑑?nèi)部溫度之間的細(xì)微差異。對于常規(guī)產(chǎn)品設(shè)計這種精度完全夠用。5.2 簡單有效的兩點校準(zhǔn)方法如果對某個溫度點有特殊精度要求可以做軟件校準(zhǔn)。最常見做法是兩點校準(zhǔn)用冰點和沸水確定斜率偏差然后調(diào)整換算公式。實際操作中我在代碼里增加兩個參數(shù)offset和gain。最終溫度 原始讀數(shù) × gain offset。通過冰水測得offset的初始值再通過沸水計算gain。#define TEMP_GAIN 1.000f #define TEMP_OFFSET 0.0f float temp_compensated max31856_read_temperature(); temp_compensated temp_compensated * TEMP_GAIN TEMP_OFFSET;例如冰水起始讀數(shù)為-0.2℃設(shè)置TEMP_OFFSET為0.2℃即可把0點拉回。隨后沸水讀數(shù)如果還有偏差微調(diào)TEMP_GAIN。這種線性校準(zhǔn)對全量程-200℃~1370℃并不完全嚴(yán)謹(jǐn)因為熱電偶非線性由芯片校正過了剩余誤差主要是傳感器本身非線性但兩點校準(zhǔn)對多數(shù)應(yīng)用足夠。5.3 溫漂到底怎么來的、怎么壓用了MAX31856之后“溫漂”不再像模擬方案那么明顯但依然可能存在主要來源有幾個供電電壓緩慢變化導(dǎo)致芯片內(nèi)部基準(zhǔn)微小變化。對策是穩(wěn)定供電或者用LDO代替直接開關(guān)電源。冷端補償本身的誤差隨環(huán)境溫度變化。對策是避免大面積銅層直接連接芯片底部GND引腳減少板內(nèi)溫差。接線端子接觸電阻變化尤其是熱電偶延長線材質(zhì)不對形成寄生熱電偶。對策是端子用同種金屬材質(zhì)避免鐵螺絲直接夾銅線。大批量貼片焊接時助焊劑殘留對微伏信號的腐蝕性影響。對策是清洗板面或者用三防漆保護(hù)。把這些問題處理完后我實測在室溫變化10℃時測量350℃恒溫源的偏差變化在±0.2℃以內(nèi)已經(jīng)屬于可以放心出貨的水平。5.4 常見問題速查表現(xiàn)象可能原因排查方案讀取溫度固定為0SPI接線SDO/SDI反了檢查接線用邏輯分析儀看時序讀數(shù)為-9999或巨大值溫度寄存器符號擴展錯誤檢查19位符號擴展邏輯溫度跳動超過±1℃電源紋波大、熱電偶線過長加強去耦用屏蔽線開啟50Hz濾波DRDY一直不拉低VCC欠壓或自動轉(zhuǎn)換未配置檢查供電重寫CR0開路故障一直觸發(fā)熱電偶插頭氧化或虛接重新插拔檢查端子壓接上電后MCU死機SPI時鐘頻率過高或電平?jīng)_突分頻降低SCLK確認(rèn)3.3V電平冷端溫度讀數(shù)為負(fù)幾百讀寫寄存器地址錯誤核對寄存器映射確認(rèn)與數(shù)據(jù)手冊一致數(shù)據(jù)總是穩(wěn)定偏高1℃~2℃冷端補償位置被加熱調(diào)整布局遠(yuǎn)離發(fā)熱源5.5 幾個實用的小技巧調(diào)試時可以在CS拉低后發(fā)送一個0x00字節(jié)觀察SDO是否回讀這樣可以快速判斷SPI鏈路是否通暢。如果系統(tǒng)里已經(jīng)有其他SPI設(shè)備建議MAX31856單獨用一個片選不要共用軟件片選流程否則頻繁拉高拉低會影響轉(zhuǎn)換結(jié)果讀取。溫度數(shù)據(jù)是2字節(jié)但同一時刻只應(yīng)讀取一致的一組數(shù)據(jù)。由于讀兩次寄存器之間芯片可能會更新數(shù)據(jù)嚴(yán)謹(jǐn)做法是先讀高字節(jié)再讀低字節(jié)同時判斷DRDY電平確保數(shù)據(jù)不跨轉(zhuǎn)換周期。批量生產(chǎn)時建議在產(chǎn)線治具上放一臺標(biāo)準(zhǔn)溫度源自動校準(zhǔn)每塊板的偏差把TEMP_GAIN和TEMP_OFFSET寫入每塊板的獨立Flash區(qū)域?qū)崿F(xiàn)差異化校準(zhǔn)。最后再分享一個小經(jīng)驗這類熱電偶測溫工程真正耗時間的不是接線和代碼而是搞清楚數(shù)據(jù)格式。MAX31856的數(shù)據(jù)手冊我至少翻了三遍每次都被那些帶符號位的左對齊寄存器弄昏頭。建議動手前先畫一張“寄存器字節(jié)分布圖”標(biāo)清楚哪幾位是符號位、哪幾位是數(shù)據(jù)位、分辨率是多少寫代碼時對著它來能少走很多彎路。整套方案實測下來從硬件到軟件都比較成熟穩(wěn)定以后再做類似的高溫測溫產(chǎn)品我還是會優(yōu)先選這套組合。