学习目标

学习内容

NTC(Negative Temperature Coefficient)是指随温度上升电阻减小、具有负温度系数的热敏电阻现象和材料。

原理图

83.png

ADC功能 引脚
ADC0 P1.0
ADC1 P1.1
ADC2 P5.4
ADC3 P1.3
ADC4 P1.4
ADC5 P1.5
ADC6 P1.6
ADC7 P1.7
ADC8 P0.0
ADC9 P0.1
ADC10 P0.2
ADC11 P0.3
ADC12 P0.4
ADC13 P0.5
ADC14 P0.6

温度计算步骤

通过ADC得到电压

热敏电阻 - 图2
这里ADC_V就是通过ADC通道读到的数值,范围是0-4096
V_ntc即为对应的电压值

通过欧姆定律得到阻值

热敏电阻 - 图3
即整个线路上的电流是固定的,则热敏电阻的阻值X_r = V_ntc * 10 / (3.3 - V_ntc)

通过阻值查表得到温度

根据阻值对照该热敏电阻提供的对照表,得到对应的温度值

热敏电阻与温度对照表

NTC对照表.png
采用表的方式来记录 电阻值和温度的关系。
其中,表中记录的是阻值,下标记录的是温度。可以通过阻值比对,查询出下标,下标就是对应的温度。

  1. u16 code temp_table[]= {
  2. 58354, // -55
  3. 55464, // -54
  4. 52698, // -53
  5. 50048, // -52
  6. 47515, // -51
  7. 45097, // -50
  8. 42789, // -49
  9. 40589, // -48
  10. 38492, // -47
  11. 36496, // -46
  12. 34597, // -45
  13. 32791, // -44
  14. 31075, // -43
  15. 29444, // -42
  16. 27896, // -41
  17. 26427, // -40
  18. 25034, // -39
  19. 23713, // -38
  20. 22460, // -37
  21. 21273, // -36
  22. 20148, // -35
  23. 19083, // -34
  24. 18075, // -33
  25. 17120, // -32
  26. 16216, // -31
  27. 15361, // -30
  28. 14551, // -29
  29. 13785, // -28
  30. 13061, // -27
  31. 12376, // -26
  32. 11728, // -25
  33. 11114, // -24
  34. 10535, // -23
  35. 9986, // -22
  36. 9468, // -21
  37. 8977, // -20
  38. 8513, // -19
  39. 8075, // -18
  40. 7660, // -17
  41. 7267, // -16
  42. 6896, // -15
  43. 6545, // -14
  44. 6212, // -13
  45. 5898, // -12
  46. 5601, // -11
  47. 5319, // -10
  48. 5053, // -9
  49. 4801, // -8
  50. 4562, // -7
  51. 4336, // -6
  52. 4122, // -5
  53. 3920, // -4
  54. 3728, // -3
  55. 3546, // -2
  56. 3374, // -1
  57. 3211, // 0
  58. 3057, // 1
  59. 2910, // 2
  60. 2771, // 3
  61. 2639, // 4
  62. 2515, // 5
  63. 2396, // 6
  64. 2284, // 7
  65. 2177, // 8
  66. 2076, // 9
  67. 1978, // 10
  68. 1889, // 11
  69. 1802, // 12
  70. 1720, // 13
  71. 1642, // 14
  72. 1568, // 15
  73. 1497, // 16
  74. 1430, // 17
  75. 1366, // 18
  76. 1306, // 19
  77. 1248, // 20
  78. 1193, // 21
  79. 1141, // 22
  80. 1092, // 23
  81. 1044, // 24
  82. 1000, // 25
  83. 957, // 26
  84. 916, // 27
  85. 877, // 28
  86. 840, // 29
  87. 805, // 30
  88. 771, // 31
  89. 739, // 32
  90. 709, // 33
  91. 679, // 34
  92. 652, // 35
  93. 625, // 36
  94. 600, // 37
  95. 576, // 38
  96. 552, // 39
  97. 530, // 40
  98. 509, // 41
  99. 489, // 42
  100. 470, // 43
  101. 452, // 44
  102. 434, // 45
  103. 417, // 46
  104. 401, // 47
  105. 386, // 48
  106. 371, // 49
  107. 358, // 50
  108. 344, // 51
  109. 331, // 52
  110. 318, // 53
  111. 306, // 54
  112. 295, // 55
  113. 284, // 56
  114. 274, // 57
  115. 264, // 58
  116. 254, // 59
  117. 245, // 60
  118. 236, // 61
  119. 228, // 62
  120. 220, // 63
  121. 212, // 64
  122. 205, // 65
  123. 198, // 66
  124. 191, // 67
  125. 184, // 68
  126. 178, // 69
  127. 172, // 70
  128. 166, // 71
  129. 160, // 72
  130. 155, // 73
  131. 150, // 74
  132. 145, // 75
  133. 140, // 76
  134. 135, // 77
  135. 131, // 78
  136. 126, // 79
  137. 122, // 80
  138. 118, // 81
  139. 115, // 82
  140. 111, // 83
  141. 107, // 84
  142. 104, // 85
  143. 101, // 86
  144. 97, // 87
  145. 94, // 88
  146. 91, // 89
  147. 89, // 90
  148. 86, // 91
  149. 83, // 92
  150. 81, // 93
  151. 78, // 94
  152. 76, // 95
  153. 74, // 96
  154. 71, // 97
  155. 69, // 98
  156. 67, // 99
  157. 65, // 100
  158. 63, // 101
  159. 61, // 102
  160. 60, // 103
  161. 58, // 104
  162. 56, // 105
  163. 55, // 106
  164. 53, // 107
  165. 52, // 108
  166. 50, // 109
  167. 49, // 110
  168. 47, // 111
  169. 46, // 112
  170. 45, // 113
  171. 43, // 114
  172. 42, // 115
  173. 41, // 116
  174. 40, // 117
  175. 39, // 118
  176. 38, // 119
  177. 37, // 120
  178. 36, // 121
  179. 35, // 122
  180. 34, // 123
  181. 33, // 124
  182. 32, // 125
  183. };

