跳到主要内容

【ADC 转换】NTC 热敏电阻测温

下载例程代码: 下载代码

注意

请一定按照 例程使用方法 🔗 导入例程,否则下载的可能不是例程而是其他工程。

热敏电阻简介

通过 ADC 转换器,读取 NTC 热敏电阻的电压,实现温度测量

套件 NTC 热敏传感器主要参数:

参数
常温电阻10KΩ (25℃)
B 值3950
精度± 1%
工作温度-20 ~ 105 ℃
热时间常数≤ 12 s

如何使用例程

下载程序,并连接硬件,即可看到效果

硬件连接

  • 将配套的 NTC 热敏线插到学习板
NTC线
  • 使用配套 TYPE-C 数据线,将学习板连接到计算机
连接usb线

程序效果

  • 打开 小智精灵 串口助手 在线串口调试助手,点击“选择串口”,选择 USB Single Serial,即可收到 ADC 转换结果,如图所示
串口数据

例程讲解

下面介绍了如何自己实现该例程的功能

1、工程配置

  • 打开 ADC1:在 Pinout&Configuration 页面,将 PA4 设置为 ADC1_IN4

  • 配置 ADC:在 Pinout&Configuration -> Analog -> ADC1 -> Configuration 中

    • ADC_Settings -> Continuous Conversion Mode 设为 Enable,使 ADC 转换持续进行,不用每次手动触发

    • ADC_Regular_ConversionMode -> Rank -> Sampling Time 设为 239.5 Cycles,最长采样时间,可以获得更稳定的转换结果

      采样时间越长,转换结果越准确

  • 打开串口 2 外设: Pinout&Configuration -> Connectivity -> USART2,将 Mode 选择为 Asynchronous

  • 启用 float 打印: 在 cubeIDE 菜单栏中,Project Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU Settings,勾选 Use float with printf ... -nano

    默认情况下,sprintf 函数不能打印小数。因此我们需要配置一下编译器,使其能够打印小数

2、代码

(1) 初始化过程

  • 引用头文件: 需要使用 sprintf 打印输出,以及数学函数,在 main.c 引用头文件:
#include "stdio.h"
#include "string.h"
#include "math.h"
  • 启动连续 ADC 转换
// 启动连续ADC转换
HAL_ADC_Start(&hadc1);
// 等待ADC稳定
HAL_Delay(500);

(2) 温度计算

  • 通过 ADC 值计算 NTC 电阻值
    • adc_value 输入 ADC 结果,范围 0 - 4095
    • return 返回 NTC 电阻值,浮点数类型,单位 Ω
float ADC2Resistance(uint32_t adc_value) {
return (adc_value / (4095.0f - adc_value)) * 10000.0f;
}
  • 通过 NTC 阻值计算温度
    • R1 NTC 电阻值
    • return 返回温度,float 类型,单位摄氏度
float resistance2Temperature(float R1) {
float B = 3950.0f;
float R2 = 10000.0f;
float T2 = 25.0f;
return (1.0 / ((1.0 / B) * log(R1 / R2) + (1.0 / (T2 + 273.15))) - 273.15);
}

故障排除

工程建立和配置