1. 程式人生 > 其它 >外設驅動庫開發筆記38:RTD熱電阻測溫驅動

外設驅動庫開發筆記38:RTD熱電阻測溫驅動

  我們已經討論過多種溫度檢測方式,但我們尚未關注熱電阻溫度檢測,但熱電阻測溫在工業環境中是非常常見的。儘管有很多整合的數字式的熱電阻介面元器件,但這些器件不但成本較高,靈活性也大打折扣。所以我們有時會使用更簡單靈活的電路來驅動RTD。而在這一篇中,我們將討論如何設計並實現RTD熱電阻測溫的驅動。

1、功能概述

  RTD熱電阻是常用的測溫元件。RTD的英文全稱為“Resistance Temperature Detector”,因此準確來說,它應該翻譯為“電阻溫度檢測器”。RTD是一種特殊的電阻,其阻值會隨著溫度的升高而變大,隨著溫度的降低而減小。工業上利用它的這一特性進行溫度測量,因此RTD也被俗稱為“熱電阻”。

  並不是所有的金屬都適合做成RTD,符合這一特性的材料需要滿足如下幾個要求:

  • 該金屬的電阻值與溫度變化能呈線性關係;

  • 該金屬對溫度的變化比較敏感,即單位溫度變化引起的阻值變化(溫度係數)比較大;

  • 該金屬能夠抵抗溫度變化造成的疲勞,具有好的耐久性;

  符合該要求的金屬並不多,常見的RTD材料有:鉑(Pt)、鎳(Ni)和銅(Cu)。對應的國家統一生產工業標準化熱電阻有三種:WZP型鉑電阻、WZC型銅熱電阻和WZN型鎳熱電阻。

1.1、鉑熱電阻

  鉑電阻是我們常用的RTD,鉑熱電阻採用溫度係數為3.885x10-3的元件,溫度和電阻的關係表示式:

  在-200℃~0℃為:

  在0℃~850℃為:

  其中:Rt溫度為t℃時的電阻;R0是溫度為0℃時的電阻。而各個係數均為常數:

  常數A=3.9083×10-3

  常數B=-5.775×10-7

  常數C=-4.183×10-12

  鉑熱電阻對應的測溫範圍是:-200℃~850℃。常見的型號Pt50、Pt100、Pt200、Pt500和Pt1000等。名稱中的數值表示熱電阻在0℃下的標稱電阻值。

1.2、銅熱電阻

  銅熱電阻也是在工業上常用的RTD,銅熱電阻採用溫度係數為:4.28x10-3的元件。溫度和電阻的關係表示式:

  其中,Rt是溫度為t℃時的電阻,R0是溫度為0℃時電阻,而各個係數長數的取值為:

  常數α=4.28x10-3

  常數β=-9.31x10-8

  常數γ=1.23x10-9

  銅熱電阻對應的測溫範圍是:-50℃~150℃。而常見的分型別號有:Cu50、Cu100等。名稱中的數值表示熱電阻在0℃下的標稱電阻值。

1.3、鎳熱電阻

  另一種工業標準RTD則是鎳熱電阻。鎳熱電阻採用溫度係數為6.17x10-3的元件。溫度和電阻的關係表示式:

  其中,Rt是溫度為t℃時的電阻,R0是溫度為0℃時電阻,而各個係數長數的取值為:

  常數A=5.485x10-3

  常數B=6.65x10-6

  常數C=2.805x10-11

  鎳電阻對應的測溫範圍是:-60℃~180℃。而常見的分型別號有:Ni100、Ni300、Ni500等。名稱中的數值表示熱電阻在0℃下的標稱電阻值。

2、驅動設計與實現

  我們已經瞭解了RTD的特性,以及不同材質的RTD溫度與點組的關係表示式。接下來我們就實現通過RTD檢測溫度的驅動。

2.1、物件定義

  在實現RTD的驅動之前,我們依然需要抽象並定義RTD物件,並將其宣告為物件型別。

2.1.1、物件的抽象

  在實現對RTD的操作之前,我們先抽象RTD物件。每一個RTD物件都有幾個共同的屬性:標稱電阻,溫度和型別。型別就是前面所描述的三種,我們將其定義為列舉。物件的宣告如下:

/* 定義RTD型別列舉 */
typedef enum RTDCategory {
     WZP,
     WZC,
     WZN
}RTDCategoryType;
 
/* 定義RTD物件 */
typedef struct RTDObject{
     float nominalR;     //RTD標稱電阻
     float temperature;       //所測溫度
     RTDCategoryType type; //RTD型別
}RTDObjectType;

