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