NTC温度采集

NTC温度采集步骤:
NTC热敏电阻有对应的规格书,温度越高,电阻值越小,温度越低,电阻值越大,在做完上述步骤后,将计算出来的温度与NTC电阻值去比较,如果阻值与
温度相对应,那就能够对应上就证明计算过程没有错误。
1.首先ADC先初始化,获取ADC值,将ADC值转化为电压
2.将获取到的电压计算出此时的NTC电阻值
3.NTC电阻值代入温度公式,计算出温度

注意事项:我们查看ADC是否返回正确,可以利用仿真去查看变量的值,这里我的ADC_value就是ADC的返回值,返回2038,实际上有点波动是正常的,下面是采集温度的一个项目,我在NTC那里接了一个4.7K的电阻,查规格书表格我的温度值是133°,再试试别的阻值如果计算出来的温度没有问题,就是计算过程正确,接下来检查可能出现的某些情况。
第一个就是例如下面这个图,先拆掉R13,看看ADC返回是否正确,如果还是一样,那就证明这个阻值不会对ADC返回值产生影响,首先就排除了硬件上的问题

第二个就是烧录的电压是否正确,例如我现在要求返回ADC值是2048,如果我的烧录电压是3.3V和5.0V计算出来的电压值是不一样的,代入ADC电压计算公式
(2048*3.3V) / 4096= 1.66V;
(2048*5.0V) / 4096= 2.50V;
如果上述过程没有发现问题,那就先去看看ADC返回值是否正确,如果正确,就去看电压值计算过程是否正确,最后再去看温度计算过程是否正确,一步步去验证。

//赛元微:SC92F7411
#include "H/Function_Init.H"
#include "H/ADC_Init.H"
#include "math.h"

void ADC_Init(uint Channel,uchar ADCFreq);
unsigned int ADC_GetAverageValue(void);

//unsigned int ADCValue = 0x0000;
uint16_t  tmpValue;
bit AdcFlag = 0;
float  ADC_Voltage;     				//ADC电压
float NTC_Temperature;     //NTC温度值
uint32_t xdata ADC_Value;           //ADC值


/*****************************************************
*函数名称:void ADC_Init(uint Channel,uchar ADCFreq)
*函数功能:ADC初始化
*入口参数:void
*出口参数:void
*****************************************************/
void ADC_Init(uint Channel,uchar ADCFreq)
{
	ADCCON = 0X80|Channel;		//开启ADC,ADC采样频率为3M ,选择Channel位ADC采样口
	if(Channel<8)
	{
		ADCCFG0 = 1<<Channel;   //设置Channel作为采样口
	}
	else
	{
		ADCCFG1 = 1<<(Channel-8);   //设置Channel作为采样口
	}
	ADCCFG2 = ADCFreq;
}


/*****************************************************
*函数名称:uint ADC_GetAverageValue(uint Channel,ADC_SamplesNum_TypeDef ADC_SamplesNum)
*函数功能:ADC采样取平均值
*入口参数:
ADC_SamplesNum_TypeDef ADC_SamplesNum:采样次数
*出口参数:
uint:多次采样平均值
*****************************************************/
uint ADC_GetAverageValue(void)
{	
	uchar tmpCnt;
	uint tmpValueSum = 0, tmpValue;
  	uint tmpValue_Max = 0, tmpValue_Min = 0xFFFF;
 
	for(tmpCnt = 0; tmpCnt < 6; tmpCnt ++)
	{
		ADCCON |= 0X40;   //开始ADC转换
		while(!(ADCCON&0X20));
		ADCCON&=~(0X20);  //清中断标志位	
		tmpValue=(ADCVH<<4)+(ADCVL>>4);     //获取单次转换值
			
		if(tmpValue > tmpValue_Max)   //获取多次转换值中的最大值
		{
			tmpValue_Max = tmpValue;   
		}
		if(tmpValue < tmpValue_Min)   //获取多次转换值中的最小值
		{
			tmpValue_Min = tmpValue;	
		}
			
		tmpValueSum += tmpValue;   //累加多次转换值的和
	}

	tmpValueSum -= (tmpValue_Max + tmpValue_Min);
	
	tmpValue = tmpValueSum >> 2;//除于4
	return tmpValue;			//返回平均值
}

//NTC电阻值
uint32_t code ntc_r[100]=
{
	//180°~ 189°
	1548,1514,1480,1447,1414,1383,1353,1323,1294,1266,
	
	//190°~199°
	1239,1212,1186,1160,1136,1112,1088,1065,1043,1021,
	
	//200°~209°
	1000,978,957,937,917,897,878,860,841,824,
	
	//210~219°
	807,790,773,758,742,727,712,698,683,670,
	
	//220°~229°
	656,643,630,618,606,594,582,571,560,549,
};


// 定义常量
#define R_FIXED 4700.0 // 固定电阻值4.7kΩ
#define B_CONST 4537.0 // NTC的B常数
#define T0 473.15 // 200℃转换为开尔文
#define R0 1000.0 // NTC在200℃时的电阻值1kΩ

/*
函数功能:计算温度的值
参数:无
返回值:无
备注:无
*/
float calculate_temperature(float voltage) 
{
    float R_ntc;
    float V_supply = 5.0; // 电源电压5.0V		
	float tmp1 = 0.0;
    float tmp2 = 0.0;
	
    // 计算NTC电阻值
    R_ntc = R_FIXED * (V_supply / voltage - 1);   //voltage是ADC值换算过来的电压

    // 计算温度(开尔文)
    tmp1 = R_ntc/R0;
	tmp2 = log(tmp1);   
	tmp1 = tmp2/B_CONST;
	tmp2 = 1/T0;
	tmp1 = (tmp1+tmp2);
	tmp2 = 1.0/tmp1;
	if(tmp2 <= 274)tmp2 = 274;
	
	// 转换为摄氏度
	tmp2 -= 273.15;
	//tmp1 = tmp2+0.05;   //温度补偿
	
	//返回温度
    return tmp2; 
}

void Calculation_Voltage()
{
	ADC_Value = ADC_GetAverageValue();  					//获取ADC值
	ADC_Voltage = ((ADC_Value*5.0)/4095);  				    //将获取到的ADC值转化为电压值
	NTC_Temperature = calculate_temperature(ADC_Voltage);   //获取温度值
}



添加微信群交流技术方式