2.1.2、物件的初始化

  宣告一個RTD物件後,僅僅只是聲明瞭一個物件變數,在賦值之前尚不能使用。所以我們要使用初始化函式將其初始化之後才可使用。RTD物件的初始化函式如下:

/* 初始化RTD物件 */
void RTDInitialization(RTDObjectType *rtd,RTDCategoryType type,float nr)
{
     if(rtd==NULL)
     {
        return;
     }
     
     rtd->type=type;
     rtd->nominalR=nr;
}

2.2、物件操作

  前面我們已經提到了各類熱電阻的電阻與溫度的關係表示式。在這些表示式中,二次以上的項的係數其實是非常小的,所以在一般要求不高,溫度變化不是很大的場合基本就是線性關係。所以我們將其簡化為線性方程:

2.2.1、WZP鉑電阻

  鉑電阻的溫度與電阻的關係在0度以上和0度以下略有差別,但如果我們採用線性近似的話則是一樣的。所以我們採用線性方程實現如下:

/* 計算鉑電阻溫度 */
static float CalcWzpTemperature(RTDObjectType *rtd,float rt)
{
 float temp=0.0;
 float a=0.0039083;
     
 temp=((rt/rtd->nominalR)-1.0)/a;
 rtd->temperature=temp;
     
 return temp;
}

2.2.2、WZC銅電阻

  銅電阻的溫度與電阻的關係表示式相對複雜,但好在高次項的影響相對較小,我們依然可以使用線性近似來實現它。

/* 計算銅電阻溫度 */
static float CalcWzcTemperature(RTDObjectType *rtd,float rt)
{
 float temp=0.0;
 float alpha=0.00428;
     
 temp=((rt/rtd->nominalR)-1.0)/alpha;
 rtd->temperature=temp;
     
 return temp;
}

2.2.3、WZN鎳電阻

  鎳電阻的電阻溫度係數比鉑電阻和銅電阻都要好,但其線性度則不如鉑電阻,同樣的是其高次項的影響也相對較小,在溫度並不大範圍變化時仍然可以採取線性近似。

/* 計算鎳電阻溫度 */
static float CalcWznTemperature(RTDObjectType *rtd,float rt)
{
 float temp=0.0;
 float a=0.005485;
     
 temp=((rt/rtd->nominalR)-1.0)/a;
 rtd->temperature=temp;
     
 return temp;
}

2.2.4、統一溫度獲取

  面向不同型別的RTD,我們實現了各自的溫度轉換函式,但作為驅動函式庫,我們總是希望能進行無差別呼叫。所以我們希望設計一個統一的介面函式。所幸每種型別RTD操作函式均有相同的格式,於是我們就很容易想到使用函式指標來處理它。

float (*CalcTemperature[])(RTDObjectType *rtd,float rt)={CalcWzpTemperature,CalcWzcTemperature,CalcWznTemperature};

/*計算熱電阻測得的溫度*/
float CalcRTDTemperature(RTDObjectType *rtd,float rt)
{
     float temp=0.0;
 
     temp=CalcTemperature[rtd->type](rtd,rt);
 
     return temp;
}

3、驅動的使用

  我們採用RTD測溫時可以使用這一驅動。其實用步驟分兩步:宣告並初始化物件;呼叫函式計算溫度值。接下來我們就來實現之。

3.1、宣告並初始化物件

  首先使用RTDObjectType型別定義RTD物件,如果有多個可以使用陣列方式定義。RTDObjectType rtd;或RTDObjectType rtd[N];的形式。其中N為數量。

  定義物件變數後和以呼叫初始化函式對齊進行初始化:

  RTDInitialization(&rtd,type,nr);

  其中type為RTDCategoryType列舉型別,可以是鉑熱電阻(WZP)、銅熱電阻(WZC)和鎳熱電阻(WZN)。nr為所操作物件在0攝氏度時的標稱電阻值。

3.2、呼叫函式計算溫度值

  物件初始化後就可以操作物件來獲取物件當前時刻的溫度值。具體如下:

  CalcRTDTemperature(&rtd,rt);

  其中rt為當前物件的電阻值。

4、應用總結

  我們實現了RTD的檢測,對得到的當前溫度電阻值,使用根本驅動就可以計算得到當前的溫度。

  本驅動支援鉑熱電阻(WZP)、銅熱電阻(WZC)和鎳熱電阻(WZN)。對於不同該型別,不同標稱值的物件均可以使用。不過需要注意:鉑熱電阻對應的測溫範圍是:-200℃850℃;銅熱電阻對應的測溫範圍是:-50℃150℃;鎳電阻對應的測溫範圍是:-60℃~180℃。超過範圍的將不被支援。

歡迎關注:

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時瞭解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更方便且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公眾號【木南創智