RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MAX31856熱電偶溫度變送器驅動設計與實現(xiàn)

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2023-05-14 15:38 ? 次閱讀

?在我們的產品中經(jīng)常有需要溫度檢測的地方,而熱電偶溫度檢測電路是我們常用的。熱電偶溫度檢測的方法很多,有時出于簡單方便的考慮我們會選擇熱偶溫度變送器來實現(xiàn),這一篇我們就來討論使用MAX31856熱電偶溫度變送器實現(xiàn)溫度的檢測。

1、功能概述

??MAX31856可以對任何類型熱電偶的信號進行冷端補償和數(shù)字轉換,輸出數(shù)據(jù)以攝氏度為單位。轉換器溫度分辨率達0.0078125°C,允許讀取最高+1800°C、最低-210°C?(取決于熱電偶類型)的溫度讀數(shù),熱電偶電壓測量精度達±0.15%。熱電偶輸入端提供±45V過壓保護。

??MAX31856內部的查找表(LUT)儲存不同類型熱電偶(K、J、N、R、S、T、E和B)的線性修正數(shù)據(jù)。而且MAX31856還具備50H和60Hz電網(wǎng)頻率濾波,也是熱電偶故障檢測頻率。SPI兼容接口允許選擇熱電偶類型并設置轉換和故障檢測過程。
熱電偶功能是檢測熱電偶線兩端的溫度差??稍跓犭娕嫉念~定工作溫度范圍內測量其檢測端(常稱為“熱”端),關于熱電偶測溫范圍:

??MAX31856將冷端溫度數(shù)據(jù)儲存在寄存器0Ah和0Bh。使能冷端溫度檢測時,這些寄存器為只讀,其中包含實測冷端溫度加冷端失調寄存器的數(shù)值。冷端溫度檢測使能時,讀取寄存器操作將DRDY引腳復位為高電平。應通過多字節(jié)傳輸讀取該寄存器的兩個字節(jié),以確保兩個字節(jié)的數(shù)據(jù)來自同一次溫度更新。禁止冷端溫度檢測時,這些寄存器為可讀/寫寄存器,其中包含最新的實測溫度值。如果需要,禁止內部冷端檢測時,可將來自外部溫度傳感器的數(shù)據(jù)寫入這些傳感器。最大冷端溫度鉗位在128°C,最小溫度鉗位在-64°C。

??由于所有熱電偶都具有非線性,必須對冷端補償后的原始值進行線性修正,并轉換為溫度值。為實現(xiàn)這一處理,利用LUT產生經(jīng)過線性化和冷端補償?shù)臏囟戎担幻看无D換后,將其作為19位數(shù)據(jù)儲存在線性化熱電偶溫度寄存器(0Ch、0Dh和0Eh)中。應通過多字節(jié)傳輸讀取全部三個字節(jié),以確保所有數(shù)據(jù)來自于同一次數(shù)據(jù)更新。關于線性化熱電偶溫度數(shù)據(jù)格式,

??與MAX31856的通信通過16個包含轉換、狀態(tài)和配置數(shù)據(jù)的8位寄存器實現(xiàn),全部設置均通過選擇相應寄存器單元的對應地址完成,寄存器存儲器映射所示為溫度、狀態(tài)和配置寄存器的地址。存取寄存器時,使用地址0Xh為讀操作,地址8Xh為寫操作。讀寫數(shù)據(jù)時,寄存器MSB在前。如果對只讀寄存器執(zhí)行寫操作,不改變該寄存器的值。?

2、驅動設計與實現(xiàn)

??我們了解了MAX31856熱偶溫度變送器的基本情況,接下來我們考慮如何實現(xiàn)MAX31856熱偶溫度變送器的驅動程序。

2.1、對象定義

