技術(shù)參數(shù)
供電電源:24VDC±10%
輸入信號(hào):取自內(nèi)置振動(dòng)速度傳感器的信號(hào)
靈 敏 度:20mv/mm/s±5%
頻率響應(yīng):10 ~1000 Hz或者5~1000 Hz(特殊說(shuō)明)
量 程:0-20mm/s(真有效值)
0-200um(峰-峰值)
測(cè)量誤差:±1%滿量程
輸出電流:4~20mA
輸出阻抗:≤500Ω
溫度范圍:運(yùn)行時(shí):-25℃~+65℃
儲(chǔ)存時(shí):-40℃~85℃
相對(duì)濕度:至95%,不冷凝
外形尺寸:φ33×75mm
重 量:約340g
訂貨代號(hào)
XJ-9200A□□(可選)-□□(V/D)- A□□- B□□-C□□
選型說(shuō)明
可選:防水接頭□:F-防水接頭
凱裝出線□:B-凱裝管
必選:選型說(shuō)明
量程范圍□□:
振動(dòng)速度量 10V-0~10mm/s; 20V*-0~20mm/s; 30V-0~30mm/s;……
振動(dòng)位移量 100D-0~100μm;100D-0~200μm; 300D-0~300μm;……
安裝方向A□:
1-水平;2-垂直;3*-通用
安裝螺紋B□:
1*-M10×1.5;2-M8×1.25; 3-磁座;4-特殊定做
電纜長(zhǎng)度C□:
1-1m;2*-2m;3-3m;……
無(wú)特殊情況,廠家按項(xiàng)生產(chǎn);如有特殊要求,請(qǐng)與我公司協(xié)商
選型舉例:XJ-9200A-20V-A3-B1-C2
風(fēng)機(jī)振動(dòng)測(cè)量用元件HD-YD-113
在我們的產(chǎn)品中經(jīng)常有需要溫度檢測(cè)的地方,而熱電偶溫度檢測(cè)電路是我們常用的。熱電偶溫度檢測(cè)的方法很多,有時(shí)出于簡(jiǎn)單方便的考慮我們會(huì)選擇熱偶溫度變送器來(lái)實(shí)現(xiàn),這一篇我們就來(lái)討論使用MAX31856熱電偶溫度變送器實(shí)現(xiàn)溫度的檢測(cè)。
1、功能概述
MAX31856可以對(duì)任何類(lèi)型熱電偶的信號(hào)進(jìn)行冷端補(bǔ)償和數(shù)字轉(zhuǎn)換,輸出數(shù)據(jù)以攝氏度為單位。轉(zhuǎn)換器溫度分辨率達(dá)0.0078125°C,允許讀取+1800°C、-210°C(取決于熱電偶類(lèi)型)的溫度讀數(shù),熱電偶電壓測(cè)量精度達(dá)±0.15%。熱電偶輸入端提供±45V過(guò)壓保護(hù)。
MAX31856內(nèi)部的查找表(LUT)儲(chǔ)存不同類(lèi)型熱電偶(K、J、N、R、S、T、E和B)的線性修正數(shù)據(jù)。而且MAX31856還具備50H和60Hz電網(wǎng)頻率濾波,也是熱電偶故障檢測(cè)頻率。SPI兼容接口允許選擇熱電偶類(lèi)型并設(shè)置轉(zhuǎn)換和故障檢測(cè)過(guò)程。
熱電偶功能是檢測(cè)熱電偶線兩端的溫度差。可在熱電偶的額定工作溫度范圍內(nèi)測(cè)量其檢測(cè)端(常稱(chēng)為“熱”端),關(guān)于熱電偶測(cè)溫范圍:
MAX31856將冷端溫度數(shù)據(jù)儲(chǔ)存在寄存器0Ah和0Bh。使能冷端溫度檢測(cè)時(shí),這些寄存器為只讀,其中包含實(shí)測(cè)冷端溫度加冷端失調(diào)寄存器的數(shù)值。冷端溫度檢測(cè)使能時(shí),讀取寄存器操作將DRDY引腳復(fù)位為高電平。應(yīng)通過(guò)多字節(jié)傳輸讀取該寄存器的兩個(gè)字節(jié),以確保兩個(gè)字節(jié)的數(shù)據(jù)來(lái)自同一次溫度更新。禁止冷端溫度檢測(cè)時(shí),這些寄存器為可讀/寫(xiě)寄存器,其中包含的實(shí)測(cè)溫度值。如果需要,禁止內(nèi)部冷端檢測(cè)時(shí),可將來(lái)自外部溫度傳感器的數(shù)據(jù)寫(xiě)入這些傳感器。冷端溫度鉗位在128°C,小溫度鉗位在-64°C。
由于所有熱電偶都具有非線性,必須對(duì)冷端補(bǔ)償后的原始值進(jìn)行線性修正,并轉(zhuǎn)換為溫度值。為實(shí)現(xiàn)這一處理,利用LUT產(chǎn)生經(jīng)過(guò)線性化和冷端補(bǔ)償?shù)臏囟戎?;每次轉(zhuǎn)換后,將其作為19位數(shù)據(jù)儲(chǔ)存在線性化熱電偶溫度寄存器(0Ch、0Dh和0Eh)中。應(yīng)通過(guò)多字節(jié)傳輸讀取全部三個(gè)字節(jié),以確保所有數(shù)據(jù)來(lái)自于同一次數(shù)據(jù)更新。關(guān)于線性化熱電偶溫度數(shù)據(jù)格式,
與MAX31856的通信通過(guò)16個(gè)包含轉(zhuǎn)換、狀態(tài)和配置數(shù)據(jù)的8位寄存器實(shí)現(xiàn),全部設(shè)置均通過(guò)選擇相應(yīng)寄存器單元的對(duì)應(yīng)地址完成,寄存器存儲(chǔ)器映射所示為溫度、狀態(tài)和配置寄存器的地址。存取寄存器時(shí),使用地址0Xh為讀操作,地址8Xh為寫(xiě)操作。讀寫(xiě)數(shù)據(jù)時(shí),寄存器MSB在前。如果對(duì)只讀寄存器執(zhí)行寫(xiě)操作,不改變?cè)摷拇嫫鞯闹怠?/p>
2、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
我們了解了MAX31856熱偶溫度變送器的基本情況,接下來(lái)我們考慮如何實(shí)現(xiàn)MAX31856熱偶溫度變送器的驅(qū)動(dòng)程序。
2.1、對(duì)象定義
我們依然是基于對(duì)象的概念來(lái)實(shí)現(xiàn)驅(qū)動(dòng)程序的設(shè)計(jì)。 所以我們首先來(lái)考慮對(duì)象類(lèi)型的定義。
作為一個(gè)對(duì)象至少包含有屬性和操作。 我們先來(lái)分析一下MAX31856熱偶溫度變送器對(duì)象的屬性有哪些。 MAX31856熱偶溫度變送器擁有16個(gè)寄存器,這些寄存器標(biāo)識(shí)了MAX31856熱偶溫度變送器當(dāng)前時(shí)刻所處的狀態(tài),所以我們將它們定義為屬性。 同時(shí)考慮到記錄當(dāng)前時(shí)刻讀取的溫度轉(zhuǎn)換值和根據(jù)物理量程轉(zhuǎn)換的溫度值,所以我們將目標(biāo)溫度及冷端溫度的ADC轉(zhuǎn)換值及物理量值作為MAX31856熱偶溫度變送器對(duì)象的屬性。
接下來(lái)我們考慮一下MAX31856熱偶溫度變送器對(duì)象需要實(shí)現(xiàn)哪些操作。 我們只考慮與具體平臺(tái)依賴性較強(qiáng)的操作。 對(duì)于MAX31856熱偶溫度變送器對(duì)象,當(dāng)其完成AD轉(zhuǎn)換回給出一個(gè)就緒指示,我們需要實(shí)時(shí)的檢測(cè)這個(gè)信號(hào),并且這個(gè)過(guò)程依賴于具體的軟硬件平臺(tái),所以我們將檢測(cè)過(guò)程設(shè)計(jì)為對(duì)象的操作。 我們使用MAX31856熱偶溫度變送器需要對(duì)其進(jìn)行讀寫(xiě),這一過(guò)程也同樣依賴于具體的軟硬件平臺(tái),所以我們也將其作為對(duì)象的操作。 另外MAX31856用一個(gè)片選信號(hào),在實(shí)現(xiàn)總線操作時(shí)我們需要以此來(lái)選擇目標(biāo)器件,所以我們也將其作為對(duì)象的操作。 根據(jù)前述對(duì)屬性和操作的分析,我們可以定義對(duì)象類(lèi)型如下:
復(fù)制/*定義MAX31856對(duì)象類(lèi)型*/typedef struct Max31856Object { uint8_t regValue[16]; uint32_t mDataCode; uint32_t rDataCode; float mTemperature; //TC測(cè)量溫度 float rTemperature; //冷端溫度 uint8_t (*Ready)(void); void (*ReadData)(uint8_t *rData,uint16_t rSize); void (*WriteData)(uint8_t *wData,uint16_t wSize); void (*ChipSelcet)(Max31856CSType cs); //片選信號(hào)}Max31856ObjectType;
我們已經(jīng)定義了對(duì)象類(lèi)型,使用對(duì)象類(lèi)型l可以聲明類(lèi)型變量,但類(lèi)型變量必須要初始化才能使用,所以我們還需要設(shè)計(jì)一個(gè)對(duì)象的初始化函數(shù)。 在這個(gè)初始化函數(shù)中,我們需要將對(duì)象變量以及具體應(yīng)用相關(guān)的屬性及操作作為參數(shù)傳入,并對(duì)對(duì)象的各個(gè)屬性及操作函數(shù)指針賦初值。 具體實(shí)現(xiàn)如下;
復(fù)制/*初始化MAX31855對(duì)象*/void Max31856Initialization(Max31856ObjectType *tc, //MAX31856對(duì)象變量 Max31856Ready ready, //就緒信號(hào) Max31856ReadDataType read, //讀MAX31856函數(shù)指針 Max31856WriteDataType write, //寫(xiě)MAX31856函數(shù)指針 Max31856ChipSelcetType cs //片選操作函數(shù)指針 ){ uint8_t regValue=0; uint8_t rData[16]={0}; if((tc==NULL)||(ready==NULL)||(read==NULL)||(write==NULL)) { return; } tc->Ready=ready; tc->ReadData=read; tc->WriteData=write; if(cs!=NULL) { tc->ChipSelcet=cs; } else { tc->ChipSelcet=DefaultChipSelect; } tc->mDataCode=0; tc->rDataCode=0; tc->mTemperature=0.0; tc->rTemperature=0.0; tc->ChipSelcet(Max31856CS_Disable); regValue=0x81; WriteRegister(tc,REG_CR0,regValue); ReadRegister(tc,REG_CR0,rData,16); for(int i=0;i<16;i++) { tc->regValue[i]=rData[i]; }}
2.2、對(duì)象操作
我們定義了對(duì)象類(lèi)型并實(shí)現(xiàn)了初始化函數(shù),接下來(lái)我們需要考慮要對(duì)MAX31856熱偶溫度變送器執(zhí)行整么樣的操作,畢竟得到數(shù)據(jù)才是我們的目的。 我們考慮到需要設(shè)置相應(yīng)的寄存器以實(shí)現(xiàn)相應(yīng)功能,同時(shí)也需要獲取寄存器的值以得到設(shè)備狀態(tài),或者從MAX31856熱偶溫度變送器獲取測(cè)量數(shù)據(jù)。
我們先來(lái)看怎么讀取寄存器的值。 我們讀取寄存器的值用于判斷MAX31856當(dāng)前的運(yùn)行狀態(tài),前面我們已經(jīng)敘述過(guò)寄存器的地址及功能,而讀寄存器的時(shí)序要求如下:
根據(jù)前面的描述及上述時(shí)序圖的要求可以編寫(xiě)讀寄存器的函數(shù)如下:
復(fù)制/*讀寄存器操作*/static void ReadRegister(Max31856ObjectType *tc,uint8_t regAddr,uint8_t *rData,uint8_t rSize){ uint8_t wData=regAddr; if(rSize<1) { return; } tc->ChipSelcet(Max31856CS_Enable); tc->WriteData(&wData,1); tc->ReadData(rData,rSize); tc->ChipSelcet(Max31856CS_Disable);}
同樣我們寫(xiě)寄存器時(shí),我們根據(jù)前述寄存器的相關(guān)描述和寫(xiě)寄存器的時(shí)序圖來(lái)實(shí)現(xiàn)。 寫(xiě)寄存器的時(shí)序圖如下:
根據(jù)上述描述我們可以實(shí)現(xiàn)寫(xiě)寄存器值的函數(shù)如下:
復(fù)制/*寫(xiě)寄存器操作*/static void WriteRegister(Max31856ObjectType *tc,uint8_t regAddr,uint8_t value){ uint8_t wData[2]; if(regAddr>11) { return; } wData[0]=regAddr+0x80; wData[1]=value; tc->ChipSelcet(Max31856CS_Enable); tc->WriteData(wData,2); tc->ChipSelcet(Max31856CS_Disable);}
我們使用MAX31856的目的就是為了得到溫度測(cè)量數(shù)據(jù),所以我們來(lái)看看如何讀取溫度數(shù)據(jù)。 溫度轉(zhuǎn)換值可以一次讀取測(cè)量數(shù)據(jù)和冷端數(shù)據(jù),其時(shí)序圖如下:
根據(jù)上述描述我們一次性讀取6個(gè)字節(jié)的數(shù)據(jù),具體實(shí)現(xiàn)如下:
復(fù)制/*獲取MAX31855測(cè)量數(shù)據(jù)*/void Max31856GetDatas(Max31856ObjectType *tc){ uint8_t rData[6]={0}; if(tc->Ready()) { if((tc->regValue[REG_CR0]&0x80) != 0x80) { WriteRegister(tc,REG_CR0,0x81); ReadRegister(tc,REG_CR0,rData,1); tc->regValue[REG_CR0]=rData[0]; } return; } ReadRegister(tc,REG_CJTH,rData,6); tc->rDataCode=(rData[0]<<8)+rData[1]; tc->mDataCode=(rData[2]<<16)+(rData[3]<<8)+rData[4]; tc->regValue[REG_SR]=rData[5]; tc->mTemperature=CalcMeasureTemperature(tc->mDataCode); tc->rTemperature=CalcColdEndTemperature(tc->rDataCode);}
3、驅(qū)動(dòng)的使用
我們已經(jīng)實(shí)現(xiàn)了MAX31856熱偶溫度變送器的驅(qū)動(dòng)程序,這一節(jié)我們來(lái)使用該驅(qū)動(dòng)程序?qū)崿F(xiàn)一個(gè)簡(jiǎn)單應(yīng)用,以驗(yàn)證驅(qū)動(dòng)程序的正確性。
3.1、聲明并初始化對(duì)象
首先我們需要使用前面定義的MAC31856熱偶溫度變送器對(duì)象類(lèi)型聲明一個(gè)對(duì)象變量。 在我們的系統(tǒng)中,總線上掛載了4個(gè)MAX31856,所以我們聲明如下:
復(fù)制Max31856ObjectType tcObj[4];
聲明的對(duì)象變量需要先初始化方可使用,而初始化函數(shù)有5個(gè)參數(shù)。 個(gè)參數(shù)是需要要初始化的對(duì)象變量的指針,而余下的4個(gè)參數(shù)則是平臺(tái)相關(guān)的操作函數(shù)指針。 這些函數(shù)的原型定義如下:
復(fù)制typedef uint8_t (*Max31856Ready)(void);typedef void (*Max31856ReadDataType)(uint8_t *rData,uint16_t rSize);typedef void (*Max31856WriteDataType)(uint8_t *wData,uint16_t wSize);typedef void (*Max31856ChipSelcetType)(Max31856CSType cs); //片選信號(hào)
這幾個(gè)函數(shù)則是我們需要根據(jù)具體的軟硬件平臺(tái)來(lái)實(shí)現(xiàn)的。 由于是在同一總線上,所以讀寫(xiě)函數(shù)只需統(tǒng)一定義就好,但偏選信號(hào)和就緒信號(hào)則需根據(jù)模塊單獨(dú)定義。 具體的函數(shù)實(shí)現(xiàn)如下:
復(fù)制/*溫度模塊1就緒操作函數(shù)*/static uint8_t Tc1Ready(void){ uint8_t result=1; result=HAL_GPIO_ReadPin(TC1_RDY_GPIO_Port,TC1_RDY_Pin); return result;}/*溫度模塊2就緒操作函數(shù)*/static uint8_t Tc2Ready(void){ uint8_t result=1; result=HAL_GPIO_ReadPin(TC2_RDY_GPIO_Port,TC2_RDY_Pin); return result;}/*溫度模塊3就緒操作函數(shù)*/static uint8_t Tc3Ready(void){ uint8_t result=1; result=HAL_GPIO_ReadPin(TC3_RDY_GPIO_Port,TC3_RDY_Pin); return result;}/*溫度模塊4就緒操作函數(shù)*/static uint8_t Tc4Ready(void){ uint8_t result=1; result=HAL_GPIO_ReadPin(TC4_RDY_GPIO_Port,TC4_RDY_Pin); return result;}/*SPI1寫(xiě)數(shù)據(jù)操作*/static void WriteData(uint8_t *wData,uint16_t wSize){ HAL_SPI_Transmit(&hspi1, wData, wSize, 1000);}/*溫度模塊1片選操作函數(shù)*/static void Tc1ChipSelcet(Max31856CSType cs){ if(Max31856CS_Enable == cs) { HAL_GPIO_WritePin(TC1_CS_GPIO_Port, TC1_CS_Pin, GPIO_PIN_RESET); return; } HAL_GPIO_WritePin(TC1_CS_GPIO_Port, TC1_CS_Pin, GPIO_PIN_SET);}/*溫度模塊2片選操作函數(shù)*/static void Tc2ChipSelcet(Max31856CSType cs){ if(Max31856CS_Enable == cs) { HAL_GPIO_WritePin(TC2_CS_GPIO_Port, TC2_CS_Pin, GPIO_PIN_RESET); return; } HAL_GPIO_WritePin(TC2_CS_GPIO_Port, TC2_CS_Pin, GPIO_PIN_SET);}/*溫度模塊3片選操作函數(shù)*/static void Tc3ChipSelcet(Max31856CSType cs){ if(Max31856CS_Enable == cs) { HAL_GPIO_WritePin(TC3_CS_GPIO_Port, TC3_CS_Pin, GPIO_PIN_RESET); return; } HAL_GPIO_WritePin(TC3_CS_GPIO_Port, TC3_CS_Pin, GPIO_PIN_SET);}/*溫度模塊4片選操作函數(shù)*/static void Tc4ChipSelcet(Max31856CSType cs){ if(Max31856CS_Enable == cs) { HAL_GPIO_WritePin(TC4_CS_GPIO_Port, TC4_CS_Pin, GPIO_PIN_RESET); return; } HAL_GPIO_WritePin(TC4_CS_GPIO_Port, TC4_CS_Pin, GPIO_PIN_SET);}
完成這些函數(shù)的定義后我們就可以初始化對(duì)象變量了! 將對(duì)象變量的指針以及這些函數(shù)的指針作為參數(shù)傳遞給初始化函數(shù),具體實(shí)現(xiàn)如下:
復(fù)制/*初始化MAX31856對(duì)象*/ Max31856Initialization(&tcObj[3], Tc4Ready, ReadData, WriteData, Tc4ChipSelcet ); Max31856Initialization(&tcObj[0], Tc1Ready, ReadData, WriteData, Tc1ChipSelcet ); Max31856Initialization(&tcObj[1], Tc2Ready, ReadData, WriteData, Tc2ChipSelcet ); Max31856Initialization(&tcObj[2], Tc3Ready, ReadData, WriteData, Tc3ChipSelcet );
至此我們就完成了對(duì)象變量的聲明及初始化,在后續(xù)操作中就可以使用對(duì)象變量對(duì)對(duì)應(yīng)的MAX32856熱偶溫度變送器進(jìn)行各種操作。
3.2、基于對(duì)象進(jìn)行操作
現(xiàn)在我們就可以在應(yīng)用中使用驅(qū)動(dòng)程序完成我們想要對(duì)MAX31856進(jìn)行的操作了!在這個(gè)例子中我們分別讀取4個(gè)MAX31856對(duì)象去測(cè)量值,并對(duì)這個(gè)測(cè)量值進(jìn)行濾波處理。
復(fù)制Max31856GetDatas(&tcObj[0]); tFilter[0].newValue=tcObj[0].mTemperature; if(tcObj[0].mTemperature<0.0) { kF[0]=1.125; } aPara.phyPara.tc1Temp=Power3Polyfit(BandSmoothingFilter(&tFilter[0]),0.0,0.0,kF[0],0.0); Max31856GetDatas(&tcObj[1]); tFilter[1].newValue=tcObj[1].mTemperature; if(tcObj[1].mTemperature<0.0) { kF[1]=1.126; } aPara.phyPara.tc2Temp=Power3Polyfit(BandSmoothingFilter(&tFilter[1]),0.0,0.0,kF[1],0.0); Max31856GetDatas(&tcObj[2]); tFilter[2].newValue=tcObj[2].mTemperature; if(tcObj[2].mTemperature<0.0) { kF[2]=1.125; } aPara.phyPara.tc3Temp=Power3Polyfit(BandSmoothingFilter(&tFilter[2]),0.0,0.0,kF[2],0.0); Max31856GetDatas(&tcObj[3]); tFilter[3].newValue=tcObj[3].mTemperature; if(tcObj[3].mTemperature<0.0) { kF[3]=1.125; } aPara.phyPara.tc4Temp=Power3Polyfit(BandSmoothingFilter(&tFilter[3]),0.0,0.0,kF[3],0.0);
到這里我們就完成了整個(gè)測(cè)試程序的編寫(xiě),運(yùn)行后能夠正確讀取溫度數(shù)據(jù),說(shuō)明我們?cè)O(shè)計(jì)的驅(qū)動(dòng)程序是正確的。
4、應(yīng)用總結(jié)
在這一篇中我們?cè)O(shè)計(jì)并實(shí)現(xiàn)了MAX31856熱偶溫度變送器的驅(qū)動(dòng)程序,也編寫(xiě)了測(cè)試應(yīng)用來(lái)驗(yàn)證這一驅(qū)動(dòng)程序,測(cè)試的結(jié)果符合我們的預(yù)期。事實(shí)上,這一測(cè)試應(yīng)用是從我們的實(shí)際項(xiàng)目中提取出來(lái)的,我們?cè)O(shè)計(jì)的MAX31856熱偶溫度變送器驅(qū)動(dòng)程序在實(shí)際項(xiàng)目中運(yùn)行也符合要求。
在使用驅(qū)動(dòng)程序時(shí)需要注意,在我們的應(yīng)用中是一條SPI總線掛載了4個(gè)MAX31856模塊,所以需要偏選信號(hào)。如果在應(yīng)用中MAX31856是硬件設(shè)定的偏選信號(hào),則可以在初始化時(shí)使用NULL或者空函數(shù)替代。