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 
相关推荐
代码游侠3 小时前
复习——ARM Cortex-A 裸机开发深度解析
arm开发·笔记·嵌入式硬件·学习·架构
清风6666663 小时前
基于单片机的燃气热水器智能控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
youcans_4 小时前
【动手学STM32G4】(2)STM32G431之外部中断—按键控制
stm32·单片机·嵌入式硬件·外部中断
Smart-佀5 小时前
FPGA入门:CAN总线原理与Verilog代码详解
单片机·嵌入式硬件·物联网·算法·fpga开发
与光同尘 大道至简5 小时前
ESP32 小智 AI 机器人入门教程从原理到实现(自己云端部署)
人工智能·python·单片机·机器人·github·人机交互·visual studio
老李的森林6 小时前
嵌入式开发--无刷电机FOC控制--用定时器事件驱动ADC采样
stm32·单片机·嵌入式硬件·foc·无刷电机
一路往蓝-Anbo6 小时前
【第42期】调试进阶(一):IDE中的Register与Memory窗口
c语言·开发语言·ide·stm32·单片机·嵌入式硬件
boneStudent6 小时前
STM32工业HMI控制系统
stm32·单片机·嵌入式硬件
广药门徒6 小时前
嵌入式存储芯片驱动解析:标准化接口与STM32 FMC配置指南
stm32·单片机·嵌入式硬件