??我們依然是基于對象的概念來實現(xiàn)驅動程序的設計。 所以我們首先來考慮對象類型的定義。
??作為一個對象至少包含有屬性和操作。 我們先來分析一下MAX31856熱偶溫度變送器對象的屬性有哪些。 MAX31856熱偶溫度變送器擁有16個寄存器,這些寄存器標識了MAX31856熱偶溫度變送器當前時刻所處的狀態(tài),所以我們將它們定義為屬性。 同時考慮到記錄當前時刻讀取的溫度轉換值和根據(jù)物理量程轉換的溫度值,所以我們將目標溫度及冷端溫度的ADC轉換值及物理量值作為MAX31856熱偶溫度變送器對象的屬性。
??接下來我們考慮一下MAX31856熱偶溫度變送器對象需要實現(xiàn)哪些操作。 我們只考慮與具體平臺依賴性較強的操作。 對于MAX31856熱偶溫度變送器對象,當其完成AD轉換回給出一個就緒指示,我們需要實時的檢測這個信號,并且這個過程依賴于具體的軟硬件平臺,所以我們將檢測過程設計為對象的操作。 我們使用MAX31856熱偶溫度變送器需要對其進行讀寫,這一過程也同樣依賴于具體的軟硬件平臺,所以我們也將其作為對象的操作。 另外MAX31856用一個片選信號,在實現(xiàn)總線操作時我們需要以此來選擇目標器件,所以我們也將其作為對象的操作。 根據(jù)前述對屬性和操作的分析,我們可以定義對象類型如下:

/*定義MAX31856對象類型*/
typedef struct Max31856Object {
    uint8_t regValue[16];
    uint32_t mDataCode;
    uint32_t rDataCode;
    float mTemperature;     //TC測量溫度
    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);     //片選信號
}Max31856ObjectType;

??我們已經(jīng)定義了對象類型,使用對象類型l可以聲明類型變量,但類型變量必須要初始化才能使用,所以我們還需要設計一個對象的初始化函數(shù)。 在這個初始化函數(shù)中,我們需要將對象變量以及具體應用相關的屬性及操作作為參數(shù)傳入,并對對象的各個屬性及操作函數(shù)指針賦初值。 具體實現(xiàn)如下;

/*初始化MAX31855對象*/
void Max31856Initialization(Max31856ObjectType *tc,         //MAX31856對象變量
                            Max31856Ready ready,            //就緒信號
                            Max31856ReadDataType read,      //讀MAX31856函數(shù)指針
                            Max31856WriteDataType write,    //寫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、對象操作

??我們定義了對象類型并實現(xiàn)了初始化函數(shù),接下來我們需要考慮要對MAX31856熱偶溫度變送器執(zhí)行整么樣的操作,畢竟得到數(shù)據(jù)才是我們的目的。 我們考慮到需要設置相應的寄存器以實現(xiàn)相應功能,同時也需要獲取寄存器的值以得到設備狀態(tài),或者從MAX31856熱偶溫度變送器獲取測量數(shù)據(jù)。
??我們先來看怎么讀取寄存器的值。 我們讀取寄存器的值用于判斷MAX31856當前的運行狀態(tài),前面我們已經(jīng)敘述過寄存器的地址及功能,而讀寄存器的時序要求如下:

??根據(jù)前面的描述及上述時序圖的要求可以編寫讀寄存器的函數(shù)如下:

/*讀寄存器操作*/
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);

}

??同樣我們寫寄存器時,我們根據(jù)前述寄存器的相關描述和寫寄存器的時序圖來實現(xiàn)。 寫寄存器的時序圖如下:

??根據(jù)上述描述我們可以實現(xiàn)寫寄存器值的函數(shù)如下:

/*寫寄存器操作*/
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的目的就是為了得到溫度測量數(shù)據(jù),所以我們來看看如何讀取溫度數(shù)據(jù)。 溫度轉換值可以一次讀取測量數(shù)據(jù)和冷端數(shù)據(jù),其時序圖如下:

??根據(jù)上述描述我們一次性讀取6個字節(jié)的數(shù)據(jù),具體實現(xiàn)如下:

