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

这篇具有很好参考价值的文章主要介绍了【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引脚可以配置多种工作模式。其内部结构图如图所示。
【STM32Cube】学习笔记(五):红外避障传感器

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引脚会变低电平。因模块是非接触式传感器,所以具有响应快,精度高等特点。被广泛运用于避障或者循迹等场合。
【STM32Cube】学习笔记(五):红外避障传感器

3.性能参数

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

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


二、硬件电路设计

1.模块内部电路

由于是已经封装好的模块,所以这部分了解即可。图中通过调节电位器的阻值来与LM393比较器做比较,从而达到调节测量距离的目的。
【STM32Cube】学习笔记(五):红外避障传感器

2.与单片机相连接电路

模块与单片机相连的电路也很简单,即将单片机的PB12引脚接到模块的OUT端口,模块VCC接3.3V,GND与单片机GND相连即可。
【STM32Cube】学习笔记(五):红外避障传感器


三、软件设计

1.CubeMX配置

(1)时钟配置
如下图分别为设置HSE(高速外部时钟)以及时钟树的配置。选定HSE之后芯片会自动选定两个引脚用来连接外部晶振,设置LSE之后配置时钟树,设置HCLK为72MHz(最高72MHz,也可以配置其他),其配置图如图所示。
【STM32Cube】学习笔记(五):红外避障传感器
【STM32Cube】学习笔记(五):红外避障传感器

(2)调试接口配置
如图所示,将调试接口设置的设置为SW模式,占用芯片两个引脚。
【STM32Cube】学习笔记(五):红外避障传感器

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

(4)串口配置
为显示结果,用串口将转换结果传到电脑上,设置为异步模式,波特率为115200Bits/s,其UART配置如下图所示。设置完成之后会自动引出两个引脚用于串口通信。
【STM32Cube】学习笔记(五):红外避障传感器

(5)引脚使用情况
本次除了调试接口和外部震荡接口外,还有PC13代表LED灯,PB12连接红外避障传感器的OUT引脚,还有一组串口RX和TX。使用情况如下图所示。
【STM32Cube】学习笔记(五):红外避障传感器

(6)保存
在ProjectManager中设置如如图所示,设置集成开发环境为STM32CubeIDE。运用其他平台比如IAR,Keil也可以对应选择。
下图勾选生成外围.c.h文件,个人习惯,也可以不勾选让外围文件生成在main文件里。
【STM32Cube】学习笔记(五):红外避障传感器
【STM32Cube】学习笔记(五):红外避障传感器

2.CubeIDE代码

(1)GPIO相关HAL函数
GPIO函数很少,读者只要熟练掌握标红的三个函数即可,分别是写,读和翻转操作。本文用到读和写的功能。
【STM32Cube】学习笔记(五):红外避障传感器

(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读取一次。
【STM32Cube】学习笔记(五):红外避障传感器
(2)这是状态灯显示信息,可见,当未检测到物体或者距离不够时,模块和开发板上的灯都不亮。
【STM32Cube】学习笔记(五):红外避障传感器
(3)当距离达到检测距离时,模块和开发板上的灯都亮。
【STM32Cube】学习笔记(五):红外避障传感器


五、总结

本次设计了解了红外避障传感器的原理以及简单的功能实现,只是在达到测量距离时点亮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 */

【STM32Cube】学习笔记(五):红外避障传感器文章来源地址https://www.toymoban.com/news/detail-413982.html

到了这里,关于【STM32Cube】学习笔记(五):红外避障传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32f103入门(4)对射式红外传感器计次(外部中断)

    中断:在主程序运行过程中,出现了特定的中断触发条件 (中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序处理完成后又返回原来被暂停的位置继续运行 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中

    2024年02月11日
    浏览(31)
  • STM32学习笔记———几种简单传感器的数据读取

    传感器正如计算机的眼睛。从广义上讲,传感器就是一种能感知外界信息,并将这些信息按照一定规律转换成可用的电信号或其他形式的输出信号的装置,达到对信息的存储,传输,控制的目的。本文着重分析如何通过单片机分析电信号时序图实现对传感器的控制与传感器采

    2023年04月23日
    浏览(31)
  • STM32第五课:对射式红外线传感器计数和旋转编码器计数

    1.1 产品特性          使用ITR9606高灵敏度槽型光耦器件,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为5mm。传感器特设M3固定安装孔,调节方向与固定方便易用,使用宽电压LM393比较器,信号干净,波形好,驱动能力强,超过15mA。广泛用于电机转速检测,

    2024年02月20日
    浏览(27)
  • 【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

    led.h led.c key.h key.c main.c 电路图: 实物图: buzzer.h buzzere.c lightsensor.h lightsensor.cpp main.c 04-Key控制LED.rar 05-光敏传感器控制蜂鸣器.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年04月23日
    浏览(42)
  • STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(35)
  • STM32 F103C8T6学习笔记13:IIC通信—AHT10温湿度传感器模块

    今日学习一下这款AHT10 温湿度传感器模块,给我的OLED手环添加上测温湿度的功能。 文章提供源码、测试工程下载、测试效果图。 目录 AHT10温湿度传感器: 特性: 连接方式: 适用场所范围: 程序设计: 设计目标:  程序设计注意点: AHT10代码:  主函数代码: 测试效果:

    2024年02月11日
    浏览(32)
  • STM32学习记录——光敏传感器的使用

    文章目录 前言 一、学习目的 二、模块介绍 三、代码记录 总结        只做 学习记录 ,记录自己如何从零学会使用一个模块,仅仅只是会用,缺乏专业知识。如果需要了解更多原理,可以从我推荐的技术大佬的文章中获取。        我的学习目的就是通过STM32的ADC功能,学

    2024年02月07日
    浏览(50)
  • STM32学习记录——烟雾传感器的使用

    文章目录 前言 一、学习目的 二、模块介绍 三、代码记录 总结        这次记录一下烟雾传感器的学习,由于烟雾传感器的资料比较杂,算法比较多,对我来说也比较难,所以我的代码中算法部分是不太具有参考价值,但是也可以做到随烟雾浓度的变化数值呈线性相关,以

    2024年02月09日
    浏览(28)
  • HX711压力传感器学习(STM32)

    目录 原理图:​ 引脚介绍: HX711介绍工作原理: 程序讲解: 整套工程: VCC和GND引脚分别为HX711芯片的电源输入端口。 VCC引脚是连接到5V或3.3V的正电源,GND引脚是连接到地的负电源。 DOUT是HX711芯片的数据输出端口,它输出经过A/D转换处理后的24位数据。 SCK是HX711芯片的时钟输

    2024年02月05日
    浏览(43)
  • STM32学习记录——声音传感器的使用

    文章目录 前言 一、学习目的 二、模块介绍 三、代码记录 今天记录的是声音传感器模块的学习        我的学习目的是学会使用声音传感器模块,并通过检测声音的有无控制LED的亮灭。我使用的是STM32F103C8T6核心板上的自带LED,引脚是PC13。        我用的是上图所示的声音传

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包