文章目录

  • 摘要
  • 一、简介
    • 1.GPIO简介
    • 2.红外避障传感器
    • 3.性能参数
  • 二、硬件电路设计
    • 1.模块内部电路
    • 2.与单片机相连接电路
  • 三、软件设计
    • 1.CubeMX配置
    • 2.CubeIDE代码
  • 四、结果显示
  • 五、总结
  • 附录

摘要

本篇文章用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);                                                //延时50msHAL_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);                                                //延时50msHAL_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);                                                //延时50msHAL_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);                                                //延时50msHAL_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】学习笔记(五):红外避障传感器相关推荐

  1. Python与硬件学习笔记:红外避障红外避障传感器

    红外避障传感器 红外避障传感器是专为轮式机器人设计的一款距离可调式避障传感器.其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收, ...

  2. 【STM32】标准库与HAL库对照学习教程外设篇--红外避障传感器

    [STM32]标准库与HAL库对照学习教程外设篇--红外避障传感器 一.前言 二.准备工作 三.红外避障传感器 1.传感器原理说明 2.传感器特性 四.标准库使用红外传感器 1.实验程序 2.实验效果 ...

  3. 树莓派python学习篇 (二)红外避障传感器

    一.红外避障传感器介绍 红外避障传感器是专为轮式机器人设计的一款距离可调式避障传感器.其具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收 ...

  4. Arduino实验三十一 红外避障传感器实验

    学习任务: 了解PCF8591数模转换传感器 组件: Arduion主板 红外避障传感器 杜邦线 面包板 USB数据线 下图是红外避障传感器 实验步骤: 1.建立电路 Arduion 红外避障传感器 ...

  5. 红外传感器_基于红外避障传感器控制无人机

    说明 红外避障传感器具有一对红外线发射与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收.它常用于安装在小车上,判断前方是否有障碍物.可通过电位器设置 ...

  6. 模块-E18-D80NK红外避障传感器

    E18-D80NK红外避障传感器使用说明书 简介: E18-D80NK-N这是一种集发射与接收于一体的光电传感器,发射光经过调制后发 出,接收头对反射光进行解调输出.有效的避免了可见光的干扰.透镜的使 ...

  7. E18-D80NK红外避障传感器使用(附32单片机源码)

    文章目录 一.E18-D80NK红外避障传感器介绍 简介: 电气特性: 机械特性: 使用原理 二.主程序代码 三.接线 总结 一.E18-D80NK红外避障传感器介绍 简介: E18-D80NK这是一 ...

  8. Ardunio开发实例-红外避障传感器

    红外避障传感器 IR障碍物传感器根据红外反射原理来检测障碍物,当没有物体时,红外接收器不接受信号:当前方有物体阻挡并反射红外光时,红外接收器将接收信号.本次使用的红外避障传感器如下: 1.硬件准备 A ...

  9. Arduino使用红外避障传感器

    本文介绍37款传感器套件中的红外避障传感器,它的原理其实和超声波测距类似,一个是发送.接收超声波,另外一个是发送.接收红外线.红外避障传感器的实物图如下所示: 它的左边包含一个红外发射装置和一个接收装 ...

最新文章

  1. 聊聊storm的stream的分流与合并
  2. 模板 - 最小斯坦纳树
  3. 【多线程】ThreadPoolExecutor 类的使用详解
  4. 从传递函数到差分方程的转换
  5. 树莓派该文件名_树莓派学习笔记(2):常用linux命令
  6. ElementUI介绍以及安装
  7. Boost.Python Tutorial
  8. 【Tools】Visual Studio 2017下载和安装
  9. 通过导入txt数据画出python turtle图形_【Python】txt文件读取绘画
  10. 机器学习入门:多变量线性回归
  11. PostgreSQL 12系统表(1)pg_class
  12. android文本与布局
  13. JMeter基础之组件的作用域与执行顺序
  14. OpenWRT in VirtualBox
  15. Bailian3754 字符环【字符串】
  16. PBOC规范研究之六、变长记录文件(转)
  17. Bejson上线 在线png、jpg图片转svg功能
  18. php获取客户端和服务器ip,PHP获取客户端和服务器IP地址
  19. 新能源汽车数据库-分类型/地区/级别月度销量2015-2021进出口数据
  20. 二维动态数组空间分配 c语言,科学网—C语言中动态二维数组的使用和分配 - 王一哲的博文...

热门文章

  1. 棋牌游戏 投资风险 政策_机会,风险和政策
  2. 【matlab】皮尔逊相关系数
  3. 开源免费可商用的商城源码
  4. 经纬度与度分秒之间的转换
  5. 精准送达目标客户——基于极光平台优化Android通知
  6. eyoucms flink 友情链接
  7. 美颜算法原理,推荐一个开源美颜算法工具
  8. PS精修教程:如何给后期人物进行精修
  9. 迅捷画图中思维导图模板怎样使用
  10. 期货市场价格发现功能的含义和特点是什么(如何理解期货市场具有价格发现经济功能)