基于单片机与热敏电阻MF58-103的温度计设计
上图为NTC型热敏电阻MF58,NTC的意思就是该电阻的电阻值随着温度的升高,电阻降低,随着温度的降低,电阻值变大。打开MF58热敏电阻的datasheet看看,如下所示:
我们使用的热敏电阻型号为MF58-103-36,对照上面图中的温度值,就可以查到对应的电阻值,上图中,有零下40摄氏度到零上130摄氏度的值。从数据可以看出,随着温度的上升,电阻值在减小。在坐标系里面表示,如下图所示:
温度曲线,实际上是曲折的,我们在计算温度的时候,可以把10摄氏度之间,看做是近似的直线,就可以利用数学斜率的知识,计算出任何一个电阻值下的温度值。
上图中,R16代表热敏电阻,R15是一个10K的电阻。他两串联后,两端加一个电压,在他们中间,就会有一个电压值,找一个带AD口的单片机,或者找一个普通单片机+AD转换芯片,就可以用单片机测量到中间的电压值,知道了电压值,就可以利用分压的原理,计算出热敏电阻的阻值,根据这个阻值,再计算出温度值。这就是流程,也是热敏电阻测温的原理。
根据测到的电压值,得到热敏电阻的电阻值程序:
uint32_t ADC_To_Res(uint32_t adc_value) { uint32_t res_value; res_value = (adc_value*10000)/(Vref-adc_value); return res_value; }
利用斜率公式,计算温度值的程序:
uint8_t Res_To_Temp(uint32_t res_value) // 入口参数是电阻值 { uint32_t k; // 斜率 int32_t temp; // 温度值 if( (res_value<29371)&&(res_value>18680) ) // 0~10摄氏度 { k = 1069; temp = ((29370-res_value)/k)+0; } else if( (res_value<18681)&&(res_value>12240) ) // 10~20 { k = 644; temp = ((18680-res_value)/k)+10; } else if( (res_value<12241)&&(res_value>8221) ) // 20~30 { k = 402; temp = ((12240-res_value)/k)+20; } else if( (res_value<8222)&&(res_value>5648) ) // 30~40 { k = 257; temp = ((8221-res_value)/k)+30; } else if( (res_value<5649)&&(res_value>3958) ) // 40~50 { k = 169; temp = ((5648-res_value)/k)+40; } else if( (res_value<47731)&&(res_value>29370) ) // -10~0 { k = 1836; temp = ((47730-res_value)/k)-10; } else if( (res_value<80361)&&(res_value>47730) ) // -20~-10 { k = 3263; temp = ((80360-res_value)/k)-20; } else if( (res_value<140001)&&(res_value>80360) ) // -30~-20 { k = 5964; temp = ((140000-res_value)/k)-30; } else if( (res_value<249600)&&(res_value>140000) ) // -40~-30 { k = 10960; temp = ((249600-res_value)/k)-40; } return((uint8_t)temp); // }