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

相关文章

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta