热敏电阻温度传感器 · 演示

NTC 热敏电阻 温度采集演示

基于 STM32F103C8T6 的 NTC 热敏电阻(B3950 / R25=10KΩ)温度检测方案,结合分压电路、ADC 采样、Steinhart-Hart 公式与 OLED 显示,构建完整的嵌入式温度采集演示。

主控 STM32F103C8T6 B值 B3950 R25 10KΩ ADC 12-bit 显示 OLED
01

传感器原理Sensor Principle

NTC(Negative Temperature Coefficient)热敏电阻是一种负温度系数半导体器件,其阻值随温度升高而呈指数级下降。本次演示采用的是 B3950 型号,在 25℃ 时标准阻值为 10KΩ。

工作原理

NTC 热敏电阻由金属氧化物半导体材料烧结而成。当环境温度上升时,材料内部载流子浓度增大,电阻随之减小;温度下降则电阻增大。通过测量电阻两端电压即可反推温度。


B 值方程(Steinhart-Hart 简化)

NTC 电阻与温度的关系可用 B 值方程近似:

公式 · B 值方程 1 / T = 1 / T₂₅ + (1 / B) · ln(R / R₂₅)

其中 T 为开尔文温度,T₂₅=298.15K (25℃),R 为当前阻值,R₂₅ 为 25℃ 时的标准阻值,B 即 B3950。

关键参数

B 值
3950
K
R25
10
KΩ
T25
298.15
K

分压式温度采集电路

STM32 的 ADC 无法直接测量电阻,因此采用经典的分压电路:

分压公式 VPA0 = 3.3V × Rntc / (Rntc + R1)

其中 R1 为 10KΩ 精密参考电阻,Rntc 为 NTC 当前阻值;通过反推即可得到 Rntc:

反推 Rntc Rntc = (3.3V − VPA0) × R1 / VPA0

信号链路

  • Step 1温度变化 → NTC 阻值变化
  • Step 2Rntc 变化 → PA0 电压变化
  • Step 3ADC1_IN0 量化 → 12 位数字量 (0~4095)
  • Step 4数字量 → 电压 → 电阻 → 温度
  • Step 5OLED 居中显示 Temp:%.1f℃
02

传感器外观Sensor Appearance

以下为本次演示所选用的 NTC 热敏电阻模组实物。模块内部均为 NTC 探头 + 引线 + XH2.0 接头,根据应用场景不同可分为三种安装形态。

外观1 · 环形端子式
外观 1
环形端子式 · 螺丝固定,金属外壳,线长 ~1m
外观2 · 螺纹安装式
外观 2
螺纹安装式 · M6 螺牙,可穿孔嵌入被测体
外观3 · 不锈钢探针式
外观 3
不锈钢探针式 · 防水封装,可测液体温度
03

硬件电路Hardware Schematic & PCB

演示模块原理图与 PCB 封装展示。模块仅包含一颗 NTC 热敏电阻与一颗 10KΩ 参考电阻,构成最基本的分压式温度采集电路,通过 2 脚 XH 接口输出到主控板。

原理图
原理图 · NTC 与 R1(10K) 分压,XH1 接口
PCB 封装
PCB 封装 · R1(直插电阻)+ XH1(2P 弯针)

接线说明

XH1 引脚 模块信号 主控连接 说明
1 GND 主控板 GND 分压电阻 R1 接地端,参考地
2 ADC 输入 PA0(ADC1_IN0) 分压中点,NTC 与 R1 之间

※ 主控板 3.3V 由板载 LDO 提供;NTC 另一端在板内与 XH1-2 同点引出,10KΩ 上拉参考电阻 R1 接 3.3V。

04

程序分析Program Analysis

演示程序基于 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 */

② ADC 初始化(PA0 / ADC1_IN0)

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))

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();
    }
}

程序流程图(含 while(1) 主循环)

所有连线均为水平 / 垂直(横平竖直),从上到下展示主循环的执行过程。

系统启动 系统初始化 while (1) 主循环 10ms 节拍 ? 否 是 ADC 采集 采样次数 < 50 ? 是 累加采样值 否 温度计算 OLED 显示温度 更新时间戳 回到 while(1)
05

动画演示Live Simulation

通过拖动温度滑块,模拟 NTC 温度变化对 PA0 电压、ADC 数字量以及计算所得温度的影响;同时演示 50 次滑动平均采样的过程。

电路实时示意

3.3V 电源 → NTC → PA0(ADC输入)→ R1(10K) → GND

+3.3V NTC B3950 / 10KΩ PA0 ADC1_IN0 R1 10KΩ GND
25.0 ℃

实时数据

NTC 阻值 Rntc
10.00KΩ
PA0 电压
1.650V
ADC 数字量
2048/ 4095
计算温度
25.0℃
OLED 预览 · 0.96 寸 128×64
Temp: 25.0℃