调试备忘录-NTC电阻的使用(教程 + 代码)

软件环境:CodeWarrior 11.1

硬件环境:NXP S9KEAZ64A

传感器参数:NTC热敏电阻(R25 = 50k,B25-50 3950) 

写在前面

  最近做小项目需要用到NTC电阻,因此写一个调试备忘录记录下。

什么是NTC电阻?

  NTC热敏电阻就是负温度系数的电阻,当温度升高时,电阻降低(反之则为PTC电阻)。NTC电阻灵敏度高,温度分辨率高,但

是测量温度范围较窄,通常低于100摄氏度。

NTC电阻与温度之间的关系

  NTC热敏电阻温度和电阻关系最常见的公式就是如下图基于参数“β”的指数公式,公式比较简单,也是非常常用的公式。(其中的

β,有些资料也称为B) 

  其中,

  

 

  因此,如果知道了RT2 、T2和B的值,就可以计算出任意温度下NTC热敏电阻的阻值,或者计算出任意NTC热敏电阻阻值对应的温

度值。常规应用中,厂家一般会给出T=298.15k下的阻值和B值,不同型号的NTC热敏电阻其参数也是不同。

 

 

NTC电阻的实际应用

  在购买使用NTC电阻之前,我们需要先确认NTC电阻在25℃的阻值,然后设计温度采样电路。可以先和商家确认热敏电阻的阻值表。

例如:下表部分阻值表的截图,其中的R25=15KΩ就是热敏电阻在25℃时候的阻值,B25/50就是25℃-50℃时候的B值。

  因此如果我想检测温度的话,直接将检测到的电阻值带入上面的公式,就可以得到当前的温度了。

 

 

  当然,如果你检测区间不在25℃-50℃,你也可以自己将阻值表里面的数据,带入公式中,得出你目标区间的B值,进而在一定区间内比较精准的检测温度。

  对于NTC热敏电阻的检测电路,直接使用最简单的分压电路就可以了。如下图:

                                                                                

RT1阻值的计算方法为:R = (adc_value * 20 * 1.0 /  (adc_all - adc_value))  ;

  其中,adc_all 为你的ADC采样精度,例如8位精度就是0xFF,adc_value为你的ADC实际采样值,20为电路中的分压电阻,20K。1.0是为了确保有小数结果。

所以最终的温度为:

ADC_Channel_Vlaue = ADC_Read(ch);					//Read ADC value from channel n 
R = (20 * ADC_Channel_Vlaue * 1.0 /(255 - ADC_Channel_Vlaue));		//8位精度
Temperature1_Value = 1/ (log( R / R25 )  / B + 1 / (273.15 + 25));
Temperature1_Value = Temperature1_Value - 273.15;


Temperature1_Value 为最终的温度。

附上函数的全部代码

float Temperature_Measurement(UINT8 ch)
{
	UINT8 Temperature_Counter = 0; 
	UINT8 ADC_Channel_Vlaue = 0;
	float Temperature1_Value;	
	float Temperature1_Sum_Value = 0;
	float Temperature1_Average_Value = 0;
	float R25 = 50;
	float R = 0;
	float B = 3950;
	
	while(Temperature_Counter<100)
	{
		Temperature_Counter++;
		ADC_Channel_Vlaue = ADC_Read(ch);		          //Read ADC value from channel n 
		R = (20 * ADC_Channel_Vlaue * 1.0 /(255 - ADC_Channel_Vlaue));	 //
		Temperature1_Value = 1/ (log( R / R25 )  / B + 1 / (273.15 + 25));
		Temperature1_Value = Temperature1_Value - 273.15;
		Temperature1_Sum_Value = Temperature1_Sum_Value + Temperature1_Value;	
		ADC_SC1 = 0	;						
	}		
	
	Temperature1_Average_Value = Temperature1_Sum_Value / Temperature_Counter;	
	
	return (Temperature1_Average_Value);	
}

  

 

 

 

 

 

 

 

 

 

posted @ 2019-12-24 01:25  洛神殇  阅读(1834)  评论(0编辑  收藏  举报