最近使用华大HDSC.HC32L136 MCU,上面有个测量计算NTC温度。
//NTC电阻值表
const float NTC_R_Value_Table[110]=
{
163450,155350,147700,140450,133600,127100,120950,115100,109600,104400, //0-9
99450,94800,90350,86150,82200,78450,74900,71500,68300,65300, //10-19
62400,59650,57050,54600,52250,50000,47860,45820,43880,42030, //20-29
40270,38590,36990,35465,34010,32625,31300,30000,28835,27685, //30-39
26585,25535,24535,23575,22660,21785,20945,20145,19380,18645, //40-49
17945,17265,16620,16005,15410,14845,14305,13785,13290,12810, //50-59
12355,11920,11500,11095,10710,10340,9985,9645,9320,9005, //60-69
8700,8415,8140,7880,7625,7380,7145,6915,6700,6490, //70-79
6285,6090,5905,5725,5550,5380,5215,5060,4905,4758, //80-89
4615.5,4478.5,4346,4218,4094,3974.5,3859.5,3748,3640,3536, //90-99
3435,3337.5,3243.5,3152.5,3064.5,2979.5,2897.5,2818,2740.5,2666, //100-109
};
/*
函数名称:ADC_Filter
函数功能:算数平均滤波法使用进行ADC滤波,
输入参数:ADC_M:ADC数据结构信息
*/
void ADC_Filter()
{
if(ADC_M.ADC_Cnt >= ADC_N)
{
ADC_M.Av_AM_NTC_ADC_Value = ADC_M.AM_NTC_ADC_Value / ADC_M.ADC_Cnt; //NTC的采集AD值
ADC_M.Av_Bat_ADC_Value = ADC_M.Bat_ADC_Value / ADC_M.ADC_Cnt;
ADC_M.AM_NTC_ADC_Value = 0;
ADC_M.Bat_ADC_Value = 0;
ADC_M.ADC_Cnt = 0;
Get_AM_Temperature_C();
Get_AM_Temperature_F();
Get_Battery_Message_Vol();
}
}
/*
函数名称:Calculate_Template
函数功能:计算温度值,使用二分法计算
输入参数:
*/
float Calculate_Template(uint32_t T_ADC)
{
uint16_t Low,Mid,Hight;
float Voltage,Rt,Real_T;
Low = 0;
Hight = 109;
Rt = (100000.0f * ADC_M.Av_AM_NTC_ADC_Value) / (4095.0f - ADC_M.Av_AM_NTC_ADC_Value);
do
{
Mid = (Hight + Low) / 2;
if(Rt <= NTC_R_Value_Table[Mid])
{
Low = Mid;
}
else
{
Hight = Mid;
}
if(Low == (Hight-1) || Low == Hight)
{
Real_T = (float)Low + (NTC_R_Value_Table[Low] - Rt)/(NTC_R_Value_Table[Low] - NTC_R_Value_Table[Low+1]);
return Real_T;
}
}while(Low <= Hight);
Real_T = (float)Low;
return Real_T;
}
注意:ADC(ADC采样值) ÷ 4095 = Rntc(NTC阻值) ÷ 100000(电阻值)