代码参考

创建NTC.h,写入如下内容

  1. #ifndef __NTC_H__
  2. #define __NTC_H__
  3. #include "Config.h"
  4. // 求绝对值
  5. #define abs(x) ((x > 0) ? (x) : (-(x)))
  6. #define NTC_GPIO GPIO_P0
  7. #define NTC_GPIO_PIN GPIO_Pin_4
  8. #define NTC_ACD_CH ADC_CH12
  9. // 初始化NTC
  10. void NTC_init();
  11. // 获取温度值
  12. int NTC_get_temperature();
  13. #endif

创建一个NTC.c文件,写入如下内容,请自行将temp_table拷贝进来

  1. #include "NTC.h"
  2. #include "GPIO.h"
  3. #include "ADC.h"
  4. #include "NVIC.h"
  5. #include <stdio.h>
  6. static void GPIO_config(void) {
  7. GPIO_InitTypeDef GPIO_InitStructure; //结构定义
  8. GPIO_InitStructure.Pin = NTC_GPIO_PIN; //指定要初始化的IO,
  9. GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  10. GPIO_Inilize(NTC_GPIO, &GPIO_InitStructure);//初始化
  11. }
  12. /******************* AD配置函数 *******************/
  13. void ADC_config(void)
  14. {
  15. ADC_InitTypeDef ADC_InitStructure; //结构定义
  16. ADC_InitStructure.ADC_SMPduty = 31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
  17. ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
  18. ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3
  19. ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
  20. ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
  21. ADC_Inilize(&ADC_InitStructure); //初始化
  22. ADC_PowerControl(ENABLE); //ADC电源开关, ENABLE或DISABLE
  23. NVIC_ADC_Init(DISABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  24. }
  25. // 初始化NTC
  26. void NTC_init() {
  27. GPIO_config();
  28. ADC_config();
  29. }
  30. static int search_temp(float rst_Rx10){
  31. int i, min_index = 0;
  32. // 计算数组长度
  33. int len = sizeof(temp_table) / sizeof(u16);
  34. // 记录最小差值
  35. float min_diff = abs(rst_Rx10 - temp_table[0]);
  36. for (i = 1; i < len; i++){
  37. // 计算数组里每一个阻值和rst_Rx10的差值
  38. float diff = abs(rst_Rx10 - temp_table[i]);
  39. // 得到差值最小元素对应的索引i
  40. if(diff < min_diff){
  41. // 如果有更小的差值,赋值
  42. min_diff = diff;
  43. min_index = i;
  44. }
  45. }
  46. printf("len: %d R: %.2f min_diff: %.2f min_index: %d \n", len, rst_Rx10, min_diff, min_index);
  47. return min_index;
  48. }
  49. // 获取温度值
  50. int NTC_get_temperature() {
  51. u16 adc_value;
  52. float rst_V;
  53. float rst_R;
  54. int rst_T;
  55. // 获取对应的ADC值
  56. adc_value = Get_ADCResult(NTC_ACD_CH);
  57. // adc_value返回的值范围 0 -> 4096
  58. // 等同于P05引脚的电压值和Vref的占比 1024
  59. // X = ADC_V * Vref / 4096
  60. // 计算电压
  61. rst_V = adc_value * 2.5 / 4096;
  62. // 计算电阻值
  63. rst_R = rst_V * 10 / (3.3 - rst_V);
  64. // 9.36KΩ 将阻值兑换成温度
  65. rst_T = search_temp(rst_R * 100) - 55;
  66. printf("ADC: %d voltage: %.2f R = %.2f T = %d℃ \n", adc_value, rst_V, rst_R, (int)rst_T);
  67. return rst_T;
  68. }

main函数中:

  1. int rst_T;
  2. NTC_init();
  3. rst_T = NTC_get_temperature();
  4. printf("温度:%d \n", rst_T);