/*獲取MAX31855測量數(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、驅動的使用

??我們已經(jīng)實現(xiàn)了MAX31856熱偶溫度變送器的驅動程序,這一節(jié)我們來使用該驅動程序實現(xiàn)一個簡單應用,以驗證驅動程序的正確性。

3.1、聲明并初始化對象

??首先我們需要使用前面定義的MAC31856熱偶溫度變送器對象類型聲明一個對象變量。 在我們的系統(tǒng)中,總線上掛載了4個MAX31856,所以我們聲明如下:

Max31856ObjectType tcObj[4];

??聲明的對象變量需要先初始化方可使用,而初始化函數(shù)有5個參數(shù)。 第一個參數(shù)是需要要初始化的對象變量的指針,而余下的4個參數(shù)則是平臺相關的操作函數(shù)指針。 這些函數(shù)的原型定義如下:

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);     //片選信號

??這幾個函數(shù)則是我們需要根據(jù)具體的軟硬件平臺來實現(xiàn)的。 由于是在同一總線上,所以讀寫函數(shù)只需統(tǒng)一定義就好,但偏選信號和就緒信號則需根據(jù)模塊單獨定義。 具體的函數(shù)實現(xiàn)如下:

/*溫度模塊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寫數(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ù)的定義后我們就可以初始化對象變量了! 將對象變量的指針以及這些函數(shù)的指針作為參數(shù)傳遞給初始化函數(shù),具體實現(xiàn)如下:

/*初始化MAX31856對象*/
    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
                               );

??至此我們就完成了對象變量的聲明及初始化,在后續(xù)操作中就可以使用對象變量對對應的MAX32856熱偶溫度變送器進行各種操作。

3.2、基于對象進行操作

??現(xiàn)在我們就可以在應用中使用驅動程序完成我們想要對MAX31856進行的操作了!在這個例子中我們分別讀取4個MAX31856對象去測量值,并對這個測量值進行濾波處理。

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);

??到這里我們就完成了整個測試程序的編寫,運行后能夠正確讀取溫度數(shù)據(jù),說明我們設計的驅動程序是正確的。

4、應用總結

??在這一篇中我們設計并實現(xiàn)了MAX31856熱偶溫度變送器的驅動程序,也編寫了測試應用來驗證這一驅動程序,測試的結果符合我們的預期。事實上,這一測試應用是從我們的實際項目中提取出來的,我們設計的MAX31856熱偶溫度變送器驅動程序在實際項目中運行也完全符合要求。
??在使用驅動程序時需要注意,在我們的應用中是一條SPI總線掛載了4個MAX31856模塊,所以需要偏選信號。如果在應用中MAX31856是硬件設定的偏選信號,則可以在初始化時使用NULL或者空函數(shù)替代。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 熱電偶
    +關注

    關注

    5

    文章

    939

    瀏覽量

    75555
  • 信號
    +關注

    關注

    11

    文章

    2789

    瀏覽量

    76730
  • 驅動設計
    +關注

    關注

    1

    文章

    111

    瀏覽量

    15285
  • 溫度變送器
    +關注

    關注

    0

    文章

    114

    瀏覽量

    15122
