NTC 测取温度(方法一)

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度以下未进行验证。


NTC温度方法可以分为两种:电压比较和电流比较。下面我简单介绍一下这两种方法的实现步骤和程序。 1. 电压比较 电压比较是通过比较NTC电阻的电压与参考电压的大小来推温度。具体步骤如下: 步骤1:将NTC电阻与一个已知电阻串联,组成一个电压分压器电路。 步骤2:将电压分压器电路的输出端接入模拟输入口。 步骤3:读取模拟输入口的电压值。 步骤4:根据电压分压公式和已知电阻的阻值、参考电压和ADC分辨率等参数,计NTC电阻的阻值。 步骤5:根据NTC电阻的阻值和NTC温度特性曲线,推出当前温度。 以下是电压比较的示例程序: ```c++ const int REF_RESISTOR = 10000; // 参考电阻的阻值,单位为欧姆 const int REF_VOLTAGE = 5000; // 参考电压,单位为毫伏 const int ADC_RESOLUTION = 1024; // ADC的分辨率 int read_ntc_voltage(int ntc_pin) { // 读取NTC电阻的电压值 int ntc_voltage = analogRead(ntc_pin) * REF_VOLTAGE / ADC_RESOLUTION; return ntc_voltage; } int calculate_ntc_resistance(int ntc_pin, int known_resistor) { // 计NTC电阻的阻值 int ntc_voltage = read_ntc_voltage(ntc_pin); int ref_voltage = REF_VOLTAGE; int ref_resistor = REF_RESISTOR; int ntc_resistor = (ref_resistor * ntc_voltage) / (ref_voltage - ntc_voltage); ntc_resistor = known_resistor * ntc_resistor / (ref_resistor - ntc_resistor); return ntc_resistor; } float calculate_temperature(int ntc_pin, int known_resistor) { // 计温度 int ntc_resistor = calculate_ntc_resistance(ntc_pin, known_resistor); float temperature = 0; // 根据NTC温度特性曲线推温度 // ... return temperature; } ``` 2. 电流比较 电流比较是通过比较NTC电阻的电流与参考电流的大小来推温度。具体步骤如下: 步骤1:将NTC电阻与一个已知电阻并联,组成一个电流分流器电路。 步骤2:将电流分流器电路的输出端接入模拟输入口。 步骤3:读取模拟输入口的电流值。 步骤4:根据电流分流公式和已知电阻的阻值、参考电流和ADC分辨率等参数,计NTC电阻的阻值。 步骤5:根据NTC电阻的阻值和NTC温度特性曲线,推出当前温度。 以下是电流比较的示例程序: ```c++ const float REF_CURRENT = 0.001; // 参考电流,单位为安培 const int ADC_RESOLUTION = 1024; // ADC的分辨率 int read_ntc_current(int ntc_pin) { // 读取NTC电阻的电流值 int ntc_voltage = analogRead(ntc_pin) * REF_VOLTAGE / ADC_RESOLUTION; int ntc_resistor = calculate_ntc_resistance(ntc_pin, known_resistor); float ntc_current = ntc_voltage / ntc_resistor; return ntc_current; } int calculate_ntc_resistance(int ntc_pin, int known_resistor) { // 计NTC电阻的阻值 float ntc_current = read_ntc_current(ntc_pin); float ref_current = REF_CURRENT; float known_resistor = known_resistor; float ntc_resistor = known_resistor * ref_current / ntc_current - known_resistor; return ntc_resistor; } float calculate_temperature(int ntc_pin, int known_resistor) { // 计温度 int ntc_resistor = calculate_ntc_resistance(ntc_pin, known_resistor); float temperature = 0; // 根据NTC温度特性曲线推温度 // ... return temperature; } ``` 以上程序中的calculate_ntc_resistance函数和calculate_temperature函数需要根据具体的NTC和电路参数进行相应的计和实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值