NTC热敏电阻检测温度
1、NTC熱敏電阻、PTC熱敏電阻
下圖是NTC熱敏電阻和PTC熱敏電阻隨溫度變化,電阻值的變化曲線,可以看到:
NTC隨溫度變化阻值的變化比較明顯,對溫度變化比較靈敏。
但是,NTC阻值隨溫度變化并不是線性的,PTC的變化則比較線性;
但是,如果要測量高溫,由于NTC的高溫下阻值趨近于0,所以無法使用;
2、如何描述NTC溫度變化曲線
有這么一種材料,TA隨著溫度的變化,阻值也變化,起名為NTC熱敏電阻,上圖是實際測出來的曲線,肯定不能要求人家的阻值按照公式來變化,而是我們去尋找一個符合此曲線的函數表達式,不要本末倒置了。
2.1、常用函數
下圖是來自于NTC熱敏電阻的數據手冊:
根據公式,我們知道在T0溫度下的電阻值R0、B值,就可以計算出在T溫度下的電阻值R。
需要注意以下幾點:
- 溫度的單位不是攝氏度,而是開爾文溫度,這兩者之間的轉換也十分簡單,開爾文溫度=攝氏度+273.15;
- B值來源于廠家,手冊會給,B值越大NTC越靈敏;
- 公式是有適用的溫度范圍的,并且同一個NTC熱敏電阻在不同的溫度下也有不同的B值以提高計算精度;
?
2.2、計算不同溫度下阻值的代碼
根據上面公式寫的代碼,可以直接輸出不同溫度對應電阻值的數組,注意我這里的B值是以3380為例:
#include <math.h>#define C_TO_K 273.15 //攝氏度轉換為開爾文溫度 #define T0 25 //25攝氏度 #define NTC_R0 10000 //25攝氏度,NTC=10K #define NTC_B 3380 //NTC的B值 #define T_MIN 25 //要計算的最低溫度 #define T_MAX 60 //要計算的最高溫度 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熱敏電阻不同溫度對應的電阻值數組 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"); }運行結果如下,連注釋都輸出了哈哈,突然想著搞一個小工具,輸入參數、溫度值輸出電阻值,再加上可以生成數組,反推計算B值,最好還能給出ADC的位數,然后把不同溫度對應的ADC的值輸出,再直接根據采集到的ADC值輸出溫度......
?2.3、ADC采集值對應的NTC溫度代碼
說明:根據ADC是在靠近GND或者靠近電源的不同,ADC的采集值是不同的,還有我使用的ADC是12位的,以下代碼的電路圖是這樣:
?在上面的基礎上修改的,有部分重復,不過便于理解就這樣吧。
#include <math.h>#define C_TO_K 273.15 //攝氏度轉換為開爾文溫度 #define T0 25 //25攝氏度 #define NTC_R0 10000 //25攝氏度,NTC=10K #define NTC_B 3380 //NTC的B值 #define T_MIN 25 //要計算的最低溫度 #define T_MAX 60 //要計算的最高溫度 #define R1 10000 //用于和NTC分壓的電阻 #define ADC_MAX 4095 //ADC位數: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熱敏電阻不同溫度對應的電阻值 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熱敏電阻不同溫度對應的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("};"); }運行結果如下,溫度25℃時采集到的ADC值為2042,......,溫度30℃時采集到的ADC值為2233,所以只剩最后一步,看你采集到的ADC值與哪一個數據最靠近,那么你要測的溫度也就知道了;
?2.4、輸入ADC采集值,返回溫度的函數
#define TEMPERATURE_NUM 36 //檢測溫度范圍的個數: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;//不在檢測的溫度范圍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;}} }還有一個更貼近實測NTC曲線的函數表達式,叫哈坦斯特方程,1/T=A+B*ln(R)+C*(ln(R))^3,唔,沒用的知識又增多了~
總結
以上是生活随笔為你收集整理的NTC热敏电阻检测温度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT Quick项目简介
- 下一篇: 论文模版