基于单片机与热敏电阻MF58-103的温度计设计

MF58热敏电阻

上图为NTC型热敏电阻MF58,NTC的意思就是该电阻的电阻值随着温度的升高,电阻降低,随着温度的降低,电阻值变大。打开MF58热敏电阻的datasheet看看,如下所示:

MF58-103

我们使用的热敏电阻型号为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); // 
}