FastBond4挑战部分-基于NTC热敏电阻设计单通道温度采集模块
该项目使用了NTC热敏电阻,实现了单通道温度采集模块的设计,它的主要功能为:使用单片机ADC采集NTC热敏电阻电压变化,计算当前温度值。
标签
模块
NTC
热敏电阻
FastBond4
CX反C
更新2026-04-10
10

一、所选主题和项目介绍

本次所选主题参加的是FastBond第四季中感知方向的工业自动化主题


在工业自动化控制系统中,环境与设备状态的数据采集是实现智能监测、稳定控制与安全预警的核心基础。各类运行参数的实时获取,直接决定了自动化系统的响应精度、决策可靠性以及设备整体运行寿命。而在众多关键参数中,温度采集无疑占据着最为重要的地位


无论是工控主板、驱动芯片、电源模块等核心电子器件的工作温度监测,还是车间环境、机柜内部、设备腔体等场景的环境温度感知,温度数据都直接关系到设备是否过热、运行是否异常、控制策略是否需要动态调整。一旦温度失控,轻则导致器件性能下降、测量漂移,重则引发停机、烧毁甚至安全事故,因此高精度、高稳定性的温度采集方案显得尤为必要。


基于这一工业实际需求,本次参加活动我带来的是一款基于 NTC 热敏电阻设计的单通道温度采集模块。NTC 热敏电阻具有灵敏度高、响应速度快、成本低廉、体积小巧等优势,非常适合嵌入式与工业场景下的单点温度检测。该模块通过优化硬件采样电路与信号处理逻辑,能够实现对目标点位温度的稳定采集与精准转换,可快速接入 PLC、单片机或工控主板等控制系统,为工业自动化设备提供可靠的温度反馈,适用于设备温控、环境监测、过热保护等多种实际应用场景。


二、硬件介绍

1.NTC热敏电阻

NTC 热敏电阻器 10k 磁珠

型号

GA10K4A1A

制造商

TE Connectivity Measurement Specialties

25°C 时欧姆阻值

10k

电阻容差

±0.1°C

B 值容差

±0.5%

B25/85

3694K

工作温度

-40°C ~ 125°C

2.线性低压差(LDO)稳压器

image.png

型号

ADP122AUJZ-3.3-R7

制造商

Analog Devices Inc.

电压 - 输入(最大值)

5.5V

电压 - 输出(最小值/固定)

3.3V

电流 - 输出

300mA

电流 - 静态 (Iq)

105 µA

工作温度

-40°C ~ 125°C

3.MCU微控制器

image.pngimage.png

型号

CH32V003F4P6

制造商

沁恒

内核

青稞 RISC-V2A 

主频

48MHz 

存储器

2KB+16KB

外设

1*10位ADC、1*USART、1*I2C、1*SPI、1*16 位高级定时器、1*16 位通用定时器

工作温度

-40°C ~ 125°C

三、方案框图和项目设计思路介绍

image.png

整体可分为供电单元通信单元主控单元温度采集单元四大模块


  • 1.供电单元
    • USB:作为模块的外部供电输入接口,提供5V直流电压,同时也是与上位机的数据通信链路载体。
    • LDO(ADP122AUJZ-3.3):属于低压差线性稳压器,将 USB 输入的5V电压稳压为3.3V,为主控芯片ch32V003和其他电路提供稳定的工作电压,保证模块低功耗、低噪声运行。
  • 2.通信单元
    • CH340:是 USB 转串口的桥接芯片,负责将 USB 的总线信号转换为串口(UART)信号,实现上位机与主控芯片ch32V003之间的双向数据通信,完成温度数据的上传和指令的下发。
  • 3.主控单元
    • ch32V003:是模块的核心控制芯片(基于 RISC-V 架构的单片机),主要承担两大功能:一是通过 ADC(模数转换) 接口采集温度采集单元的模拟电压信号,并将其转换为数字信号;二是通过串口与 CH340 交互,将处理后的温度数据发送至上位机。
  • 4.温度采集单元
    • 10K 电阻 + NTC(GA10K4A1A):采用分压电路设计,10K 固定电阻与 NTC 热敏电阻串联在 VCC 和 GND 之间,两者的分压节点连接至 ch32V003 的 ADC 引脚。NTC 热敏电阻的阻值会随温度变化,导致分压节点的电压发生改变,ch32V003 通过采集该电压值,结合 NTC 的阻值 - 温度特性曲线,即可计算出实际温度。

四、原理图和PCB展示及介绍

image.png

原理图

原理图共划分出七大功能电路模块,覆盖了供电、通信、主控、温度采集、辅助功能等核心环节,各模块分工明确且协同工作,以下是逐模块的详细解析:

