基于 STM32F103C8T6 的 NTC 热敏电阻(B3950 / R25=10KΩ)温度检测方案,结合分压电路、ADC 采样、Steinhart-Hart 公式与 OLED 显示,构建完整的嵌入式温度采集演示。
NTC(Negative Temperature Coefficient)热敏电阻是一种负温度系数半导体器件,其阻值随温度升高而呈指数级下降。本次演示采用的是 B3950 型号,在 25℃ 时标准阻值为 10KΩ。
NTC 热敏电阻由金属氧化物半导体材料烧结而成。当环境温度上升时,材料内部载流子浓度增大,电阻随之减小;温度下降则电阻增大。通过测量电阻两端电压即可反推温度。
NTC 电阻与温度的关系可用 B 值方程近似:
1 / T = 1 / T₂₅ + (1 / B) · ln(R / R₂₅)
其中 T 为开尔文温度,T₂₅=298.15K (25℃),R 为当前阻值,R₂₅ 为 25℃ 时的标准阻值,B 即 B3950。
STM32 的 ADC 无法直接测量电阻,因此采用经典的分压电路:
VPA0 = 3.3V × Rntc / (Rntc + R1)
其中 R1 为 10KΩ 精密参考电阻,Rntc 为 NTC 当前阻值;通过反推即可得到 Rntc:
Rntc = (3.3V − VPA0) × R1 / VPA0
Temp:%.1f℃以下为本次演示所选用的 NTC 热敏电阻模组实物。模块内部均为 NTC 探头 + 引线 + XH2.0 接头,根据应用场景不同可分为三种安装形态。



演示模块原理图与 PCB 封装展示。模块仅包含一颗 NTC 热敏电阻与一颗 10KΩ 参考电阻,构成最基本的分压式温度采集电路,通过 2 脚 XH 接口输出到主控板。
| XH1 引脚 | 模块信号 | 主控连接 | 说明 |
|---|---|---|---|
1 |
GND |
主控板 GND |
分压电阻 R1 接地端,参考地 |
2 |
ADC 输入 |
PA0(ADC1_IN0) |
分压中点,NTC 与 R1 之间 |
※ 主控板 3.3V 由板载 LDO 提供;NTC 另一端在板内与 XH1-2 同点引出,10KΩ 上拉参考电阻 R1 接 3.3V。
演示程序基于 HAL 库编写,核心由 ADC 单次采集 + 50 次滑动平均滤波 + Steinhart-Hart 公式计算 + OLED 显示组成。下面给出关键代码片段与对应的程序流程图。
/* USER CODE BEGIN PD */ #define T25 298.15f // 25℃ 下的开尔文温度 #define R25 10 // NTC 在 25℃ 时的阻值 (KΩ) #define B 3950 // 热敏电阻 B 值 /* USER CODE END PD */
hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; sConfig.Channel = ADC_CHANNEL_0; // PA0 sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
while (1) { if (HAL_GetTick() - Time_Now >= 10) // 每 10ms 进入一次 { // 单次 ADC 采集 HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 999) == HAL_OK) ad_val = HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); // 滑动平均(50 次) if (CNT < 50) { Total += ad_val; CNT++; } else { // 每 500ms 计算一次 Voltage = (Total/50.0)/4095.0 * 3.3; Rntc = (3.3 - Voltage) * 10 / Voltage; temp = 1.0f / (1.0f/T25 - (log(R25)-log(Rntc)) / B) - 273.15f; CNT = 0; Total = 0; } OLED_Clear(); OLED_CenterPrintf(24, "Temp:%.1f℃", temp); OLED_Update(); Time_Now = HAL_GetTick(); } }
所有连线均为水平 / 垂直(横平竖直),从上到下展示主循环的执行过程。
通过拖动温度滑块,模拟 NTC 温度变化对 PA0 电压、ADC 数字量以及计算所得温度的影响;同时演示 50 次滑动平均采样的过程。
3.3V 电源 → NTC → PA0(ADC输入)→ R1(10K) → GND