



常用NTC





atk_ntc.h文件编写
#ifndef __ATK_NTC_H
#define __ATK_NTC_H
#include "stm32f1xx_hal.h"
// 光敏传感器 DO 引脚定义
#define ATK_NTC_DO_GPIO_PORT GPIOA
#define ATK_NTC_DO_GPIO_PIN GPIO_PIN_3
#define ATK_NTC_DO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
// 定义 ATK_NTC_DO 为引脚状态读取宏
#define ATK_NTC_DO HAL_GPIO_ReadPin(ATK_NTC_DO_GPIO_PORT, ATK_NTC_DO_GPIO_PIN)
//// ADC 通道定义
//#define ADC_ADCX_CHY ADC_CHANNEL_1
// 函数声明
void atk_ntc_init(void);
float atk_ntc_get_temp(uint16_t para);
#endif
atk_ntc.c文件编写
/******************************************
* @file atk_ntc.c
* @author 正点原子团队 (ALIENTEK)
* @version V1.0
* @date 2024-11-01
* @brief 热敏传感器 驱动代码
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
* @attention
*
* 实验平台: 正点原子 M48Z-M3最小系统板STM32F103版
* 在线视频: www.yuanzige.com
* 技术论坛: www.openedv.com
* 公司网址: www.alientek.com
* 购买地址: openedv.taobao.com
******************************************/
// 引入热敏传感器驱动头文件
#include "atk_ntc.h"
// 引入ADC驱动头文件(用于读取热敏传感器的ADC采样值)
#include "./BSP/ADC/adc.h"
// 引入数学库头文件(用于对数、除法等运算)
#include "math.h"
/**
* @brief 热敏传感器模块初始化函数
* @param 无
* @retval 无
*/
void atk_ntc_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
ATK_NTC_DO_GPIO_CLK_ENABLE(); /* DO时钟使能 */
gpio_init_struct.Pin = ATK_NTC_DO_GPIO_PIN; /* DO引脚 */
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
gpio_init_struct.Pull = GPIO_NOPULL; /* 无上拉 */
HAL_GPIO_Init(ATK_NTC_DO_GPIO_PORT, &gpio_init_struct); /* DO引脚初始化 */
adc_init(); /* 初始化ADC */
}
/******************************************
* 热敏电阻参数说明
* Ra: 热敏电阻在常温(25℃)下的标称阻值,此处为10KΩ
* Ta: 常温对应的开尔文温度,25℃ = (273.15 + 25)K
* Bx: 热敏电阻的B值(材料常数),此处为3950
* Ka: 摄氏温度与开尔文温度的转换基准(0℃ = 273.15K)
******************************************/
const float Ra = 10000.0f; // 25℃下热敏电阻的标称阻值(10KΩ)
const float Ta = (273.15f + 25.0f); // 25℃对应的开尔文温度
const float Bx = 3950.0f; // 热敏电阻的B值(材料常数)
const float Ka = 273.15f; // 开尔文温度与摄氏温度的偏移量
/******************************************
* @brief 热敏传感器模块初始化函数
* @param 无
* @retval 无
* @note 需根据硬件电路完成ADC引脚、时钟等初始化
******************************************/
// (注:原代码中初始化函数未完整展示,需补充ADC初始化等逻辑)
/******************************************
* @brief 计算温度值
* @param para: 温度采集对应ADC通道的采样值(已滤波)
* @retval 计算得到的温度值(单位:℃)
* @note 计算分为两步:
* 1. 根据ADC采样值计算热敏电阻当前阻值Rb
* 2. 根据B值公式将Rb转换为温度值
******************************************/
float atk_ntc_get_temp(uint16_t para)
{
float Rb; // 热敏电阻当前阻值
float temp; // 临时计算变量
float v1, v2; // 分压计算变量
// 1. 计算热敏电阻的分压电压
// para: ADC采样值(12位ADC,范围0~4095)
// 3.3f: 系统参考电压(单位:V)
v1 = (para * 3.3f / 4096.0f);
// 2. 计算上拉电阻(10KΩ)的分压电压
v2 = 3.3f - v1;
// 3. 根据分压公式计算热敏电阻当前阻值Rb
// 分压原理:v1/Rb = v2/10000 → Rb = v1 * 10000 / v2
Rb = v1 / (v2 / 10000.0f);
// 4. 应用B值公式计算温度(开尔文温度)
// B值公式:1/Tb = 1/Ta + (1/B) * ln(Ra/Rb)
temp = Ra / Rb; // 计算Ra/Rb
temp = log(temp); // 计算ln(Ra/Rb)
temp /= Bx; // 计算ln(Ra/Rb)/B
temp = (1.0f / Ta) - temp; // 计算1/Tb
temp = 1.0f / temp; // 计算Tb(开尔文温度)
// 5. 转换为摄氏温度(℃ = 开尔文温度 - 273.15)
temp -= Ka;
// 返回计算得到的温度值
return temp;
}
demo.c
#include "stm32f1xx_hal.h" // HAL库核心头文件
#include "stdint.h" // 定义 uint16_t 等类型
#include "stdio.h" // printf 声明
#include "atk_ntc.h" // 热敏传感器函数声明
#include "adc.h" // ADC 函数声明
#include "led.h" // LED0_TOGGLE 声明
#include "delay.h" // delay_ms 声明
void demo_run(void)
{
uint16_t adcx;
float temp;
atk_ntc_init(); /* 初始化热敏传感器 */
while (1)
{
/* 显示热敏电阻的ADC数值 */
adcx = adc_get_result_average(ADC_ADCX_CHY, 10); /* 获取ADC通道的转换值,10次 */
temp = (float)adcx * (3.3 / 4096); /* 获取计算后的带小数的实际电压值 */
printf("热敏电阻传感器A0模拟量:%d,电压值:%.2fV\r\n", adcx, temp); /* 打印A0处电压值 */
printf("NTC温度值:%.2f℃\r\n", atk_ntc_get_temp(adcx)); /* 打印温度值 */
/* 温度超过预设阈值时的操作 */
if(ATK_NTC_DO == GPIO_PIN_RESET)
{
printf("温度超过阈值!\r\n");
}else
{
printf("温度未超过阈值!\r\n");
}
printf("\r\n");
delay_ms(500);
LED0_TOGGLE();
}
}
实验现象,以及调动电位器查看指示灯状态

