我們已經討論過多種溫度檢測方式,但我們尚未關注熱電阻溫度檢測,但熱電阻測溫在工業環境中是非常常見的。儘管有很多整合的數字式的熱電阻介面元器件,但這些器件不但成本較高,靈活性也大打折扣。所以我們有時會使用更簡單靈活的電路來驅動rtd。而在這一篇中,我們將討論如何設計並實現rtd熱電阻測溫的驅動。
rtd熱電阻是常用的測溫元件。rtd的英文全稱為「resistance temperature detector」,因此準確來說,它應該翻譯為「電阻溫度檢測器」。rtd是一種特殊的電阻,其阻值會隨著溫度的公升高而變大,隨著溫度的降低而減小。工業上利用它的這一特性進行溫度測量,因此rtd也被俗稱為「熱電阻」。
並不是所有的金屬都適合做成rtd,符合這一特性的材料需要滿足如下幾個要求:
符合該要求的金屬並不多,常見的rtd材料有:鉑(pt)、鎳(ni)和銅(cu)。對應的國家統一生產工業標準化熱電阻有三種:wzp型鉑電阻、wzc型銅熱電阻和wzn型鎳熱電阻。
鉑電阻是我們常用的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℃下的標稱電阻值。
銅熱電阻也是在工業上常用的rtd,銅熱電阻採用溫度係數為:4.28x10-3的元件。溫度和電阻的關係表示式:
其中,rt是溫度為t℃時的電阻,r0是溫度為0℃時電阻,而各個係數長數的取值為:
常數α=4.28x10-3
常數β=-9.31x10-8
常數γ=1.23x10-9
銅熱電阻對應的測溫範圍是:-50℃~150℃。而常見的分類型號有:cu50、cu100等。名稱中的數值表示熱電阻在0℃下的標稱電阻值。
另一種工業標準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℃下的標稱電阻值。
我們已經了解了rtd的特性,以及不同材質的rtd溫度與點組的關係表示式。接下來我們就實現通過rtd檢測溫度的驅動。
在實現rtd的驅動之前,我們依然需要抽象並定義rtd物件,並將其宣告為物件型別。
在實現對rtd的操作之前,我們先抽象rtd物件。每乙個rtd物件都有幾個共同的屬性:標稱電阻,溫度和型別。型別就是前面所描述的三種,我們將其定義為列舉。物件的宣告如下:
/* 定義rtd型別列舉 */
typedef enum rtdcategory rtdcategorytype;
/* 定義rtd物件 */
typedef struct rtdobjectrtdobjecttype;
宣告乙個rtd物件後,僅僅只是宣告了乙個物件變數,在賦值之前尚不能使用。所以我們要使用初始化函式將其初始化之後才可使用。rtd物件的初始化函式如下:
/* 初始化rtd物件 */
void rtdinitialization(rtdobjecttype *rtd,rtdcategorytype type,float nr)
rtd->type=type;
rtd->nominalr=nr;
}
前面我們已經提到了各類熱電阻的電阻與溫度的關係表示式。在這些表示式中,二次以上的項的係數其實是非常小的,所以在一般要求不高,溫度變化不是很大的場合基本就是線性關係。所以我們將其簡化為線性方程:
鉑電阻的溫度與電阻的關係在0度以上和0度以下略有差別,但如果我們採用線性近似的話則是一樣的。所以我們採用線性方程實現如下:
/* 計算鉑電阻溫度 */
static float calcwzptemperature(rtdobjecttype *rtd,float rt)
銅電阻的溫度與電阻的關係表示式相對複雜,但好在高次項的影響相對較小,我們依然可以使用線性近似來實現它。
/* 計算銅電阻溫度 */
static float calcwzctemperature(rtdobjecttype *rtd,float rt)
鎳電阻的電阻溫度係數比鉑電阻和銅電阻都要好,但其線性度則不如鉑電阻,同樣的是其高次項的影響也相對較小,在溫度並不大範圍變化時仍然可以採取線性近似。
/* 計算鎳電阻溫度 */
static float calcwzntemperature(rtdobjecttype *rtd,float rt)
面向不同型別的rtd,我們實現了各自的溫度轉換函式,但作為驅動函式庫,我們總是希望能進行無差別呼叫。所以我們希望設計乙個統一的介面函式。所幸每種型別rtd操作函式均有相同的格式,於是我們就很容易想到使用函式指標來處理它。
float (*calctemperature)(rtdobjecttype *rtd,float rt)=;
/*計算熱電阻測得的溫度*/
float calcrtdtemperature(rtdobjecttype *rtd,float rt)
我們採用rtd測溫時可以使用這一驅動。其實用步驟分兩步:宣告並初始化物件;呼叫函式計算溫度值。接下來我們就來實現之。
首先使用rtdobjecttype型別定義rtd物件,如果有多個可以使用陣列方式定義。rtdobjecttype rtd;或rtdobjecttype rtd[n];的形式。其中n為數量。
定義物件變數後和以呼叫初始化函式對齊進行初始化:
rtdinitialization(&rtd,type,nr);
其中type為rtdcategorytype列舉型別,可以是鉑熱電阻(wzp)、銅熱電阻(wzc)和鎳熱電阻(wzn)。nr為所操作物件在0攝氏度時的標稱電阻值。
物件初始化後就可以操作物件來獲取物件當前時刻的溫度值。具體如下:
calcrtdtemperature(&rtd,rt);
其中rt為當前物件的電阻值。
我們實現了rtd的檢測,對得到的當前溫度電阻值,使用根本驅動就可以計算得到當前的溫度。
本驅動支援鉑熱電阻(wzp)、銅熱電阻(wzc)和鎳熱電阻(wzn)。對於不同該型別,不同標稱值的物件均可以使用。不過需要注意:鉑熱電阻對應的測溫範圍是:-200℃850℃;銅熱電阻對應的測溫範圍是:-50℃150℃;鎳電阻對應的測溫範圍是:-60℃~180℃。超過範圍的將不被支援。
驅動開發筆記 開篇
身為資訊保安專業的學生,接觸計算機也有十來的年頭了,到現在還沒有深入過windows核心的世界,不禁有些慚愧。所以現在開始認認真真沉下心來研究這個全新的世界,記些筆記,不但方便自己回頭翻閱,也希望可以和同樣研究驅動 核心的朋友們一起研究 首先向大家推薦一本好書 rootkits windows核心的...
Linux驅動開發筆記(二)
linux驅動開發的基本框架 define led major 200 define led name led static int led open struct inode inode,struct file filp static int led release struct inode in...
測試驅動開發筆記(二) xUnit
1.防止改完後引起新錯誤 再次執行單元測試。2.如果單元測試涉及到可變資訊 如當前時間 需要將待測試資料也變為可變,否則無法回歸測試 3.使用測試驅動開發必須從頭開始,嚴格進行,否則到半中間會很費事的。4.測試驅動開發中,私有方法也要測試,可通過反射實現,如 summer example new s...