1. USB 接口电路

  • 采用标准 USB Type-C 接口(USB_C_ReceptacleJS92.0_16P)作为供电输入数据通信的物理接口,提供5V电源输入,同时引出 USB_D+、USB_D - 差分信号用于数据传输。
  • 配置了CC引脚电阻(R1、R2),用于适配C to C数据线。

2. 5V 转 3.3V 电路

  • 核心器件为 LDO 芯片ADP122AUJZ-3.3,将 USB 输入的5V电压稳压为3.3V,为 MCU、NTC 采集电路等提供稳定的工作电压。
  • 设计有保险丝 F1(1A)实现过流保护,电容C1、 C2、C3、C4 组成滤波网络,降低稳压后的电压纹波;EN 引脚接地使芯片始终使能。

3. USB 转串口电路

  • 核心芯片为CH340,负责将 USB 的差分信号转换为 UART 串口信号(TX、RX),实现上位机与 MCU 之间的通信。
  • 滤波电容(C5、C6)为CH340提供3.3V电压适配,确保与主控电路电平适配

4. NTC 接口电路

  • 核心为 NTC 热敏电阻GA10K4A1A与 10K 固定电阻组成的分压电路,3.3V 电源经 10K 电阻后接 NTC 热敏电阻再到 GND,分压节点连接至 MCU 的 ADC 引脚(PC4/ADC_IN4)。
  • 温度变化会改变 NTC 阻值,进而改变分压节点的电压,MCU 通过采集该电压值计算实际温度。
  • 使用螺丝快捷接口,方便快速安装和更换NTC热敏电阻。

5. 电源指示灯电路

  • 由 LED 灯和 1K 限流电阻 R1 组成,一端接 3.3V 电源,另一端接地,模块上电后 LED 点亮,直观指示电源工作状态。

6. 单总线烧录电路

  • 采用排针接口,引出 MCU 的单总线烧录引脚(PD5/SWD),配合 3.3V 和 GND,实现对 ch32V003 芯片的程序烧录与调试。

7. MCU 电路

  • 核心为Ch32V003单片机,是模块的控制核心:通过 ADC 引脚采集 NTC 分压电压,完成模数转换和温度计算;通过 UART 串口与 CH340 通信,实现数据上传和指令接收;同时集成了烧录、IO 口等功能引脚,预留了扩展能力。
  • 配置了滤波电容(C7)稳定 MCU 供电,保证芯片运行可靠性。


此外,原理图还设计了M2 固定孔(H1、H2),用于模块的物理安装固定,整体电路兼顾了功能性、稳定性和实用性。


image.png

PCB


整体布局与版型特点

1.版型形态:采用矩形窄板设计,边缘做了圆角处理,适配小型设备 / 机柜的安装空间,同时标注了 M2 规格的固定孔位(图中圆形接地标识处),方便物理固定。

2.层叠与走线:PCB使用双面板设计,顶层与底层分工走线,减少信号交叉干扰;地采用大面积敷铜,提升供电稳定性与抗干扰能力。

3.器件排布:①核心器件(MCU、LDO、CH340、USB 接口)按数据及电源走向有序排列,遵循 “信号短路径” 原则,缩短关键信号走线长度;

NTC 采集接口布在下部,方便后续NTC热敏电阻的安装;

③电容靠近对于芯片的VCC和GND引脚,连线遵循先过电容再到引脚

4.接地设计:板卡上多处使用 “GND” 的圆形焊盘为接地节点,大面积地敷铜与各器件接地引脚相连,形成统一地平面,降低电磁干扰。


五、调试软件介绍

本次使用的是沁恒为CH32V003配备的MounRiver Studio (MRS2)集成开发环境


MounRiver Studio Ⅱ(简称 MRS2)是沁恒微电子推出的新一代免费嵌入式 IDE,基于 VSCode 框架深度定制,主打RISC-V(如 CH32V/CH32X 系列)与ARM(如 CH32F 系列)内核 MCU 开发,兼顾轻量化、高效性与国产化适配,是 CH32 系列芯片的首选开发环境。


、软件流程图和关键代码介绍


image.png

软件流程图

1. 系统上电初始化阶段

  1. 接入 USB 接口,5V供电输入,同时触发 CH340 与上位机建立通信连接;
  2. 5V电压输入 LDO 芯片 ADP122AUJZ-3.3,经稳压处理后输出稳定3.3V,为 ch32V003 主控芯片供电;
  3. ch32V003 完成上电复位,初始化 ADC 模数转换模块、UART 串口通信模块,设置采样参数(如 ADC 采样精度、串口波特率)。
