【STM32Cube】学习笔记(五):红外避障传感器


摘要

本篇文章用STM32CubeMX和STM32CubeIDE软件编程,主控芯片为STM32F103C8T6驱动红外避障传感器,通过红外避障传感器输出的电平来改变LED灯的状态,并且通过串口打印出红外避障传感器的状态信息。由于本次设计采用已设计好的红外避障模块,所以相对来说编程比较容易,只要知道红外避障传感器的原理和功能即可。通过本文可以学会红外避障传感器的原理以及使用和操作GPIO相关功能。

所用工具:

1、芯片: STM32F103C8T6

2、驱动设备:红外避障传感器

3、配置软件:STM32CubeMX

4、IDE: STM32CubeIDE

知识概括:

通过本篇文章您将学到:

1、红外避障传感器工作原理

2、GPIO相关操作与功能


一、简介

1.GPIO简介

STM32F1系列MCU一般有多个GPIO(General Purpose Input-Output)端口,每个端口由16个引脚,作为GPIO引脚使用时,我们可以输入或输出数字信号。STM32F103C8芯片有3个16引脚的GPIO端口,从PA到PC,这些GPIO端口都连接在AHB1总线上,最高时钟频率为72MHz,GPIO引脚能承受5V电压。每个引脚的输入输出数据可以单独设置。其内部有双向保护二极管,有可配置是否使用的上拉和下拉电阻,每个GPIO引脚可以配置多种工作模式。其内部结构图如图所示。
在这里插入图片描述

GPIO工作模式
1、作为GPIO输入
(1)输入浮空(Input floating),并且不使用上拉或下拉。
(2)输入上拉(Input pull-up),使用内部上拉电阻,引脚外部无输入时读取的引脚输入电平为高电平。
(3)输入下拉(Input pull-down),使用内部下拉电阻,引脚外部无输入时读取的引脚输入电平为低电平。

2、作为GPIO输出
(1)具有上拉或下拉的开漏输出(Output open-drain)。如果没有上拉或下拉,开漏输出1时引脚是高阻态,输出0时引脚是低电平,这种模式可用于共用总线的信号。
(2)具有上拉或下拉的推挽输出(Output push-pull)。如果没有上拉或下拉,推挽输出1时引脚为高电平,输出0时引脚为低电平。若需要增强引脚输出驱动能力,就可以使用上拉。

3、作为ADC或DAC引脚
(1)模拟(Analog 功能),作为GPIO模拟引脚,用于ADC输入或DAC输出引脚。

4、作为复用功能引脚
(1)具有上拉或下拉的复用功能推挽(Alternate function push-pull)
(2)具有上拉或下拉的复用功能开漏(Alternate function open-drain)

每个GPIO端口有4个32位寄存器,用于配置GPIO引脚的工作模式,1个32位输入数据寄存器和1个32位输出寄存器,还有复用功能选择寄存器等,所有未进行任何配置的GPIO引脚,在系统复位后处于输入浮空模式。

2.红外避障传感器

红外避障传感器,又叫红外对管传感器,即有两个红外管,分别是发送管和接收管,特点是对环境光线的适应能力强,干扰较小,便于安装等。红外避障传感器由一对红外光线发射管与红外光线接收管、传感器电路组成,引脚上有VCC、GND、OUT三个引脚。其工作原理是红外光线发射管发射红外光线,红外光线接收管接收红外光线,当没有接收到返回的红外光线时,OUT引脚输出高电平,当接收到返回的红外光线时,OUT引脚输出低电平。
图中的蓝色器件为传感器的检测距离调节器,所以当我们需要改变测量距离是只需要改变调节器的旋钮即可。该调节器可以调节传感器的检测距离,对于白色的物体,反射的最远距离最大,黑色物体,反射的最远距离最小,面积大的物体所能探测的距离达,面积小的物体所能探测的距离小。最短检测距离是2cm,最长检测距离可以达到20cm,工作电压较低,同时可以检测偏移角40°的物体。当传感器模块检测到障碍物或者有物体靠近时,其模块的绿色灯会亮起,同时OUT引脚会变低电平。因模块是非接触式传感器,所以具有响应快,精度高等特点。被广泛运用于避障或者循迹等场合。
在这里插入图片描述

