STM32-热敏传感器以及光敏传感器

常用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 
相关推荐
清风6666666 分钟前
基于单片机的64位多模式流水灯控制系统设计
单片机·毕业设计·课程设计·期末大作业
进击的横打14 分钟前
【车载开发系列】热敏电阻与上下拉电阻
单片机·嵌入式硬件
XINVRY-FPGA14 分钟前
XCKU035-2FBVA676I AMD Xilinx Kintex UltraScale FPGA
arm开发·嵌入式硬件·网络安全·fpga开发·硬件工程·信号处理·fpga
崇山峻岭之间1 小时前
单片机USB虚拟串口实验
单片机·嵌入式硬件
崇山峻岭之间1 小时前
单片机USB U盘实验
单片机·嵌入式硬件
点灯小铭1 小时前
基于单片机的锅炉压力与温度监测报警系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
环境倒逼我学习1 小时前
无人机地面站之第13章 Mission Planner 入门与界面总览
单片机·嵌入式硬件·无人机
大阳1232 小时前
ARM.8(ADC,SPI)
单片机·嵌入式硬件·adc·spi
hoiii1872 小时前
基于 STM32 的标准遥控器架构与源码
stm32·嵌入式硬件·架构
少年、潜行2 小时前
STM32 ISP 升级体验
stm32·嵌入式硬件·isp升级·系统编程区域