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