NTC热敏电阻检测温度
1、NTC熱敏電阻、PTC熱敏電阻
下圖是NTC熱敏電阻和PTC熱敏電阻隨溫度變化,電阻值的變化曲線,可以看到:
NTC隨溫度變化阻值的變化比較明顯,對(duì)溫度變化比較靈敏。
但是,NTC阻值隨溫度變化并不是線性的,PTC的變化則比較線性;
但是,如果要測(cè)量高溫,由于NTC的高溫下阻值趨近于0,所以無(wú)法使用;
2、如何描述NTC溫度變化曲線
有這么一種材料,TA隨著溫度的變化,阻值也變化,起名為NTC熱敏電阻,上圖是實(shí)際測(cè)出來(lái)的曲線,肯定不能要求人家的阻值按照公式來(lái)變化,而是我們?nèi)ふ乙粋€(gè)符合此曲線的函數(shù)表達(dá)式,不要本末倒置了。
2.1、常用函數(shù)
下圖是來(lái)自于NTC熱敏電阻的數(shù)據(jù)手冊(cè):
根據(jù)公式,我們知道在T0溫度下的電阻值R0、B值,就可以計(jì)算出在T溫度下的電阻值R。
需要注意以下幾點(diǎn):
- 溫度的單位不是攝氏度,而是開(kāi)爾文溫度,這兩者之間的轉(zhuǎn)換也十分簡(jiǎn)單,開(kāi)爾文溫度=攝氏度+273.15;
- B值來(lái)源于廠家,手冊(cè)會(huì)給,B值越大NTC越靈敏;
- 公式是有適用的溫度范圍的,并且同一個(gè)NTC熱敏電阻在不同的溫度下也有不同的B值以提高計(jì)算精度;
?
2.2、計(jì)算不同溫度下阻值的代碼
根據(jù)上面公式寫(xiě)的代碼,可以直接輸出不同溫度對(duì)應(yīng)電阻值的數(shù)組,注意我這里的B值是以3380為例:
#include <math.h>#define C_TO_K 273.15 //攝氏度轉(zhuǎn)換為開(kāi)爾文溫度 #define T0 25 //25攝氏度 #define NTC_R0 10000 //25攝氏度,NTC=10K #define NTC_B 3380 //NTC的B值 #define T_MIN 25 //要計(jì)算的最低溫度 #define T_MAX 60 //要計(jì)算的最高溫度 double cal_ntc_resistor(u8 t) {int k = t+C_TO_K;double res = NTC_R0*exp(NTC_B*((1.0/k)-(1.0/(T0+C_TO_K))));return res; }int main() {//生成NTC熱敏電阻不同溫度對(duì)應(yīng)的電阻值數(shù)組 printf("static u16 ntc_resistor[]={\n");for(int t=T_MIN;t<=T_MAX;t++){double res = cal_ntc_resistor(t);printf("%.0f, //t=%d\n",res,t); }printf("};\n"); }運(yùn)行結(jié)果如下,連注釋都輸出了哈哈,突然想著搞一個(gè)小工具,輸入?yún)?shù)、溫度值輸出電阻值,再加上可以生成數(shù)組,反推計(jì)算B值,最好還能給出ADC的位數(shù),然后把不同溫度對(duì)應(yīng)的ADC的值輸出,再直接根據(jù)采集到的ADC值輸出溫度......
?2.3、ADC采集值對(duì)應(yīng)的NTC溫度代碼
說(shuō)明:根據(jù)ADC是在靠近GND或者靠近電源的不同,ADC的采集值是不同的,還有我使用的ADC是12位的,以下代碼的電路圖是這樣:
?在上面的基礎(chǔ)上修改的,有部分重復(fù),不過(guò)便于理解就這樣吧。
#include <math.h>#define C_TO_K 273.15 //攝氏度轉(zhuǎn)換為開(kāi)爾文溫度 #define T0 25 //25攝氏度 #define NTC_R0 10000 //25攝氏度,NTC=10K #define NTC_B 3380 //NTC的B值 #define T_MIN 25 //要計(jì)算的最低溫度 #define T_MAX 60 //要計(jì)算的最高溫度 #define R1 10000 //用于和NTC分壓的電阻 #define ADC_MAX 4095 //ADC位數(shù):12double cal_ntc_resistor(u8 t) {int k = t+C_TO_K;double res = NTC_R0*exp(NTC_B*((1.0/k)-(1.0/(T0+C_TO_K))));return res; }int main() {//生成NTC熱敏電阻不同溫度對(duì)應(yīng)的電阻值 printf("static u16 ntc_resistor[]={\n");for(int t=T_MIN;t<=T_MAX;t++){double res = cal_ntc_resistor(t);printf("%.0f, //t=%d\n",res,t); }printf("};\n");//生成NTC熱敏電阻不同溫度對(duì)應(yīng)的ADC采集值 printf("static u16 ntc_adc[]={\n");for(int t=T_MIN;t<=T_MAX;t++){double res = (ADC_MAX*R1*1.0)/(cal_ntc_resistor(t)+R1); printf("%.0f, //t=%d\n",res,t); }printf("};"); }運(yùn)行結(jié)果如下,溫度25℃時(shí)采集到的ADC值為2042,......,溫度30℃時(shí)采集到的ADC值為2233,所以只剩最后一步,看你采集到的ADC值與哪一個(gè)數(shù)據(jù)最靠近,那么你要測(cè)的溫度也就知道了;
?2.4、輸入ADC采集值,返回溫度的函數(shù)
#define TEMPERATURE_NUM 36 //檢測(cè)溫度范圍的個(gè)數(shù):60-25+1=36static u16 ntc_adc[TEMPERATURE_NUM]={2042, //t=252080, //t=262119, //t=272157, //t=282195, //t=292233, //t=302270, //t=312307, //t=322343, //t=332379, //t=342415, //t=352450, //t=362484, //t=372518, //t=382552, //t=392585, //t=402618, //t=412650, //t=422682, //t=432713, //t=442743, //t=452773, //t=462803, //t=472832, //t=482860, //t=492888, //t=502915, //t=512942, //t=522968, //t=532994, //t=543019, //t=553044, //t=563068, //t=573091, //t=583115, //t=593137, //t=60 };//獲取溫度,小于25℃返回25℃,大于60℃返回60℃ u8 get_ntc_temperature(u16 adc) {u8 i;//不在檢測(cè)的溫度范圍if(adc<ntc_adc[0])return T_MIN;if(adc>ntc_adc[TEMPERATURE_NUM-1])return T_MAX;//溫度范圍:25℃~60℃for(i=0;i<TEMPERATURE_NUM-1;i++){ if((adc>=ntc_adc[i])&&(adc<=ntc_adc[i+1])){if((adc-ntc_adc[i])<=(ntc_adc[i+1]-adc))return i+25;elsereturn i+1+25;}} }還有一個(gè)更貼近實(shí)測(cè)NTC曲線的函數(shù)表達(dá)式,叫哈坦斯特方程,1/T=A+B*ln(R)+C*(ln(R))^3,唔,沒(méi)用的知識(shí)又增多了~
總結(jié)
以上是生活随笔為你收集整理的NTC热敏电阻检测温度的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QT Quick项目简介
- 下一篇: 论文模版