我們已經討論過多種溫度檢測方式,但我們尚未關注熱電阻溫度檢測,但熱電阻測溫在工業環境中是非常常見的。盡管有很多集成的數字式的熱電阻接口元器件,但這些器件不但成本較高,靈活性也大打折扣。所以我們有時會使用更簡單靈活的電路來驅動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℃。超過范圍的將不被支持。
-
電阻
+關注
關注
86文章
5467瀏覽量
171656 -
RTD
+關注
關注
1文章
152瀏覽量
27484 -
熱電阻
+關注
關注
6文章
373瀏覽量
27985 -
鉑電阻
+關注
關注
1文章
73瀏覽量
34182 -
驅動設計
+關注
關注
1文章
110瀏覽量
15268
發布評論請先 登錄
相關推薦
評論