1.最近發(fā)現(xiàn)壇里對(duì)熱敏電阻測溫系統(tǒng)呼聲很高,剛好我手里有個(gè)NTC10K的熱敏電阻,于是乎我就打算做個(gè)熱敏電阻溫度計(jì)。
2.我首先了解了NTC熱敏電阻的特性,阻值隨溫度的升高而減小。通過廠商提供的溫度和電阻對(duì)應(yīng)的關(guān)系表就可以知道阻值對(duì)應(yīng)的溫度,要想測溫度就要測出熱敏電阻的阻值,知道了原理就好辦多了。
3.閉上眼開始思考測量電阻的方法,不可能直接拿萬用表測吧,首先想到初中物理學(xué)到的R=U/I(電阻的阻值等于加在它兩端的電壓除以流過它的電流)。只要在熱敏電阻上加上電,測出電壓和電流就行了。
4.測量電壓可以用ADC測量,可是電流怎么測量呢?于是想到串聯(lián)電路電流相等,把一個(gè)已知阻值的精密電阻和熱敏電阻串聯(lián),根據(jù)I=U/R測到已知電阻上分得的電壓就可以知道電路中的電流了。
5.系統(tǒng)原理:NTC 10k熱敏電阻和10k精密電阻串聯(lián)接入VCC—GND,利用單片機(jī)內(nèi)部的ADC模塊測出NTC電阻上分的電壓ADC_V以及系統(tǒng)的供電電壓POWER_V,從而得到10k精密電阻上的電壓R_V=(POWER_V-ADC_V),根據(jù)電阻串聯(lián)電流相等可以知道NTC電阻中的電流I=R_V/10K,,再根據(jù)U=I*R可得到熱敏電阻的阻值NTC_R=ADC_V/I,通過查表找出此阻值對(duì)應(yīng)的溫度。此系統(tǒng)由于使用了STC單片機(jī)內(nèi)部的電壓基準(zhǔn)為參考,所以測溫精度不受系統(tǒng)電壓VCC的影響。
6.為了簡化NTC10k測溫系統(tǒng)的硬件制作難度,我盡量優(yōu)化設(shè)計(jì),只需NTC熱敏電阻+10k精密電阻+STC單片機(jī)+數(shù)碼管公4個(gè)元件。單片機(jī)依然采用STC15W408ASS,溫度顯示只有兩位所以數(shù)碼管采用3位共陰數(shù)碼管(把數(shù)碼管旋轉(zhuǎn)180度顛倒過來使用,前兩位顯示溫度第三位顯示“℃”符號(hào)),10k電阻盡量選擇精密一點(diǎn)的。
下圖為測得的室溫21度
NTC10K溫度計(jì)03.png (683.43 KB, 下載次數(shù): 327)
下載附件
2016-10-25 19:23 上傳
下圖為數(shù)碼管正放時(shí)的顯示,實(shí)際使用時(shí)要旋轉(zhuǎn)180度放
(這樣就可以顯示溫度符號(hào)℃)
NTC10K溫度計(jì)01.png (770.88 KB, 下載次數(shù): 349)
下載附件
2016-10-25 19:23 上傳
下圖為原理圖截圖(源文件見附件PADS layout)
NTC10K溫度計(jì)原理圖截圖.png (23.97 KB, 下載次數(shù): 346)
下載附件
2016-10-25 19:23 上傳
下圖為買熱敏電阻時(shí)賣家提供的阻值與溫度對(duì)應(yīng)關(guān)系表
NTC10K.jpg (90.59 KB, 下載次數(shù): 338)
下載附件
2016-10-25 19:23 上傳
NTC10.jpg (17.01 KB, 下載次數(shù): 305)
下載附件
2016-10-25 19:23 上傳
請?jiān)u分支持一下謝謝
- /********************************************/
- //2016.10.24日編寫完成
- //作者:劉海龍 (讀單片機(jī)內(nèi)部BandGap基準(zhǔn)電壓值參考的STC官網(wǎng)程序)
- //硬件:STC15W408AS+3位共陰數(shù)碼管+1個(gè)10K的電阻(最好選用精密電阻)+NTC10K熱敏電阻
- //晶振選12M或11.0952M
- /*原理:NTC 10k熱敏電阻和10k精密電阻串聯(lián)接入VCC—GND,利用單片機(jī)內(nèi)部的ADC
- 模塊測出NTC電阻上分的電壓ADC_V以及系統(tǒng)的供電電壓POWER_V,從而得到10k精密電阻上
- 的電壓R_V=(POWER_V-ADC_V),根據(jù)電阻串聯(lián)電流相等可以知道NTC電阻中的電流I=R_V/10K,
- ,再根據(jù)U=I*R可得到熱敏電阻的阻值NTC_R=ADC_V/I,通過查表找出此阻值對(duì)應(yīng)的溫度。*/
- #include <STC15W.h>//STC15W408AS頭文件
- #include <intrins.h>
- unsigned int NTC_R;//定義熱敏電阻阻值變量
- unsigned char temperature;//定義溫度存儲(chǔ)變量
- unsigned int code Ttable[106][2]={//溫度與電阻阻值對(duì)應(yīng)關(guān)系表格
- 0,3274,//0度對(duì)應(yīng)阻值32.74k
- 1,3111,//1度對(duì)應(yīng)阻值31.11k
- 2,2957,//2度對(duì)應(yīng)阻值29.57k
- 3,2812,//
- 4,2674,//
- 5,2545,
- 6,2422,
- 7,2306,
- 8,2196,
- 9,2092,
- 10,1993,
- 11,1900,
- 12,1811,
- 13,1728,
- 14,1648,
- 15,1573,
- 16,1501,
- 17,1433,
- 18,1369,
- 19,1308,
- 20,1250,
- 21,1194,
- 22,1142,
- 23,1092,
- 24,1045,
- 25,1000,//25度對(duì)應(yīng)阻值10k
- 26,957,//26度對(duì)應(yīng)阻值9.57k
- 27,916,
- 28,877,
- 29,840,
- 30,805,
- 31,771,
- 32,739,
- 33,709,
- 34,679,
- 35,652,
- 36,625,
- 37,600,
- 38,576,
- 39,553,
- 40,531,
- 41,510,
- 42,490,
- 43,471,
- 44,453,
- 45,435,
- 46,418,
- 47,402,
- 48,387,
- 49,372,
- 50,358,
- 51,345,
- 52,332,
- 53,320,
- 54,308,
- 55,297,
- 56,286,
- 57,276,
- 58,266,
- 59,256,
- 60,247,
- 61,238,
- 62,230,
- 63,222,
- 64,214,
- 65,207,
- 66,199,
- 67,193,
- 68,186,
- 69,180,
- 70,174,
- 71,168,
- 72,162,
- 73,157,
- 74, 152,
- 75, 147,
- 76, 142,
- 77, 137,
- 78, 133,
- 79, 128,
- 80, 124,
- 81, 120,
- 82, 116,
- 83, 113,
- 84, 109,
- 85, 106,
- 86, 102,//86度對(duì)應(yīng)阻值1.02k
- 87, 99,//87度對(duì)應(yīng)阻值0.99k
- 88, 96,
- 89, 93,
- 90, 90,
- 91, 88,
- 92, 85,
- 93, 82,
- 94, 80,
- 95, 78,
- 96, 75,
- 97, 73,
- 98, 71,
- 99, 69,
- 100,67,
- 101,65,
- 102,63,
- 103,61,
- 104,59,
- 105,58//105度對(duì)應(yīng)阻值0.58k
-
- };
- #include<4LED_YIN.H>//數(shù)碼管驅(qū)動(dòng)顯示程序
- #include <BandGap.H>//包含讀單片機(jī)內(nèi)部BandGap基準(zhǔn)電壓值
- void T_dis(){//溫度處理函數(shù)采集到的阻值與二維數(shù)組的阻值進(jìn)行比較,從而獲得相對(duì)應(yīng)的溫度值。
- unsigned char i;
- for(i=105;i<106;i--) {
- if(NTC_R >= Ttable[i][1] && NTC_R < Ttable[i-1][1]){
- temperature=(Ttable[i][0]+1);
- break;
- }
- }
- }
- /********************************/
- void main (void)
- { Delay20ms();//待系統(tǒng)穩(wěn)定
- InitADC();//初始化ADC
- P1M1=0X80;//P1.7高阻輸入
- init();//IO口設(shè)置初始化
- while (1)
- {
- ShowResult(7);//測量NTC熱敏電阻上的電壓并根據(jù)電壓計(jì)算出阻值
- T_dis();//測量到的阻值進(jìn)行查表對(duì)比找到阻值對(duì)應(yīng)的溫度值
- disp(); //數(shù)碼管顯示溫度值
- }
- }
復(fù)制代碼
|