最近手头上一个项目需要NTC温度测试,网上搜了一下,各类驱动算法一大堆,指数公式,B温度常数,由于所用项目精度要求不高(±1摄氏度),所以就根据NTC电阻参数表,设计一个简短的温度采集驱动程序。
芯片采用N32WB452LEQ6,连接在PA5脚,该引脚通过10K电阻上拉到3.3V电源,通过1K电阻,串联NTC热敏电阻,到地线。ADC采集处电压数据(单位:毫伏)。后面开始附上代码,同样,前面是头文件代码,后面是应用代码,ADC初始化贴在前面,NTC代码贴在后面,移植应用可以根据项目需要,删减、增加自己的应用代码,代码实测。
#ifndef __ADC_H__
#define __ADC_H__
// #include "n32wb452.h"
#include "main.h"
#define V25 1.32f
#define AVG_SLOPE 0.004f
//__packed
struct __ADC__
{
u16 voltage; //power voltage
u16 adcBuf[10];
u32 value; //ADC原始数据
u32 sampleTime; //采样时间
double tem; //温度
u32 resistance; //电阻值
u8 ok; //采样OK标志
u8 debug; //调试模式控制。
};
extern struct __ADC__ Adc1; //battery
extern struct __ADC__ Adc2; //type_c J405
extern u16 cpuTemperature; //0.1摄氏度
extern float cpuTemperatureFloat;
float TempCal(uint16_t TempAdVal);
uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel);
float cpuTempGet(void); //CPU内部温度获取。
void adcInit(void); //adc 初始化
void adcDeal(void); //ADC数据处理
#endif
// #include "main.h"
#include "adc.h"
#ifdef HARD_202303 //LDO芯片3.3V贴错成了2.8V的.
#define ADC1_TO_V_FACTOR ((28*(570.0f))/4096) //The coefficient:adc value to voltage value,mv.
#else
#define ADC1_TO_V_FACTOR ((33*(570.0f))/4096) //The coefficient:adc value to voltage value,mv.
// #define ADC_TO_V_FACTOR ((3300*(100.0f+470))/(4096*100.0f)) //转换系数:ADC采样值转换到电池电压单位mv
#endif
#define ADC2_TO_V_FACTOR (3300/4096.0f)
u16 cpuTemperature = 0; //0.1摄氏度
float cpuTemperatureFloat = 0;
struct __ADC__ Adc1; //PA1 ADC1 battery voltage
struct __ADC__ Adc2; //PA5 ADC2 TYPE_C NTC
void ADC_Initial(ADC_Module* ADCx)
{
ADC_InitType ADC_InitStructure;
ADC_InitStructure.WorkMode = ADC_WORKMODE_INDEPENDENT; //独立模式
ADC_InitStructure.MultiChEn = DISABLE; //单通道
ADC_InitStructure.ContinueConvEn = DISABLE; //单次转换
ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE; //软件触发方式
ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R; //数据右对齐
ADC_InitStructure.ChsNumber = 1;//
ADC_Init(ADCx, &ADC_InitStructure);
ADC_Enable(ADCx, ENABLE);
while(ADC_GetFlagStatusNew(ADCx,ADC_FLAG_RDY) == RESET);
ADC_StartCalibration(ADCx);
while (ADC_GetCalibrationStatus(ADCx));
}
void adcInit(void) //adc 初始化 PA1:ADC1 供电电压 PA5:连接到TypeC接口
{
GPIO_InitType GPIO_Initure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC1,ENABLE);
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC2,ENABLE);
ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB,RCC_ADCHCLK_DIV16);
GPIO_Initure.Pin = GPIO_PIN_1|GPIO_PIN_5;
GPIO_Initure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitPeripheral(GPIOA, &GPIO_Initure);
ADC_Initial(ADC1);
ADC_Initial(ADC2);
Adc1.sampleTime = 500; //This code just for testing.
Adc2.sampleTime = 100; //This code just for testing.
Power.powerDown = FALSE;
Power.lowPower = FALSE;
Adc1.debug = DEBUG_ENABLE; //debug mode :default disable
Adc1.debug = DEBUG_DISABLE; //debug mode :default disable
Adc2.debug = DEBUG_ENABLE; //debug mode :default disable
Adc2.debug = DEBUG_DISABLE; //debug mode :default disable
}
uint16_t ADC_GetData(ADC_Module* ADCx, uint8_t ADC_Channel)
{
uint16_t dat;
ADC_ConfigRegularChannel(ADCx, ADC_Channel, 1, ADC_SAMP_TIME_239CYCLES5);
ADC_EnableSoftwareStartConv(ADCx, ENABLE);
while(ADC_GetFlagStatus(ADCx, ADC_FLAG_ENDC)==0){
}
ADC_ClearFlag(ADCx, ADC_FLAG_ENDC);
ADC_ClearFlag(ADCx, ADC_FLAG_STR);
dat=ADC_GetDat(ADCx);
return dat;
}
// u16 V30 = 0;
#define Vc0 0 //X
#define Tc1 1.5f
float TempCal(uint16_t TempAdVal)
{
float Temperate;
u16 V30 = *(__IO uint32_t*)((uint32_t)0x1FFFF7D0);
/* Get the temperature inside the chip */
Temperate=((V30+Vc0-TempAdVal)*3.3/4095)/AVG_SLOPE+30.0f-Tc1;
return Temperate;
}
float cpuTempGet(void) //CPU内部温度获取。
{
float Temperate;
float tempValue;
ADC_ConfigRegularChannel(ADC1, ADC_CH_16, 1, ADC_SAMP_TIME_239CYCLES5);//ADC_CH_16:测温度,ADC_CH_18:测内部1.2V基准
ADC_EnableTempSensorVrefint(ENABLE);
ADC_EnableSoftwareStartConv(ADC1, ENABLE);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ENDC)==0)
{
}
ADC_ClearFlag(ADC1, ADC_FLAG_ENDC);
ADC_ClearFlag(ADC1, ADC_FLAG_STR);
tempValue=ADC_GetDat(ADC1);
// Voltage value of temperature sensor
Temperate = TempCal(tempValue);
return Temperate;
}
void adcDeal(void) //ADC数据处理
{
static u32 adc1Time = 0;
static u32 adc2Time = 0;
static u32 cpuTemTime = 0;
if (Timer.ms - cpuTemTime>5000)
{
cpuTemTime = Timer.ms;
float Temperate = cpuTempGet();
cpuTemperature = Temperate*10;
cpuTemperatureFloat = Temperate;
// debugLog("CPU 温度:%f.",Temperate);
}
if(Timer.ms -adc1Time>Adc1.sampleTime) //sampling time control.
{
adc1Time = Timer.ms;
static u8 index = 0;
Adc1.adcBuf[index++] = ADC_GetData(ADC1,ADC1_Channel_02_PA1);
if (index>=10)
{
u16 max = Adc1.adcBuf[0];
u16 min = Adc1.adcBuf[0];
for (int i = 1; i < 10; i++) //从1开始
{
if (Adc1.adcBuf[i] > max)
{
max = Adc1.adcBuf[i];
}
else if (Adc1.adcBuf[i] < min)
{
min = Adc1.adcBuf[i];
}
}
Adc1.value = 0;
for (int i = 0; i < 10; i++)
{
Adc1.value += Adc1.adcBuf[i];
}
Adc1.value = Adc1.value-max-min; //去掉一个最大值,去掉一个最小值
Adc1.value = Adc1.value>>3; //取8个采样点平均值。
Adc1.voltage = Adc1.value*ADC1_TO_V_FACTOR; //equipment.voltage分辨率 mV
Adc1.ok = TRUE;
index = 0;
}
}
if(Timer.ms -adc2Time>Adc2.sampleTime) //sampling time control. NTC
{
static u8 times = 0;
static u32 averageAdcValue = 0;
adc2Time = Timer.ms;
averageAdcValue += ADC_GetData(ADC2,ADC2_Channel_02_PA5); //ADC value.
if (++times<10) return;
times = 0;
Adc2.value = averageAdcValue/10; //计算平均值。
averageAdcValue = 0;
Adc2.voltage = Adc2.value*ADC2_TO_V_FACTOR; //equipment.voltage分辨率 0.001V
Adc2.tem = getNtcTempertature(Adc2.voltage);
if (Adc2.value>2000)
{
if (Device.hallSw == 0)
{
Device.hallSw = 1; //0:霍尔闭合状态,关门 1:开门,霍尔弹起状态
Jt808.alarm = ALARM_HALL_ON;
printf("霍尔报警:%d.\r\n",Device.hallSw);
}
}
else
{
if (Device.hallSw == 1)
{
Device.hallSw = 0; //0:霍尔闭合状态,关门 1:开门,霍尔弹起状态
Jt808.alarm = ALARM_HALL_OFF;
printf("霍尔报警:%d.\r\n",Device.hallSw);
}
}
debugLog("CPU温度:%.2f,温度:%.2f,湿度:%0.2f%%,NTC温度:%.2f,NTC_ADC:%d,NTC_V:%dmv,NTC RS:%dR.",cpuTemperatureFloat, Aht20.tem/10.0,Aht20.hum/10.0,Adc2.tem,Adc2.value,Adc2.voltage,Adc2.resistance);
Adc2.ok = TRUE;
}
}
#ifndef __RES_NTC_H
#define __RES_NTC_H
#include "main.h" //
struct __NTC_
{
unsigned int rMin; //最小阻值
unsigned int rMax; //最大阻值
int tem; //对应的温度值
};
void ntcTableInit(void); //ntc R T表格初始化
double getNtcTempertature(u16 ntcVoltage); //R=U/I; //R=U/I
#endif
#include "ntc.h"
struct __NTC_ NtcTable[157]={0};
// struct _adc_temp get_temp_value;
static int g_index=0;
// -------------------------------------------------
// ntcTableInit
// 参 数 ntc R T表格初始化 R单位:R,T单位:摄氏度
// 作 者: kevinPan
// 返回值:无
// -------------------------------------------------
void ntcTableInit(void) //ntc R T表格初始化
{
int i = 0;
NtcTable[i].rMin = 116953;
NtcTable[i].rMax = 125421;
NtcTable[i].tem = -25;
i++;
NtcTable[i].rMin = 110459;
NtcTable[i].rMax = 116953;
NtcTable[i].tem = -24;
i++;
NtcTable[i].rMin = 104365;
NtcTable[i].rMax = 110459;
NtcTable[i].tem = -23;
i++;
NtcTable[i].rMin = 98643;
NtcTable[i].rMax = 104365;
NtcTable[i].tem = -22;
i++;
NtcTable[i].rMin = 93270;
NtcTable[i].rMax = 98643;
NtcTable[i].tem = -21;
i++;
NtcTable[i].rMin = 88221;
NtcTable[i].rMax = 93270;
NtcTable[i].tem = -20;
i++;
NtcTable[i].rMin = 83476;
NtcTable[i].rMax = 88221;
NtcTable[i].tem = -19;
i++;
NtcTable[i].rMin = 79014;
NtcTable[i].rMax = 83476;
NtcTable[i].tem = -18;
i++;
NtcTable[i].rMin = 74816;
NtcTable[i].rMax = 79014;
NtcTable[i].tem = -17;
i++;
NtcTable[i].rMin = 70867;
NtcTable[i].rMax = 74816;
NtcTable[i].tem = -16;
i++;
NtcTable[i].rMin = 67148;
NtcTable[i].rMax = 70867;
NtcTable[i].tem = -15;
i++;
NtcTable[i].rMin = 63647;
NtcTable[i].rMax = 67148;
NtcTable[i].tem = -14;
i++;
NtcTable[i].rMin = 60348;
NtcTable[i].rMax = 63647;
NtcTable[i].tem = -13;
i++;
NtcTable[i].rMin = 57239;
NtcTable[i].rMax = 60348;
NtcTable[i].tem = -12;
i++;
NtcTable[i].rMin = 54308;
NtcTable[i].rMax = 57239;
NtcTable[i].tem = -11;
i++;
NtcTable[i].rMin = 51544;
NtcTable[i].rMax = 54308;
NtcTable[i].tem = -10;
i++;
NtcTable[i].rMin = 48969;
NtcTable[i].rMax = 51544;
NtcTable[i].tem = -9;
i++;
NtcTable[i].rMin = 46535;
NtcTable[i].rMax = 48969;
NtcTable[i].tem = -8;
i++;
NtcTable[i].rMin = 44234;
NtcTable[i].rMax = 46535;
NtcTable[i].tem = -7;
i++;
NtcTable[i].rMin = 42058;
NtcTable[i].rMax = 44234;
NtcTable[i].tem = -6;
i++;
NtcTable[i].rMin = 40000;
NtcTable[i].rMax = 42058;
NtcTable[i].tem = -5;
i++;
NtcTable[i].rMin = 38052;
NtcTable[i].rMax = 40000;
NtcTable[i].tem = -4;
i++;
NtcTable[i].rMin = 36208;
NtcTable[i].rMax = 38052;
NtcTable[i].tem = -3;
i++;
NtcTable[i].rMin = 34463;
NtcTable[i].rMax = 36208;
NtcTable[i].tem = -2;
i++;
NtcTable[i].rMin = 32810;
NtcTable[i].rMax = 34463;
NtcTable[i].tem = -1;
i++;
NtcTable[i].rMin = 31243;
NtcTable[i].rMax = 32810;
NtcTable[i].tem = 0;
i++;
NtcTable[i].rMin = 29770;
NtcTable[i].rMax = 31243;
NtcTable[i].tem = 1;
i++;
NtcTable[i].rMin = 28372;
NtcTable[i].rMax = 29770;
NtcTable[i].tem = 2;
i++;
NtcTable[i].rMin = 27045;
NtcTable[i].rMax = 28372;
NtcTable[i].tem = 3;
i++;
NtcTable[i].rMin = 25785;
NtcTable[i].rMax = 27045;
NtcTable[i].tem = 4;
i++;
NtcTable[i].rMin = 24590;
NtcTable[i].rMax = 25785;
NtcTable[i].tem = 5;
i++;
NtcTable[i].rMin = 23454;
NtcTable[i].rMax = 24590;
NtcTable[i].tem = 6;
i++;
NtcTable[i].rMin = 22376;
NtcTable[i].rMax = 23454;
NtcTable[i].tem = 7;
i++;
NtcTable[i].rMin = 21351;
NtcTable[i].rMax = 22376;
NtcTable[i].tem = 8;
i++;
NtcTable[i].rMin = 20377;
NtcTable[i].rMax = 21351;
NtcTable[i].tem = 9;
i++;
NtcTable[i].rMin = 19450;
NtcTable[i].rMax = 20377;
NtcTable[i].tem = 10;
i++;
NtcTable[i].rMin = 18560;
NtcTable[i].rMax = 19450;
NtcTable[i].tem = 11;
i++;
NtcTable[i].rMin = 17716;
NtcTable[i].rMax = 18560;
NtcTable[i].tem = 12;
i++;
NtcTable[i].rMin = 16914;
NtcTable[i].rMax = 17716;
NtcTable[i].tem = 13;
i++;
NtcTable[i].rMin = 16154;
NtcTable[i].rMax = 16914;
NtcTable[i].tem = 14;
i++;
NtcTable[i].rMin = 15431;
NtcTable[i].rMax = 16154;
NtcTable[i].tem = 15;
i++;
NtcTable[i].rMin = 14744;
NtcTable[i].rMax = 15431;
NtcTable[i].tem = 16;
i++;
NtcTable[i].rMin = 14092;
NtcTable[i].rMax = 14744;
NtcTable[i].tem = 17;
i++;
NtcTable[i].rMin = 13472;
NtcTable[i].rMax = 14092;
NtcTable[i].tem = 18;
i++;
NtcTable[i].rMin = 12882;
NtcTable[i].rMax = 13472;
NtcTable[i].tem = 19;
i++;
NtcTable[i].rMin = 12321;
NtcTable[i].rMax = 12882;
NtcTable[i].tem = 20;
i++;
NtcTable[i].rMin = 11788;
NtcTable[i].rMax = 12321;
NtcTable[i].tem = 21;
i++;
NtcTable[i].rMin = 11280;
NtcTable[i].rMax = 11788;
NtcTable[i].tem = 22;
i++;
NtcTable[i].rMin = 10797;
NtcTable[i].rMax = 11280;
NtcTable[i].tem = 23;
i++;
NtcTable[i].rMin = 10337;
NtcTable[i].rMax = 10797;
NtcTable[i].tem = 24;
i++;
NtcTable[i].rMin = 9900;
NtcTable[i].rMax =10337;
NtcTable[i].tem = 25;
i++;
NtcTable[i].rMin = 9477;
NtcTable[i].rMax = 9900;
NtcTable[i].tem = 26;
i++;
NtcTable[i].rMin = 9075;
NtcTable[i].rMax = 9477;
NtcTable[i].tem = 27;
i++;
NtcTable[i].rMin = 8692;
NtcTable[i].rMax = 9075;
NtcTable[i].tem = 28;
i++;
NtcTable[i].rMin = 8326;
NtcTable[i].rMax = 8692;
NtcTable[i].tem = 29;
i++;
NtcTable[i].rMin = 7978;
NtcTable[i].rMax = 8326;
NtcTable[i].tem = 30;
i++;
NtcTable[i].rMin = 7645;
NtcTable[i].rMax = 7978;
NtcTable[i].tem = 31;
i++;
NtcTable[i].rMin = 7328;
NtcTable[i].rMax = 7645;
NtcTable[i].tem = 32;
i++;
NtcTable[i].rMin = 7025;
NtcTable[i].rMax = 7328;
NtcTable[i].tem = 33;
i++;
NtcTable[i].rMin = 6736;
NtcTable[i].rMax = 7025;
NtcTable[i].tem = 34;
i++;
NtcTable[i].rMin = 6460;
NtcTable[i].rMax = 6736;
NtcTable[i].tem = 35;
i++;
NtcTable[i].rMin = 6196;
NtcTable[i].rMax = 6460;
NtcTable[i].tem = 36;
i++;
NtcTable[i].rMin = 5945;
NtcTable[i].rMax = 6196;
NtcTable[i].tem = 37;
i++;
NtcTable[i].rMin = 5704;
NtcTable[i].rMax = 5945;
NtcTable[i].tem = 38;
i++;
NtcTable[i].rMin = 5475;
NtcTable[i].rMax = 5704;
NtcTable[i].tem = 39;
i++;
NtcTable[i].rMin = 5255;
NtcTable[i].rMax = 5475;
NtcTable[i].tem = 40;
i++;
NtcTable[i].rMin = 5045;
NtcTable[i].rMax = 5255;
NtcTable[i].tem = 41;
i++;
NtcTable[i].rMin = 4844;
NtcTable[i].rMax = 5045;
NtcTable[i].tem = 42;
i++;
NtcTable[i].rMin = 4652;
NtcTable[i].rMax = 4844;
NtcTable[i].tem = 43;
i++;
NtcTable[i].rMin = 4468;
NtcTable[i].rMax = 4652;
NtcTable[i].tem = 44;
i++;
NtcTable[i].rMin = 4293;
NtcTable[i].rMax = 4468;
NtcTable[i].tem = 45;
i++;
NtcTable[i].rMin = 4125;
NtcTable[i].rMax = 4293;
NtcTable[i].tem = 46;
i++;
NtcTable[i].rMin = 3964;
NtcTable[i].rMax = 4125;
NtcTable[i].tem = 47;
i++;
NtcTable[i].rMin = 3810;
NtcTable[i].rMax = 3964;
NtcTable[i].tem = 48;
i++;
NtcTable[i].rMin = 3662;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 49;
i++;
NtcTable[i].rMin = 3521;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 50;
i++;
NtcTable[i].rMin = 3388;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 51;
i++;
NtcTable[i].rMin = 3261;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 52;
i++;
NtcTable[i].rMin = 3139;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 53;
i++;
NtcTable[i].rMin = 3023;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 54;
i++;
NtcTable[i].rMin = 2911;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 55;
i++;
NtcTable[i].rMin = 2804;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 56;
i++;
NtcTable[i].rMin = 2702;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 57;
i++;
NtcTable[i].rMin = 2603;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 58;
i++;
NtcTable[i].rMin = 2509;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 59;
i++;
NtcTable[i].rMin = 2419;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 60;
i++;
NtcTable[i].rMin = 2332;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 61;
i++;
NtcTable[i].rMin = 2249;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 62;
i++;
NtcTable[i].rMin = 2169;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 63;
i++;
NtcTable[i].rMin = 2093;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 64;
i++;
NtcTable[i].rMin = 2019;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 65;
i++;
NtcTable[i].rMin = 1949;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 66;
i++;
NtcTable[i].rMin = 1881;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 67;
i++;
NtcTable[i].rMin = 1816;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 68;
i++;
NtcTable[i].rMin = 1753;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 69;
i++;
NtcTable[i].rMin = 1693;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 70;
i++;
NtcTable[i].rMin = 1636;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 71;
i++;
NtcTable[i].rMin = 1580;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 72;
i++;
NtcTable[i].rMin = 1527;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 73;
i++;
NtcTable[i].rMin = 1471;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 74;
i++;
NtcTable[i].rMin = 1426;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 75;
i++;
NtcTable[i].rMin = 1379;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 76;
i++;
NtcTable[i].rMin = 1333;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 77;
i++;
NtcTable[i].rMin = 1289;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 78;
i++;
NtcTable[i].rMin = 1247;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 79;
i++;
NtcTable[i].rMin = 1206;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 80;
i++;
NtcTable[i].rMin = 1167;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 81;
i++;
NtcTable[i].rMin = 1129;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 82;
i++;
NtcTable[i].rMin = 1093;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 83;
i++;
NtcTable[i].rMin = 1058;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 84;
i++;
NtcTable[i].rMin = 1024;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 85;
i++;
NtcTable[i].rMin = 992;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 86;
i++;
NtcTable[i].rMin = 960;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 87;
i++;
NtcTable[i].rMin = 930;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 88;
i++;
NtcTable[i].rMin = 901;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 89;
i++;
NtcTable[i].rMin = 873;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 90;
i++;
NtcTable[i].rMin = 846;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 91;
i++;
NtcTable[i].rMin = 820;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 92;
i++;
NtcTable[i].rMin = 795;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 93;
i++;
NtcTable[i].rMin = 771;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 94;
i++;
NtcTable[i].rMin = 748;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 95;
i++;
NtcTable[i].rMin = 725;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 96;
i++;
NtcTable[i].rMin = 704;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 97;
i++;
NtcTable[i].rMin = 683;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 98;
i++;
NtcTable[i].rMin = 662;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 99;
i++;
NtcTable[i].rMin = 643;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 100;
i++;
NtcTable[i].rMin = 624;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 101;
i++;
NtcTable[i].rMin = 606;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 102;
i++;
NtcTable[i].rMin = 588;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 103;
i++;
NtcTable[i].rMin = 571;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 104;
i++;
NtcTable[i].rMin = 555;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 105;
i++;
NtcTable[i].rMin = 539;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 106;
i++;
NtcTable[i].rMin = 523;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 107;
i++;
NtcTable[i].rMin = 508;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 108;
i++;
NtcTable[i].rMin = 494;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 109;
i++;
NtcTable[i].rMin = 480;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 110;
i++;
NtcTable[i].rMin = 467;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 111;
i++;
NtcTable[i].rMin = 454;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 112;
i++;
NtcTable[i].rMin = 441;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 113;
i++;
NtcTable[i].rMin = 429;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 114;
i++;
NtcTable[i].rMin = 417;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 115;
i++;
NtcTable[i].rMin = 406;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 116;
i++;
NtcTable[i].rMin = 395;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 117;
i++;
NtcTable[i].rMin = 384;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 118;
i++;
NtcTable[i].rMin = 374;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 119;
i++;
NtcTable[i].rMin = 364;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 120;
i++;
NtcTable[i].rMin = 354;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 121;
i++;
NtcTable[i].rMin = 344;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 122;
i++;
NtcTable[i].rMin = 335;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 123;
i++;
NtcTable[i].rMin = 326;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 124;
i++;
NtcTable[i].rMin = 318;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 125;
i++;
NtcTable[i].rMin = 310;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 126;
i++;
NtcTable[i].rMin = 301;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 127;
i++;
NtcTable[i].rMin = 294;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 128;
i++;
NtcTable[i].rMin = 286;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 129;
i++;
NtcTable[i].rMin = 279;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 130;
i++;
NtcTable[i].rMin = 272;
NtcTable[i].rMax = NtcTable[i-1].rMin;
NtcTable[i].tem = 131;
i++;
g_index = i;
printf("NTC列表长度:%d,温度范围%d-%d摄氏度.\r\n",g_index,NtcTable[0].tem,NtcTable[g_index-1].tem);
}
/*-------------------------------------------------
* resToTemperature
* 参 数 The resistance value is converted to the temperature value
* 作 者: kevinPan
* 返回值:temperature value
*-------------------------------------------------*/
double resToTemperature(unsigned int resistance)
{
int i = 0;
if (resistance > NtcTable[0].rMax)
{
return -25;
}
else if (resistance <= NtcTable[g_index - 1].rMin)
{
return 131;
}
else if (resistance >= NtcTable[g_index - 1].rMin && resistance <= NtcTable[0].rMax)
{
for (i = 0; i < g_index; i++)
{
if (resistance > NtcTable[i].rMin && resistance <= NtcTable[i].rMax)
{
float temp = 0;
temp = (float)(NtcTable[i].rMax-resistance)/(NtcTable[i].rMax-NtcTable[i].rMin);
return NtcTable[i].tem+temp;
}
}
}
return 0;
}
// *-------------------------------------------------
// * 函数名:Check_car_tempertature
// * 参 数: 检测电压,单位 mv 每1S钟更新温度
// * 作 者: kevinPan
// * 返回值:ntc temprature.
// *-------------------------------------------------
double getNtcTempertature(u16 ntcVoltage) //R=U/I 电压单位:mv
{
double temperature = 0;
Adc2.resistance = (ntcVoltage*10000)/(3300-ntcVoltage)-1000;//求取电阻值,减去串联的1K电阻。
temperature = resToTemperature(Adc2.resistance);
return temperature;
}