【C语言技巧】NTC查表计算温度

原理图部分:

在这里插入图片描述


static void prvNetEvent( void )
{uint8_t  i;uint16_t j;j = usAdcGetResult(3);  //参数0~15,查询方式做一次ADC, 返回值就是结果, == 4096 为错误if(j < 4096){j = prvGet_Temperature(j); //计算温度值if(j >= 400)    F0 = 0, j -= 400;       //温度 >= 0度else            F0 = 1, j  = 400 - j;   //温度 <  0度pucLEDBuffer[4] = j / 1000;     //显示温度值pucLEDBuffer[5] = (j % 1000) / 100;pucLEDBuffer[6] = (j % 100) / 10 + DIS_DOT;pucLEDBuffer[7] = j % 10;if(pucLEDBuffer[4] == 0)    pucLEDBuffer[4] = DIS_BLACK;if(F0)  pucLEDBuffer[4] = DIS_;     //显示-}else    //错误{for(i=0; i<8; i++)  pucLEDBuffer[i] = DIS_;}
}//  MF52E 10K at 25, B = 3950, ADC = 12 bits
uint16_t code temp_table[]={140,    //;-40  0149,    //;-39  1159,    //;-38  2168,    //;-37  3178,    //;-36  4188,    //;-35  5199,    //;-34  6210,    //;-33  7222,    //;-32  8233,    //;-31  9246,    //;-30  10259,    //;-29  11272,    //;-28  12286,    //;-27  13301,    //;-26  14317,    //;-25  15333,    //;-24  16349,    //;-23  17367,    //;-22  18385,    //;-21  19403,    //;-20  20423,    //;-19  21443,    //;-18  22464,    //;-17  23486,    //;-16  24509,    //;-15  25533,    //;-14  26558,    //;-13  27583,    //;-12  28610,    //;-11  29638,    //;-10  30667,    //;-9   31696,    //;-8   32727,    //;-7   33758,    //;-6   34791,    //;-5   35824,    //;-4   36858,    //;-3   37893,    //;-2   38929,    //;-1   39965,    //;0    401003,   //;1    411041,   //;2    421080,   //;3    431119,   //;4    441160,   //;5    451201,   //;6    461243,   //;7    471285,   //;8    481328,   //;9    491371,   //;10   501414,   //;11   511459,   //;12   521503,   //;13   531548,   //;14   541593,   //;15   551638,   //;16   561684,   //;17   571730,   //;18   581775,   //;19   591821,   //;20   601867,   //;21   611912,   //;22   621958,   //;23   632003,   //;24   642048,   //;25   652093,   //;26   662137,   //;27   672182,   //;28   682225,   //;29   692269,   //;30   702312,   //;31   712354,   //;32   722397,   //;33   732438,   //;34   742479,   //;35   752519,   //;36   762559,   //;37   772598,   //;38   782637,   //;39   792675,   //;40   802712,   //;41   812748,   //;42   822784,   //;43   832819,   //;44   842853,   //;45   852887,   //;46   862920,   //;47   872952,   //;48   882984,   //;49   893014,   //;50   903044,   //;51   913073,   //;52   923102,   //;53   933130,   //;54   943157,   //;55   953183,   //;56   963209,   //;57   973234,   //;58   983259,   //;59   993283,   //;60   1003306,   //;61   1013328,   //;62   1023351,   //;63   1033372,   //;64   1043393,   //;65   1053413,   //;66   1063432,   //;67   1073452,   //;68   1083470,   //;69   1093488,   //;70   1103506,   //;71   1113523,   //;72   1123539,   //;73   1133555,   //;74   1143571,   //;75   1153586,   //;76   1163601,   //;77   1173615,   //;78   1183628,   //;79   1193642,   //;80   1203655,   //;81   1213667,   //;82   1223679,   //;83   1233691,   //;84   1243702,   //;85   1253714,   //;86   1263724,   //;87   1273735,   //;88   1283745,   //;89   1293754,   //;90   1303764,   //;91   1313773,   //;92   1323782,   //;93   1333791,   //;94   1343799,   //;95   1353807,   //;96   1363815,   //;97   1373822,   //;98   1383830,   //;99   1393837,   //;100  1403844,   //;101  1413850,   //;102  1423857,   //;103  1433863,   //;104  1443869,   //;105  1453875,   //;106  1463881,   //;107  1473887,   //;108  1483892,   //;109  1493897,   //;110  1503902,   //;111  1513907,   //;112  1523912,   //;113  1533917,   //;114  1543921,   //;115  1553926,   //;116  1563930,   //;117  1573934,   //;118  1583938,   //;119  1593942    //;120  160
};/********************  计算温度 ***********************************************/
// 计算结果: 0对应-40.0度, 400对应0度, 625对应25.0度, 最大1600对应120.0度. 
// 为了通用, ADC输入为12bit的ADC值.
// 电路和软件算法设计: Coody
/**********************************************/#define     D_SCALE     10      //结果放大倍数, 放大10倍就是保留一位小数
static uint16_t prvGet_Temperature(uint16_t adc)
{uint16_t code *p;uint16_t i;uint8_t  j,k,min,max;adc = 4096 - adc;   //Rt接地p = temp_table;if(adc < p[0])      return (0xfffe);if(adc > p[160])    return (0xffff);min = 0;        //-40度max = 160;      //120度for(j=0; j<5; j++)  //对分查表{k = min / 2 + max / 2;if(adc <= p[k]) max = k;else            min = k;}if(adc == p[min])  i = min * D_SCALE;else if(adc == p[max])  i = max * D_SCALE;else    // min < temp < max{while(min <= max){min++;if(adc == p[min])   {i = min * D_SCALE; break;}else if(adc < p[min]){min--;i = p[min]; //minj = (adc - i) * D_SCALE / (p[min+1] - i);i = min;i *= D_SCALE;i += j;break;}}}return i;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部