NTC 测取温度(方法一)

本文详细介绍了使用NTC热敏电阻进行温度测量的方法,包括原理和具体实现步骤。通过ADC值与温度值的关系表,实现温度转换。在8051内核的芯片上,通过ADC初始化、读取和转换,获取精确的温度值。代码示例展示了如何从ADC值计算温度,并对数据进行了平均处理以提高准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NTC 测取温度(方法一)


前言

NTC 测取温度(方法一)。这里采用NTC的查表方式进行温度转换。


一、NTC 测取温度原理

NTC 测取温度的基本原理是:NTC热敏电阻的电阻值会根据温度的变化而进行变化,那么温度值和TC热敏电阻的电阻值就有对应表,那么程序中,我直接使用查表法进行查表转换就以完成转换。有些人可能会问,那么这个关系表哪里来?一般供应商都能提供的。

二、实现过程

1.先将电阻值换为对应的ADC值的表

ADC值的表如下:

//-15~1194温度对应ADC关系表
uint16_t code ADCValueToTemp[210] =			
{
 3936 ,3928 ,3919 ,3909 ,3900 ,3889 ,3879 ,3868 ,3856 ,3844 
,3832 ,3819 ,3805 ,3791 ,3776 ,3761 ,3744 ,3727 ,3709 ,3690 
,3671 ,3652 ,3631 ,3610 ,3588 ,3566 ,3543 ,3519 ,3494 ,3469 
,3444 ,3417 ,3390 ,3362 ,3334 ,3305 ,3275 ,3245 ,3214 ,3183 
,3151 ,3118 ,3085 ,3052 ,3018 ,2983 ,2948 ,2913 ,2877 ,2841 
,2805 ,2768 ,2731 ,2693 ,2656 ,2618 ,2580 ,2542 ,2503 ,2465 
,2427 ,2388 ,2350 ,2311 ,2273 ,2235 ,2196 ,2157 ,2119 ,2080 
,2042 ,2004 ,1966 ,1929 ,1891 ,1854 ,1818 ,1781 ,1745 ,1710 
,1674 ,1639 ,1605 ,1571 ,1537 ,1504 ,1471 ,1439 ,1407 ,1376 
,1345 ,1315 ,1285 ,1256 ,1227 ,1199 ,1171 ,1144 ,1117 ,1091 
,1065 ,1039 ,1014 ,989 ,964 ,940 ,917 ,894 ,872 ,850 
,828 ,807 ,787 ,766 ,747 ,728 ,709 ,691 ,673 ,656  /* -15~104 */
,639 ,622 ,607 ,592 ,577 ,563 ,549 ,536 ,523 ,510 
,497 ,485 ,473 ,461 ,449 ,438 ,427 ,417 ,406 ,396 
,387 ,377 ,368 ,359 ,350 ,341 ,333 ,325 ,317 ,309 
,302 ,294 ,287 ,280 ,273 ,267 ,260 ,254 ,248 ,242  /* 15~144 */	
,236 ,231 ,225 ,220 ,214 ,209 ,204 ,200 ,195 ,190 
,186 ,182 ,177 ,173 ,169 ,165 ,161 ,158 ,154 ,151 
,147 ,144 ,140 ,137 ,134 ,131 ,128 ,125 ,122 ,120 
,117 ,114 ,112 ,109 ,107 ,105 ,102 ,100 ,98 ,96 
,94 ,92 ,90 ,88 ,86 ,84 ,82 ,80 ,79 ,77   /* 15~194 */													
};
				

2.温度转换

代码如下(用的 是8051内核的国产芯片):

int TEMP = 0;				      //温度值
int Temp_cn1 = 0;				      //温度值
int Temp_cn2 = 0;				      //温度值
uint8_t i,j;
uint8_t ADC_High,ADC_Low;	      //温度值的十位,个位
uint16_t value_max = 0,value_min = 5000;
data uint16_t ADC_Value, ADC_ValueSum; //ADC转换值,ADC转换值和