在ADC实验基础之上添加这几个文件以及一个demo.h文件,即可完成实验
光敏电阻则替换下面几个文件

atk_light.c
/**
* @param 无
* @retval 无
*/
#include "./BSP/ADC/adc.h"
#include "atk_light.h"
#include "stm32f1xx_hal_gpio.h" // GPIO_PIN_RESET 声明
void atk_light_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
ATK_LIGHT_DO_GPIO_CLK_ENABLE(); /* DO时钟使能 */
gpio_init_struct.Pin = ATK_LIGHT_DO_GPIO_PIN; /* DO引脚 */
gpio_init_struct.Mode = GPIO_MODE_INPUT; /* 输入 */
gpio_init_struct.Pull = GPIO_NOPULL; /* 无上拉下拉 */
HAL_GPIO_Init(ATK_LIGHT_DO_GPIO_PORT, &gpio_init_struct); /* DO引脚初始化 */
adc_init(); /* 初始化ADC */
}
/**
* @brief 读取光敏传感器值
* @param 无
* @retval 0~100: 0,最暗;100,最亮
*/
uint8_t atk_light_get_val(void)
{
uint32_t temp_val = 0;
temp_val = adc_get_result_average(ADC_ADCX_CHY, 10); /* 读取平均值 */
temp_val /= 40;
if (temp_val > 100)
temp_val = 100;
return (uint8_t)(100 - temp_val);
}
atk_light.h
/**
****************************************************************************************************
* @file adc.h
* @author 正点原子团队(ALIENTEK)
* @version V1.1
* @date 2020-04-23
* @brief ADC 驱动代码
* @license Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
****************************************************************************************************
* @attention
*
* 实验平台:正点原子 MiniSTM32 V4开发板
* 在线视频:www.yuanzige.com
* 技术论坛:www.openedv.com
* 公司网址:www.alientek.com
* 购买地址:openedv.taobao.com
*
* 修改说明
* V1.0 20200423
* 第一次发布
* V1.1 20200423
* 1,支持ADC单通道DMA采集
* 2,新增adc_dma_init和adc_dma_enable函数.
*
****************************************************************************************************
*/
#ifndef __ATK_LIGHT_H
#define __ATK_LIGHT_H
#include "stm32f1xx_hal.h"
// 光敏传感器 DO 引脚定义
#define ATK_LIGHT_DO_GPIO_PORT GPIOA
#define ATK_LIGHT_DO_GPIO_PIN GPIO_PIN_3
#define ATK_LIGHT_DO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
// 定义 ATK_LIGHT_DO 为引脚状态读取宏
#define ATK_LIGHT_DO HAL_GPIO_ReadPin(ATK_LIGHT_DO_GPIO_PORT, ATK_LIGHT_DO_GPIO_PIN)
//// ADC 通道定义
//#define ADC_ADCX_CHY ADC_CHANNEL_1
// 函数声明
void atk_light_init(void);
uint8_t atk_light_get_val(void);
#endif