资讯详情

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

传感器驱动红外搜索

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

在这里插入图片描述

本例将演示如何使用红外搜索传感器。当检测到方向障碍物信号时,电路继续输出低电平。

1.红外搜索传感器配置

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

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

传感器配置如下:

保存配置并生成代码。

2.红外传感器驱动

/* * 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__ */  

/* * 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; } 

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、红外寻迹传感器中断方式驱动实现

/* * 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__ */

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 */

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 */
}

程序运行结果:

标签: r2868传感器驱动电路n红外线传感器红外反射距离传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台