当前位置:   article > 正文

单片机测量NTC热敏电阻温度的方法(含程序代码)_单片机热敏电阻测温

单片机热敏电阻测温

1、NTC介绍

NTC是负温度系数热敏电阻,随着温度的升高,NTC的阻值会呈非线性的下降。

2、硬件连接

这里采用100k 3950的热敏电阻,100k代表的是在25℃下的标准阻值,3950是热敏电阻的B值,B值与电阻温度系数正相关,也就是说B值越大,其电阻温度系数也就越大。

3、 温度计算

网上查找我们所选用NTC对应的R-T对照表,也就是温度阻值对照表。根据R-T表绘制出的曲线图发现这是一个非线性曲线,所以我们很难求解。这个时候我们可以采用曲线拟合的方法,划分成很多个区间,每个区间都是一段小直线,就类比分段函数,区间划分的越多结果就越精确。这样我们只要知道NTC的阻值,找到对应的区间,带入一元一次方程求解就可以计算出对应的温度值。NTC的阻值可以通过单片机ADC采集100K电阻两端电压,然后根据电阻分压来算出。

下图是用Excel表绘制出的曲线图,Y轴是温度,单位℃,X轴是电阻值,单位KΩ。

 4、代码

1、本次需要测量的温度范围为-30~90度之间,划分为120个区间,网上查找3950 100k热敏电阻所对应的R-T对照表,把各温度对应的电阻值写入一个数值中。

  1. // b值为3950 的NTC阻值表,单位为10Ω
  2. uint32_t NTC[121]=
  3. {
  4. 178797, //-30
  5. 167960, //-29
  6. 157850, //-28
  7. 148415, //-27
  8. 139606, //-26
  9. 131377, //-25
  10. 123686, //-24
  11. 116495, //-23
  12. 109769, //-22
  13. 103474, //-21
  14. 97580, //-20
  15. 92059, //-19
  16. 86886, //-18
  17. 82036, //-17
  18. 77487, //-16
  19. 73218, //-15
  20. 69212, //-14
  21. 65449, //-13
  22. 61915, //-12
  23. 58593, //-11
  24. 55470, //-10
  25. 52532, //-9
  26. 49768, //-8
  27. 47166, //-7
  28. 44715, //-6
  29. 42407, //-5
  30. 40232, //-4
  31. 38182, //-3
  32. 36248, //-2
  33. 34423, //-1
  34. 32701, //0
  35. 31076, //1
  36. 29541, //2
  37. 28090, //3
  38. 26720, //4
  39. 25424, //5
  40. 24198, //6
  41. 23039, //7
  42. 21942, //8
  43. 20903, //9
  44. 19920, //10
  45. 18988, //11
  46. 18105, //12
  47. 17268, //13
  48. 16475, //14
  49. 15722, //15
  50. 15008, //16
  51. 14331, //17
  52. 13688, //18
  53. 13077, //19
  54. 12497, //20
  55. 11946, //21
  56. 11422, //22
  57. 10924, //23
  58. 10450, //24
  59. 10000, //25
  60. 9571, //26
  61. 9163, //27
  62. 8774, //28
  63. 8405, //29
  64. 8052, //30
  65. 7717, //31
  66. 7397, //32
  67. 7092, //33
  68. 6801, //34
  69. 6524, //35
  70. 6259, //36
  71. 6007, //37
  72. 5766, //38
  73. 5536, //39
  74. 5316, //40
  75. 5106, //41
  76. 4906, //42
  77. 4714, //43
  78. 4531, //44
  79. 4356, //45
  80. 4188, //46
  81. 4028, //47
  82. 3875, //48
  83. 3728, //49
  84. 3588, //50
  85. 3454, //51
  86. 3325, //52
  87. 3202, //53
  88. 3084, //54
  89. 2970, //55
  90. 2862, //56
  91. 2758, //57
  92. 2658, //58
  93. 2563, //59
  94. 2471, //60
  95. 2383, //61
  96. 2299, //62
  97. 2218, //63
  98. 2140, //64
  99. 2065, //65
  100. 1994, //66
  101. 1925, //67
  102. 1859, //68
  103. 1795, //69
  104. 1734, //70
  105. 1675, //71
  106. 1619, //72
  107. 1564, //73
  108. 1512, //74
  109. 1462, //75
  110. 1414, //76
  111. 1367, //77
  112. 1322, //78
  113. 1279, //79
  114. 1238, //80
  115. 1198, //81
  116. 1159, //82
  117. 1122, //83
  118. 1086, //84
  119. 1052, //85
  120. 1019, //86
  121. 987, //87
  122. 956, //88
  123. 926, //89
  124. 898 //90
  125. };

2、温度计算代码如下:

  1. #define REF_RES_VAL 10000 //参考电阻为100K=10000*10, 单位是10Ω
  2. uint16_t VCC,NTC1_VOLT,NTC2_VOLT;
  3. uint16_t get_value[8];
  4. extern uint32_t NTC[121];
  5. uint16_t Voltage_Samples(adc_channel_t ch)
  6. {
  7. uint16_t InterrefVolt_ADC,ANI2_ADC,ANI3_ADC;
  8. ADC_Converse(ADC_INTERREFVOLT, 8 , get_value);
  9. InterrefVolt_ADC = ADC_MidAvg_Filter(get_value,8);
  10. VCC = 1450*4096/InterrefVolt_ADC;
  11. // printf("VCC = %dmv\r\n",VCC);
  12. if(ch == ADC_CHANNEL_2)
  13. {
  14. ADC_Converse(ADC_CHANNEL_2, 8 , get_value);
  15. ANI2_ADC = ADC_MidAvg_Filter(get_value,8);
  16. NTC1_VOLT = ANI2_ADC*VCC/4096;
  17. ADC_Stop();
  18. // printf("NTC1_VOLT = %dmv\r\n",NTC1_VOLT);
  19. return NTC1_VOLT;
  20. }
  21. if(ch == ADC_CHANNEL_3)
  22. {
  23. ADC_Converse(ADC_CHANNEL_3, 8 , get_value);
  24. ANI3_ADC = ADC_MidAvg_Filter(get_value,8);
  25. NTC2_VOLT = ANI3_ADC*VCC/4096;
  26. ADC_Stop();
  27. // printf("NTC2_VOLT = %dmv\r\n",NTC2_VOLT);
  28. return NTC2_VOLT;
  29. }
  30. return 0;
  31. }
  32. uint16_t ADC_MidAvg_Filter(uint16_t *buf, uint8_t num)
  33. {
  34. uint8_t i, j;
  35. uint16_t tmp;
  36. uint32_t sum;
  37. /* sort the value from small to large */
  38. for(i = 0; i < num; i++)
  39. {
  40. for(j = 0; j < ((num - 1) - i); j++)
  41. {
  42. if(buf[j] > buf[j + 1])
  43. {
  44. tmp = buf[j];
  45. buf[j] = buf[j + 1];
  46. buf[j + 1] = tmp;
  47. }
  48. }
  49. }
  50. /* Remove the smallest and largest values, then take the average */
  51. sum = 0;
  52. for(i = 2; i < (num - 2); i++)
  53. {
  54. sum += buf[i];
  55. }
  56. tmp = (uint16_t) (sum / (num - 4));
  57. return (tmp);
  58. }
  59. /*************************************************************************************************
  60. * 函数名: CalcuTemp
  61. * 参 数: 无
  62. * 返回值: 无
  63. * 描 述: 根据计算的阻值来查表,获取对应温度
  64. *************************************************************************************************/
  65. int16_t CalcuTemp(uint16_t getdata)
  66. {
  67. uint8_t i;
  68. uint8_t TempeMiddle=60;
  69. int16_t Temperature;
  70. uint32_t resis;
  71. resis = (uint32_t)(VCC-getdata)*REF_RES_VAL/getdata; //计算热敏电阻的阻值
  72. // printf("Tempcalcu = %d\r\n",Tempcalcu);
  73. if(resis >= NTC[0])
  74. {
  75. Temperature = -300;
  76. }
  77. else if(resis <= NTC[120])
  78. {
  79. Temperature = 900;
  80. }
  81. else
  82. {
  83. i = TempeMiddle;
  84. if(resis > NTC[i])
  85. {
  86. for(i=TempeMiddle-1; i>=0; i--)
  87. {
  88. if(resis <= NTC[i]) //NTC[i+1] < resis < NTC[i]
  89. {
  90. break;
  91. }
  92. }
  93. }
  94. else
  95. {
  96. for(i=TempeMiddle+1; i<120; i++)
  97. {
  98. if(resis > NTC[i]) //NTC[i-1] < resis < NTC[i]
  99. {
  100. break;
  101. }
  102. }
  103. i--;
  104. }
  105. TempeMiddle = i;
  106. Temperature = (uint16_t)(TempeMiddle-30)*10+(NTC[i]-resis)*10/(NTC[i]-NTC[i+1]);
  107. }
  108. return Temperature;
  109. }
  110. void Get_Temperature(void)
  111. {
  112. float Temp1,Temp2;
  113. Voltage_Samples(ADC_CHANNEL_2);
  114. Voltage_Samples(ADC_CHANNEL_3);
  115. Temp1= CalcuTemp(NTC1_VOLT)/10.0;
  116. Temp2= CalcuTemp(NTC2_VOLT)/10.0;
  117. printf("Temp1 = %.1f℃\r\n",Temp1);
  118. printf("Temp2 = %.1f℃\r\n",Temp2);
  119. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/573834
推荐阅读
相关标签
  

闽ICP备14008679号