// ========== 硬件参数 ==========
#define VREF           3.3f        // ADC 参考电压 (V)
#define ADC_MAX        1024.0f     // 10 位 ADC 最大值 (0-1023)
#define R_FIXED        10000.0f    // 固定电阻 10kΩ
#define R_NTC_25       10000.0f    // NTC 25°C 电阻值
#define B_VALUE        3694.0f     // B25/85 常数
#define T0_K           298.15f     // 25°C 开尔文温度

// ========== GPIO 初始化 ==========
void gpio_Init(void)
{
    // 使能 GPIOC 时钟(用于 PC4)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
   
    GPIO_InitTypeDef GPIO_InitStructure;
    // PC4 配置为模拟输入 (ADC)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}


// ========== ADC 初始化 ==========
void adc_Init(void)
{
    // 使能 ADC1 时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
   
    // ADC 结构体初始化
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;          // 独立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;               // 非扫描模式
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;         // 单次转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;      // 右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;                     // 规则组通道数
    ADC_Init(ADC1, &ADC_InitStructure);
   
    // 使能 ADC
    ADC_Cmd(ADC1, ENABLE);
   
    // 校准 ADC
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

2. 温度采集与信号转换阶段

  1. NTC 热敏电阻(GA10K4A1A)与 10K 固定电阻构成分压电路,实时感应环境温度;
  2. 温度变化导致 NTC 阻值改变,分压节点输出对应的模拟电压信号,传输至 ch32V003 的 ADC 引脚;
  3. ch32V003 按预设周期启动 ADC 采样,将模拟电压信号转换为数字量;
  4. 主控芯片调用 NTC 阻值 - 温度特性算法,将数字量换算为精准的温度数值。
// ========== 读取 ADC 值 (PC4 / ADC_IN2) ==========
uint16_t ADC_Read(void)
{
    // 配置规则组通道:ADC_Channel_2 (对应 PC4),采样时间 57 周期
    // 可选采样时间宏定义:
    // ADC_SampleTime_3Cycles, ADC_SampleTime_9Cycles, ADC_SampleTime_15Cycles,
    // ADC_SampleTime_30Cycles, ADC_SampleTime_43Cycles, ADC_SampleTime_57Cycles,
    // ADC_SampleTime_73Cycles, ADC_SampleTime_241Cycles
    ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_57Cycles);
   
    // 启动软件转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
   
    // 等待转换完成
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
   
    // 返回 ADC 转换结果 (0-1023)
    return ADC_GetConversionValue(ADC1);
}


// ========== 根据 NTC 电阻计算温度(B 参数方程)==========
float NTC_GetTemperature(float R_ntc)
{
    float T_k = 1.0f / (1.0f/T0_K + (1.0f/B_VALUE) * logf(R_ntc / R_NTC_25));
    return T_k - 273.15f;
}


        // 读取 ADC 值
        uint16_t adc_val = ADC_Read();
       
        // 计算 NTC 电压
        float V_ntc = (adc_val / ADC_MAX) * VREF;
       
        // 计算 NTC 电阻
        float R_ntc = V_ntc / (VREF - V_ntc) * R_FIXED;
       
        // 计算温度
        float temperature = NTC_GetTemperature(R_ntc);
       
        // 输出整数温度(四舍五入)
        int temp_int = (int)(temperature + 0.5f);


3. 数据传输与交互阶段

  1. 计算完成后,Ch32V003 通过 UART 串口将温度数据发送至 CH340 芯片;
  2. CH340 将串口信号转换为 USB 总线信号,通过 USB 接口上传至上位机;
  3. 上位机接收数据并实时显示(如数值、曲线);
  4. 指令经 USB→CH340→UART 传输至 Ch32V003,主控执行对应操作,完成闭环控制。
// 通过 printf 输出
printf("ADC=%d, Temp=%d C\r\n", adc_val, temp_int);


4. 持续运行与异常阶段

  1. 循环执行 “采集 - 转换 - 传输” 流程,实现温度实时监测;
  2. 断开 USB 供电后,系统断电停止工作,完成一次完整运行周期。


七、硬件功能展示及说明

image.png

image.png

串口实时打印当前NTC电压及环境温度

image.png

image.png

使用手指触摸NTC热敏电阻,模拟环境温度改变,并通过串口实时打印


八、所遇难题及心得体会

本次在选品中失误了一下,NTC热敏电阻的引出线为非绝缘的导线,导致在使用过程中需额外注意不要触碰到导线,导致数据读取错误,好在导线可塑性较好,不会轻易搭接。以后在选品时需检查仔细。

附件下载
CH32V003F4P.zip
代码工程文件
单通道NTC热敏电阻采集模块-2026-04-09_225915.zip
kicad文件
团队介绍
一个热爱嵌入式的个人爱好者
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号