3.性能参数

工作电压:3.3V-5V
工作电流:≥20mA
工作温度:-10℃到+50℃
检测距离:2-20cm
输出信号:接收到光线输出低电平,没有接收到光线输出高电平

附:传感器模块输出端口OUT可直接与IO口相连接,也可以直接驱动一个5V继电器。


二、硬件电路设计

1.模块内部电路

由于是已经封装好的模块,所以这部分了解即可。图中通过调节电位器的阻值来与LM393比较器做比较,从而达到调节测量距离的目的。
在这里插入图片描述

2.与单片机相连接电路

模块与单片机相连的电路也很简单,即将单片机的PB12引脚接到模块的OUT端口,模块VCC接3.3V,GND与单片机GND相连即可。
在这里插入图片描述


三、软件设计

1.CubeMX配置

(1)时钟配置
如下图分别为设置HSE(高速外部时钟)以及时钟树的配置。选定HSE之后芯片会自动选定两个引脚用来连接外部晶振,设置LSE之后配置时钟树,设置HCLK为72MHz(最高72MHz,也可以配置其他),其配置图如图所示。
在这里插入图片描述
在这里插入图片描述

(2)调试接口配置
如图所示,将调试接口设置的设置为SW模式,占用芯片两个引脚。
在这里插入图片描述

(3)GPIO配置
如图,在CubeMX中芯片的引脚中点击鼠标左键可以给引脚设置功能。这里将PC13设置为输出模式,PB12设置为输入模式。
在这里插入图片描述
在这里插入图片描述
在输出配置中有GPIO输出电平,输出模式,上拉下拉,最高输出速率。由原理图可知LED灯的输出电平设置为低时则接上就会亮,将GPIO模式设置为推挽模式,LED的最高输出速率无要求。
在这里插入图片描述
在GPIO工作模式设置中按如图所示设置,其中红外避障传感器OUT引脚PB12配置为输入模式之后需要设置上拉与下拉,这里设置未上拉模式。
在这里插入图片描述

(4)串口配置
为显示结果,用串口将转换结果传到电脑上,设置为异步模式,波特率为115200Bits/s,其UART配置如下图所示。设置完成之后会自动引出两个引脚用于串口通信。
在这里插入图片描述

(5)引脚使用情况
本次除了调试接口和外部震荡接口外,还有PC13代表LED灯,PB12连接红外避障传感器的OUT引脚,还有一组串口RX和TX。使用情况如下图所示。
在这里插入图片描述

(6)保存
在ProjectManager中设置如如图所示,设置集成开发环境为STM32CubeIDE。运用其他平台比如IAR,Keil也可以对应选择。
下图勾选生成外围.c.h文件,个人习惯,也可以不勾选让外围文件生成在main文件里。
在这里插入图片描述
在这里插入图片描述

2.CubeIDE代码

(1)GPIO相关HAL函数
GPIO函数很少,读者只要熟练掌握标红的三个函数即可,分别是写,读和翻转操作。本文用到读和写的功能。
在这里插入图片描述

(2)代码
思路:红外避障模块是直接封装好的,会直接在OUT引脚输出信号,所以只要将单片机PB12引脚设置为输入取接收模块的信号即可,通过引脚接受的状态取获取传感器检测物体信息。
功能:当红外避障传感器检测到物体存在时,PC13会亮并且串口会发送已检测信号,当红外避障传感器未检测到物体存在时,PC13会灭并且串口会发送未检测信号。
位置:位于/* USER CODE BEGIN WHILE */沙箱内。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET)        //当检测到红外避障传感器OUT引脚(PB12)为低电平,即检测到物体
	  {
		  uint8_t Str1[] = "Already Detected!\r\n";
		  HAL_UART_Transmit(&huart1, Str1, sizeof(Str1), 200);          //串口轮询打印已检测

		  HAL_Delay(50);                                                //延时50ms

		  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);        //LED灯(PC13)设置为低电平,即亮

	  }
	  else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET)     //当检测到红外避障传感器OUT引脚(PB12)为高低电平,即未检测到物体
	  {
		  uint8_t Str2[] = "Not Detected!\r\n";
		  HAL_UART_Transmit(&huart1, Str2, sizeof(Str2), 200);          //串口轮询打印未检测

		  HAL_Delay(50);                                                //延时50ms

		  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);        //LED灯(PC13)设置为高电平,即灭

	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

