STM32F1与STM32CubeIDE编程实例-红外寻迹传感器驱动

2023-10-18 14:20

本文主要是介绍STM32F1与STM32CubeIDE编程实例-红外寻迹传感器驱动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

红外寻迹传感器驱动

红外寻迹传感器具有一对红外线发射管与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,输出接口会输出一个数字信号(低电平或高电平,取决于电路设计),有效范围一般为2~30CM。传感器主动红外反射探测,因此反射率和形状是探测距离的关键。其中黑色探测距离小,白色距离大;小面积物体距离小,大面积距离大。

在这里插入图片描述

本实例将演示如何使用红外寻迹传感器。本次使用到的传感器,在检测到检测方向障碍物信号时,电路持续输出低电平。

1、红外寻迹传感器配置

开发环境搭建、系统时钟配置、调试配置及串口配置,请参考:

  • STM32F1与STM32CubeIDE快速入门-开发环境搭建
  • STM32F1与STM32CubeIDE快速入门-GPIO概述与点亮LED
  • STM32F1与STM32CubeIDE快速入门-USART/UART串口通信

传感器配置如下:

在这里插入图片描述

保存配置并生成代码。

2、红外寻迹传感器驱动实现

1)基本定义

/** infrared_tracking_sensor.h**  Created on: Apr 23, 2022*      Author: jenson*/#ifndef __INFRARED_TRACKING_SENSOR_H__
#define __INFRARED_TRACKING_SENSOR_H__#include <stdio.h>
#include <stm32f1xx_hal.h>
#include "main.h"typedef struct {uint16_t id;GPIO_TypeDef *GPIOx;           // 总线端口uint16_t GPIO_Pin;             // 总线引脚
} infrared_tracking_sensor_t;/***@brief 红外寻迹传感器状态*@param sensor 开关对象*@return 当开关闭合时,返回1;否则,返回0*/
uint8_t infrared_tracking_sensor_check(infrared_tracking_sensor_t* sensor);#endif /* __INFRARED_TRACKING_SENSOR_H__ */

2)传感器状态检测

/** infrared_tracking_sensor.c**  Created on: Apr 23, 2022*      Author: jenson*/#include "infrared_tracking_sensor.h"uint8_t infrared_tracking_sensor_check(infrared_tracking_sensor_t *sensor) {// 读取传感器输出电平if (HAL_GPIO_ReadPin(sensor->GPIOx, sensor->GPIO_Pin) == GPIO_PIN_SET) {return 1;}return 0;
}

3)主程序

main.c文件中添加如下代码:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "infrared_tracking_sensor/infrared_tracking_sensor.h"
/* USER CODE END Includes *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
infrared_tracking_sensor_t sensor;
/* USER CODE END PV */int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */sensor.id = 1;sensor.GPIO_Pin = INFRARED_TRACKING_SENSOR_Pin;sensor.GPIOx = INFRARED_TRACKING_SENSOR_GPIO_Port;printf("****STM32CubeIDE:Infrared Tracking Sensor****\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if (infrared_tracking_sensor_check(&sensor)) {printf("sensor tracked black line\r\n");} else {printf("sensor tracked while line\r\n");}HAL_Delay(10);}/* USER CODE END 3 */
}

程序运行结果:

在这里插入图片描述

3、红外寻迹传感器中断方式配置

前面的驱动代码是基于循环轮询实现,比较耗CPU。可以通过外部中断方式来对传感器输出信号进行检测。关于外部中断使用,请参考:

  • STM32F1与STM32CubeIDE快速入门-中断、NVIC与EXTI概述
  • STM32F1与STM32CubeIDE快速入门-外部中断配置与功能实现

传感器的中断方式驱动配置如下:

在这里插入图片描述

在这里插入图片描述

保存配置并生成代码。

4、红外寻迹传感器中断方式驱动实现

1)基本定义

/** infrared_tracking_sensor.h**  Created on: Apr 23, 2022*      Author: jenson*/#ifndef __INFRARED_TRACKING_SENSOR_H__
#define __INFRARED_TRACKING_SENSOR_H__#include <stdio.h>
#include <stm32f1xx_hal.h>
#include "main.h"/**** @brief 红外寻迹感器中断回调函数* @param sensor_id 传感器编码*/
typedef void (*infrared_tracking_sensor_callback)(uint16_t sensor_id);typedef struct {uint16_t id;GPIO_TypeDef *GPIOx;           // 总线端口uint16_t GPIO_Pin;             // 总线引脚infrared_tracking_sensor_callback callback; // 中断服务回调
} infrared_tracking_sensor_t;#endif /* __INFRARED_TRACKING_SENSOR_H__ */

2)中断服务实现

stm32f1xx_it.c文件中添加如下代码:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "infrared_tracking_sensor/infrared_tracking_sensor.h"
/* USER CODE END Includes *//* USER CODE BEGIN EV */
extern infrared_tracking_sensor_t sensor;
/* USER CODE END EV *//* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin == sensor.GPIO_Pin){if(sensor.callback){sensor.callback(sensor.id);}}
}
/* USER CODE END 1 */

3)主程序

main.c文件中添加如下代码:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "infrared_tracking_sensor/infrared_tracking_sensor.h"
/* USER CODE END Includes *//* USER CODE BEGIN PV */
infrared_tracking_sensor_t sensor;
/* USER CODE END PV *//* USER CODE BEGIN PFP */
void on_infrared_tracking_sensor_callback(uint16_t sensor_id);
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void on_infrared_tracking_sensor_callback(uint16_t sensor_id){printf("sensor %d detected black line\r\n",sensor_id);
}
/* USER CODE END 0 */int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */sensor.id = 1;sensor.GPIO_Pin = INFRARED_TRACKING_SENSOR_Pin;sensor.GPIOx = INFRARED_TRACKING_SENSOR_GPIO_Port;sensor.callback = on_infrared_tracking_sensor_callback;printf("****STM32CubeIDE:Infrared Tracking Sensor****\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

程序运行结果:

在这里插入图片描述

这篇关于STM32F1与STM32CubeIDE编程实例-红外寻迹传感器驱动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233125

相关文章

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