单片机中使用NTC求温度值

最近使用华大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(电阻值)

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页