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); //获取温度值
}
添加微信群交流技术方式