四、结果显示

(1)这是串口所接收到的传感器状态信息,每20ms读取一次。
在这里插入图片描述
(2)这是状态灯显示信息,可见,当未检测到物体或者距离不够时,模块和开发板上的灯都不亮。
在这里插入图片描述
(3)当距离达到检测距离时,模块和开发板上的灯都亮。
在这里插入图片描述


五、总结

本次设计了解了红外避障传感器的原理以及简单的功能实现,只是在达到测量距离时点亮LED灯以及串口发送数据。在本次设计中,红外传感器看做是输入,LED灯和串口看做是由输入所产生的状态所触发的不同动作,即输出。借由这个思想就可以借助红外避障传感器实现避障或者循迹等一系列的功能,即改变红外传感器的状态所触发的动作即可,比如驱动电机往哪转,打开蜂鸣器等等,根据不同应用场合添加不同功能。读者可以自己尝试不同的输出方式,体会红外传感器的方便。


附录

完整代码:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET)        //当检测到红外避障传感器OUT引脚(PB12)为低电平,即检测到物体
	  {
		  uint8_t Str1[] = "Already Detected!\r\n";
		  HAL_UART_Transmit(&huart1, Str1, sizeof(Str1), 200);          //串口轮询打印已检测

		  HAL_Delay(50);                                                //延时50ms

		  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);        //LED灯(PC13)设置为低电平,即亮

	  }
	  else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET)     //当检测到红外避障传感器OUT引脚(PB12)为高低电平,即未检测到物体
	  {
		  uint8_t Str2[] = "Not Detected!\r\n";
		  HAL_UART_Transmit(&huart1, Str2, sizeof(Str2), 200);          //串口轮询打印未检测

		  HAL_Delay(50);                                                //延时50ms

		  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);        //LED灯(PC13)设置为高电平,即灭

	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

在这里插入图片描述

  • 52
    点赞
  • 354
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32红外模拟实验是一种使用STM32微控制器进行红外通信的实验。在这个实验中,我们可以通过红外发射器和红外接收器实现通信的传输。 在实验中,首先需要连接STM32微控制器和红外发射器。通过编写程序,将要发送的数据转换为红外信号,并将信号发送到红外发射器,红外发射器会将信号转换为红外光线进行传输。接着,我们需要连接红外接收器和STM32微控制器。红外接收器会接收到红外光线并将其转换为电信号,然后通过STM32微控制器读取并解析这些信号。 通过这个实验,我们可以实现红外遥控的功能,例如控制电视、空调等设备。我们可以编写程序,将需要发送的红外编码写入STM32微控制器,当我们按下红外遥控器上的按钮时,STM32会将红外编码转换为红外信号并发送出去,然后红外接收器会接收到信号并传递给STM32微控制器,从而实现红外遥控的功能。 在实验中,我们还可以通过调整红外发射器和红外接收器之间的距离,来测试和验证红外通信的可靠性。通常情况下,红外通信的传输距离相对较短,所以我们需要将红外发射器和红外接收器放置在较为接近的距离上。 总的来说,STM32红外模拟实验是一种通过STM32微控制器来实现红外通信的实验,通过这个实验我们可以学习和掌握红外通信的原理和应用,并将其应用到各种控制设备的遥控中。这个实验对于深入了解STM32微控制器的应用以及理解红外通信技术是非常有帮助的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值