/**************************************************
*函数名称:void ADCInit(void)
*函数功能:ADC初始化
*入口参数:void
*出口参数:void
*功能说明:使能ADC通道5,参考电压为VDD
**************************************************/
void ADCInit(void)
{
	ADC_Init(ADC_PRESSEL_FHRC_D8, ADC_Cycle_6Cycle);
	ADC_ChannelConfig(ADC_CHANNEL_4, ENABLE);
	ADC_Cmd(ENABLE);
	ADC_VrefConfig(ADC_VREF_VDD);	
}

extern char putchar(char c);
int BspGetTemperature(void)
{
  int j;
	int temp_num;
	TEMP =-1;
  if( ADC_Value >=4002 )return (-1);

	for(j=0;j<120;j++)
	{
		if((ADC_Value <= ADCValueToTemp[j]) && (ADC_Value > ADCValueToTemp[j+1]))
		{															
			TEMP = j;		   //得转换值对应数组下标
			break;
		}							 
	}
	temp_num = ((ADC_Value - ADCValueToTemp[TEMP+1])*10)/(ADCValueToTemp[TEMP]-ADCValueToTemp[TEMP+1]); /* 计算小数部分 */
	if(TEMP < 15)
	{
		TEMP = 15 - TEMP;	   //温度值
	}
	else
	{
		TEMP = TEMP - 15; 
	}

	return (TEMP*10+temp_num);
}
/**************************************************
*函数名称:void GetADCValue(void)
*函数功能:得到温度值在数组ADCValueToTemp[]的下标值
*入口参数:void
*出口参数:void
*功能说明:每个下标值测十次,去掉最高最低值求平均值
**************************************************/
void GetADCValue(void)
{
  uint16_t ADC_Value_tem=0; 

	ADC_ValueSum = 0;									//测十次,去掉最高最低值
	ADC_ChannelConfig(ADC_CHANNEL_8, ENABLE);
	for(i=0;i<5;i++)
	{
		ADC_StartConversion();							//开始一次ADC转换
		while(!ADC_GetFlagStatus());					//转换完成,等待标志位置1
		ADC_ClearFlag();
		ADC_Value = ADC_GetConversionValue();			//得到ADC转换值

		if(ADC_Value >= value_max)  value_max = ADC_Value;
		if(ADC_Value <= value_min)  value_min = ADC_Value; 
		ADC_ValueSum = ADC_ValueSum + ADC_Value;
	}
	ADC_Value = (ADC_ValueSum-value_max-value_min)/3;	//转换值平均值
	value_min = 5000;   value_max = 0;

  if( ADC_Value >=4002 ){ Temp_cn2=-1; return; }
	Temp_cn2 = BspGetTemperature();
	//printf( "adc:%d;t:%d\r\n",ADC_Value,Temp_cn2 );	  

	ADC_ValueSum = 0;
	ADC_ChannelConfig(ADC_CHANNEL_4, ENABLE);
	for(i=0;i<5;i++)
	{
		ADC_StartConversion();							//开始一次ADC转换
		while(!ADC_GetFlagStatus());					//转换完成,等待标志位置1
		ADC_ClearFlag();
		ADC_Value = ADC_GetConversionValue();			//得到ADC转换值
 
		if(ADC_Value >= value_max)  value_max = ADC_Value;
		if(ADC_Value <= value_min)  value_min = ADC_Value; 
		ADC_ValueSum = ADC_ValueSum + ADC_Value;
	}

	ADC_Value = (ADC_ValueSum-value_max-value_min)/3;	//转换值平均值
	value_min = 5000;   value_max = 0;

  if( ADC_Value >=4002 ){ Temp_cn1=-1; return; }
	Temp_cn1 = BspGetTemperature();
	//printf( "adc:%d;t:%d\r\n",ADC_Value,Temp_cn1 );	 
	//putchar(ADC_Value);
				   	
}

这里0度以上有验证过,0度以下未进行验证。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ruihuan_2000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值