收藏 人收藏

    評論

    相關推薦

    MAX31855熱電偶溫度變送器驅動設計與實現(xiàn)

    一些時候,我們需要通過熱電偶獲取溫度數(shù)據(jù)。在這里我們將討論如何實現(xiàn)并使用MAX31855熱電偶溫度
    的頭像 發(fā)表于 12-07 15:42 ?5068次閱讀
    <b class='flag-5'>MAX</b>31855<b class='flag-5'>熱電偶</b><b class='flag-5'>溫度</b><b class='flag-5'>變送器</b>的<b class='flag-5'>驅動</b>設計與<b class='flag-5'>實現(xiàn)</b>

    MAX31856溫度正負相反是什么原因造成的?

    MAX31856用 官方樣例 在室溫是 20℃ 環(huán)境下 測的 冷端 溫度 為 -20.3125熱電偶TC溫度-38.515625 ltcbh 查看是0xFD,為什么
    發(fā)表于 03-06 07:18

    使用Max31856時總會出現(xiàn)ovuv故障怎么解決?

    我在使用Max31856時總會出現(xiàn)ovuv故障,我設置的是B型熱電偶采集信號,我看資料說明只有在超出±45V時才會出現(xiàn)此故障,還有其他條件會出現(xiàn)嗎?我的電路板供電最高才5v。
    發(fā)表于 12-19 08:59

    max31856

    請問有人用過max31856這個芯片嗎?我用stm32驅動不了,有驅動程序的麻煩發(fā)過來用一下,謝謝!
    發(fā)表于 06-12 13:33

    MAX31856在T型熱電偶拔掉的時候會出現(xiàn)-199℃這個值是為什么?

    在使用MAX31856進行測溫的過程中,拔掉T型熱電偶,總會讀到-199℃這個值。
    發(fā)表于 11-30 06:17

    熱電偶溫度變送器

    熱電偶溫度變送器
    的頭像 發(fā)表于 02-19 22:13 ?2988次閱讀
    <b class='flag-5'>熱電偶</b><b class='flag-5'>溫度</b><b class='flag-5'>變送器</b>

    熱電偶溫度變送器電路

    熱電偶溫度變送器電路
    發(fā)表于 02-23 22:01 ?1162次閱讀
    <b class='flag-5'>熱電偶</b><b class='flag-5'>溫度</b><b class='flag-5'>變送器</b>電路

    J型熱電偶溫度變送器電路

    J型熱電偶溫度變送器電路
    發(fā)表于 04-27 22:02 ?915次閱讀
    J型<b class='flag-5'>熱電偶</b><b class='flag-5'>溫度</b><b class='flag-5'>變送器</b>電路

    熱電偶溫度變送器電路

    熱電偶溫度變送器電路
    發(fā)表于 04-30 21:45 ?881次閱讀
    <b class='flag-5'>熱電偶</b><b class='flag-5'>溫度</b><b class='flag-5'>變送器</b>電路

    溫度變送器(防爆)熱電偶/熱電阻型號命名方法

    溫度變送器(防爆)熱電偶/熱電阻型號命名方法:
    發(fā)表于 12-11 10:47 ?1212次閱讀

    熱電偶測溫的相關知識及使用MAX31856時將會遇到哪些問題

    本期視頻可以了解到關于熱電偶測溫的知識,以及在使用MAX31856時可能會遇到的問題。
    的頭像 發(fā)表于 10-12 03:06 ?1w次閱讀

    的工作原理及通過MAX31856測量熱電偶溫度

    熱電偶能夠在極寬的溫度范圍內測量溫度。本視頻中,Mohamed介紹熱電偶的工作原理,并演示使用MAX31856通過
    的頭像 發(fā)表于 10-10 10:30 ?1.6w次閱讀

    熱電偶溫度變送器工作原理

    熱電偶溫度變送器要求變送器的輸出電壓信號與相應的變送器輸入的溫度信號成線性關系。但一般
    發(fā)表于 09-25 15:55 ?1.7w次閱讀
    <b class='flag-5'>熱電偶</b><b class='flag-5'>溫度</b><b class='flag-5'>變送器</b>工作原理

    K型熱電偶溫度信號隔離變送器

    捷晟達科技的JSD TTC-1001系列為一進一出熱電偶溫度信號隔離變送器,該產品是用熱電偶傳感器測量溫度的隔離
    發(fā)表于 09-16 02:04 ?1次下載

    二進二出熱電偶溫度信號隔離變送器

    熱電偶溫度信號隔離變送器捷晟達科技的JSD TTC-2002系列為二進二出熱電偶溫度信號隔離變送器
    發(fā)表于 09-16 02:25 ?0次下載
    RM新时代网站-首页