问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于STM32的光电红外传感器应用详解

创作时间:
作者:
@小白创作中心

基于STM32的光电红外传感器应用详解

引用
CSDN
1.
https://blog.csdn.net/qq_44016222/article/details/141785259

光电红外传感器是一种常见的传感器,广泛应用于机器人避障、避障小车、流水线计数及黑白线循迹等场合。本文将详细介绍光电红外传感器的工作原理,并基于STM32F103C8T6微控制器进行编程实现。

一、传感器介绍

光电传感器对环境光线适应能力强,其具有一对红外线发射与接收管。发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收。经过比较器电路处理之后,指示灯会亮起,同时信号输出接口输出数字信号(一个低电平信号)。具有干扰小、便于装配、使用方便等特点。

以下是光电红外传感器的主要参数:

  • 工作电压:3.3~5V
  • 阈值调节:电位器调节
  • 尺寸:15mm×31mm
  • 输出方式:数字量(DO)
  • 检测距离:2~30cm

二、传感器原理

1. 原理图

使用模块在读取接收信号达不到设定阈值时,DO口输出高电平,当超过设定阈值时,模块DO输出低电平。

2. 引脚描述

引脚名称
描述
VCC
供给电压3~5V
GND
地线
DO
开关信号

三、程序设计

本实验使用STM32F103C8T6读取光电传感器采集的数据,通过串口发送至电脑,并将读取得到的数据同时在OLED上显示。具体硬件连接如下:

  • 光电传感器:PA0
  • OLED_SCL:PB11
  • OLED_SDA:PB10
  • 串口:串口1

main.c文件

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "HW.h"
#include "adcx.h"

u16 value;

int main(void)
{
    SystemInit(); //配置系统时钟为72M
    delay_init(72);
    LED_Init();
    LED_On();
    HW_Init();
    USART1_Config(); //串口初始化

    OLED_Init();
    printf("Start \n");
    delay_ms(1000);

    OLED_Clear();
    //显示“检测:”
    OLED_ShowChinese(0, 0, 8, 16, 1);
    OLED_ShowChinese(16, 0, 9, 16, 1);
    OLED_ShowChar(40, 0, ':', 16, 1);

    while (1)
    {
        LED_Toggle();
        value = HW_GetData();
        printf("检测: %d\r\n", value);
        OLED_ShowNum(60, 0, value, 1, 16, 1);

        delay_ms(200);
    }
}

HW.h文件

#ifndef __HW_H
#define __HW_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"

// HW GPIO宏定义
#define HW_GPIO_CLK RCC_APB2Periph_GPIOA
#define HW_GPIO_PORT GPIOA
#define HW_GPIO_PIN GPIO_Pin_0

void HW_Init(void);
uint16_t HW_GetData(void);
#endif /* __ADC_H */

HW.c文件

#include "HW.h"

void HW_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(HW_GPIO_CLK, ENABLE); // 打开连接 传感器DO 的单片机引脚端口时钟
    GPIO_InitStructure.GPIO_Pin = HW_GPIO_PIN; // 配置连接 传感器DO 的单片机引脚模式
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入

    GPIO_Init(HW_GPIO_PORT, &GPIO_InitStructure); // 初始化
}

uint16_t HW_GetData(void)
{
    uint16_t tempData;
    tempData = !GPIO_ReadInputDataBit(HW_GPIO_PORT, HW_GPIO_PIN);
    return tempData;
}

四、实验效果

由于原文中缺少具体的实验效果描述,这里仅提供程序框架和代码实现。实际应用中,可以通过串口监视器观察传感器检测到障碍物时的输出变化,并在OLED显示屏上实时显示检测数据。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号