热敏电阻

NTC(Negative Temperature Coefficient)即负温度系数,是一种描述材料或元器件电阻值随温度变化的特性。具体来说,NTC指的是那些电阻值随温度升高降低的材料或元器件。

原理图

remdianzuyuanlitu

R6 上标注的 10kΩ 通常是指 NTC 热敏电阻在某个特定温度下(25℃)的标称电阻值

计算热敏电阻位置的电压值

电容器两端的电压与谁并联,就跟谁电压相等。

以上图为例:

vcc 处电压为 3.3V,NTC 处的电压为 ntc_V,那么 R20 处的电压就是 (3.3 - ntc_v)V,那么流过 R20 的电流 I = (3.3 - ntc_v) / 10

假设 ntc-v 为 1.3 则 2 / 10 000 = 0.0002 安,也就是说 经过 R20 的电流为 0.0002 安

同理,热敏电阻的电流 I = (ntc_V - 0) / 热敏电阻

又因为串联电路电流处处相等:(ntc_V / 热敏电阻) = (3.3 - ntc_v) / 10

所以:热敏电阻(KΩ) = ntc_V * 10 / (3.3 - ntc_V )

电路中明明有一条路是电容的支路,但为什么还是按照串联计算呢

电容器在上电瞬间的行为表现为短路,因为当电容器刚刚连接到电源时,两个板之间的电势差为零,而电势的变化速度非常快。由于电容器的特性,当电压为零时,根据欧姆定律,电流会变为无限大,因此形成了短路的表象。

然而,这种短路现象并不会持续很久,电容器内的电荷和电势会很快建立起来,电流会逐渐降低直至稳定。那么此时就会形成断路的情况,那么也就可以当作这条路不存在了。

STC8H

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
// NTC.h
#ifndef __NTC_H
#define __NTC_H

/*
函数声明
*/
// 热敏电阻初始化函数
void NTC_Init();

// 获取对应温度的函数
int NTC_GetTemperature();

#endif
=================================================================
// NTC.c
#include "NTC.h"
#include "GPIO.h"
#include "ADC.h"

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

// 设置热敏电阻要用到的引脚
void NIC_GPIO_Config(void) {
GPIO_InitTypeDef NIC_GPIO_Init; //结构定义
NIC_GPIO_Init.Pin = GPIO_Pin_4; //指定要初始化的IO,
// 指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
NIC_GPIO_Init.Mode = GPIO_HighZ;

GPIO_Inilize(GPIO_P0, &NIC_GPIO_Init);//初始化
}

// ADC 转换
void NIC_ADC_Config(void) {
ADC_InitTypeDef NIC_ADC_init;
// ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
NIC_ADC_init.ADC_SMPduty = 31;
// 设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
NIC_ADC_init.ADC_Speed = ADC_SPEED_2X1T;
// ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
NIC_ADC_init.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;
NIC_ADC_init.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
NIC_ADC_init.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3

ADC_Inilize(&NIC_ADC_init);

ADC_PowerControl(ENABLE);
}

// 热敏电阻初始化
void NTC_Init(void) {
NIC_GPIO_Config();
NIC_ADC_Config();
}

// 获取温度值
int NTC_GetTemperature() {
float ntc_V; // ADC 处的电压
float ntc_R; // ADC 处的电阻值
float ntc_100R; // 热敏电阻的电阻值 * 100
float diff; // 差值
float min // 最小差值
int i, index;
// 获取 ADC 采样数值
u16 adc_result = Get_ADCResult(ADC_CH12); //channel = 0~15

// 将采样的数值转换为电压值
ntc_V = adc_result * 2.5 / 4096;

// 根据电压求出电阻 电阻 = 电压 / 电流
// 串联电路电流处处相等下
ntc_R = ntc_V * 10 / ( 3.3 - ntc_V );

// 用热敏电阻处的电阻与对照表中的数据进行比对进而得出温度值
ntc_100R = 100 * ntc_R;
// 遍历数组,比较差值最小的,就是当前的温度
// 默认第一个元素插值最小
index = 0;
// 数组中存放是是(阻值 x 100)
// 默认数组中第一个元素的差值最小
min = temp_table[0] - ntc_100R > 0? temp_table[0] - ntc_100R : -(temp_table[0] - ntc_100R);
for(i = 0; i < sizeof(temp_table) / sizeof(u16); i++) {
// 得出当前阻值与对照表中阻止的差
diff = temp_table[i] - ntc_100R > 0? temp_table[i] - ntc_100R: -(temp_table[i] - ntc_100R);
// 获取差值最小的下标
if(diff < min) {
min = diff;
index = i;
}
}
return index - 55;
}
=========================================================================
// main.c
#include "STC8G_H_GPIO.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_Delay.h"
#include "STC8G_H_Switch.h"
#include "STC8G_H_ADC.h"
#include "NTC.h"

void UART_Config(void) {
// &gt;&gt;&gt; 记得添加 NVIC.c, UART.c, UART_Isr.c &lt;&lt;&lt;
COMx_InitDefine COMx_Init; //结构定义
//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_Init.UART_Mode = UART_8bit_BRTx;
//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_Init.UART_BRT_Use = BRT_Timer1;
COMx_Init.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_Init.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_Init.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
//初始化串口1 UART1,UART2,UART3,UART4
UART_Configuration(UART1, &amp;COMx_InitStructure);
//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
NVIC_UART1_Init(ENABLE,Priority_1);
// 引脚选择, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
UART1_SW(UART1_SW_P30_P31);
}

void main() {
int t; // 温度

EA = 1;
NTC_Init();
UART_Config();

while(1) {

// 得到温度值
t = NTC_GetTemperature();
printf("温度:%d\n", t);
}
}

配置

NTC.h 中的头尾是什么作用

1
2
3
4
5
6
7
#ifndef	__NTC_H

#define __NTC_H

// 头文件的内容...

#endif

‌#ifndef 在 C 语言中是“if not defined”的简写,属于宏定义的一种,用于条件编译。

  1. #ifndef __NTC_H:这是预处理指令 #ifndef(If Not Defined的缩写),用于检查宏 __NTC_H 是否尚未定义。如果 __NTC_H 没有被定义,那么编译器会执行 #ifndef 和紧接着的 #endif 之间的代码。这种机制用于确保头文件的内容只被包含一次。
  2. #define __NTC_H:这行代码定义了宏 __NTC_H。一旦这个宏被定义,后续的 #ifndef __NTC_H 检查就会失败,因为 __NTC_H 已经被定义了。这防止了头文件内容的重复包含。
  3. #endif:这表示 #ifndef#endif 之间的代码块的结束。