STM32F103C8T6 HC-SR04超声波模块——超声波障碍物测距(HAl库)

2024-05-25 16:04

本文主要是介绍STM32F103C8T6 HC-SR04超声波模块——超声波障碍物测距(HAl库),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

超声波障碍物测距

  • 一、HC-SR04超声波模块
    • (一)什么是HC-SR04?
    • (二)HC-SR04工作原理
    • (三)如何使用HC-SR04
    • (四)注意事项
  • 二、程序编写
    • (一)CubeMX配置
      • 1.芯片选择
      • 2.配置RCC、SYS、时钟树![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8e04c33ec7fe4fdbbd1a9ef7593e74d8.png)
      • 3.配置GPIO
      • 4.配置串口1
      • 5.配置定时器
      • 6.开启定时器中断
      • 7.设置路径、生成代码工程
    • (二)代码编写
  • 三、效果展示
  • 四、总结
  • 五、引用

使用的软硬件设备与应用:

  • 硬件:STM32F103C8T6、HC-SR04、LED灯
  • 软件:Keil5、CubeMX、串口助手

一、HC-SR04超声波模块

(一)什么是HC-SR04?

HC-SR04是一款常用的超声波测距模块,它能够通过发送超声波脉冲并接收其回波来测量物体与传感器之间的距离。这种模块广泛应用于机器人、智能小车、智能家居等领域,可以用于测量墙壁距离、障碍物距离、物品距离。

(二)HC-SR04工作原理

HC-SR04模块的工作原理是,通过IO口TRIG触发测距,给至少10us的高电平信号,模块自动发送8个40kHz的方波,并自动检测是否有信号返回。如果有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间即为超声波从发射到返回的时间。通过测量这个时间,可以计算出距离,公式为:测试距离 = (高电平时间 × 声速(340m/s)) / 2。

(三)如何使用HC-SR04

模块的电气连接通常包括四个引脚:VCC、Trig、Echo、GND。VCC和GND分别为正负电源引脚,Trig为触发引脚,Echo为回波引脚。在使用时,需要给Trig引脚发送一个10us以上的高电平信号,然后在Echo引脚等待高电平输出,当Echo引脚变为低电平时,读取定时器的值,即为此次测距的时间。

(四)注意事项

  • 不宜带电连接模块,如果要带电连接,则先让模块的GND端先连接,否则会影响模块工作。
  • 测距时,被测物体的面积不少于0.5平方米且要尽量平整,否则会影响测试结果。
  • HC-SR04模块的典型工作电压为5V,静态工作电流小于2mA,感应角度不大于15度,探测距离为2cm-400cm,精度可达0.3cm,存在一个2cm的盲区。2020版本的HC-SR04支持GPIO、UART和IIC三种模式接口,工作电压3-5.5V,测量范围2cm-450cm。

二、程序编写

(一)CubeMX配置

1.芯片选择

在这里插入图片描述

2.配置RCC、SYS、时钟树在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.配置GPIO

A1连接的是ECHO,B9为LED
在这里插入图片描述

4.配置串口1

在这里插入图片描述

5.配置定时器

在这里插入图片描述

6.开启定时器中断

在这里插入图片描述

7.设置路径、生成代码工程

在这里插入图片描述

(二)代码编写

main.c:

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2022 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "SR04.h"
#include "led.h"
/* 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_TIM2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){float distance = SR04_GetData();//HAL_Delay(1500);/* USER CODE END WHILE */// 根据距离计算闪烁频率uint32_t flashRate = CalculateFlashRate(distance);LED_Flash(flashRate); // 闪烁LED/* 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 */

SR04.h:

#ifndef __SR04_H
#define __SR04_H
#include "main.h"
#include "tim.h"
#include "stdio.h"#define TRIG_H  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET)
#define TRIG_L  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET)void delay_us(uint32_t us);
float SR04_GetData(void);#endif

SR04.c:

#include "SR04.h"
#include "stm32f1xx_hal.h" float distant;      //测量距离
uint32_t measure_Buf[3] = {0};   //存放定时器计数值的数组
uint8_t  measure_Cnt = 0;    //状态标志位
uint32_t high_time;   //超声波模块返回的高电平时间//===============================================读取距离
float SR04_GetData(void)
{switch (measure_Cnt){case 0:TRIG_H;delay_us(30);TRIG_L;measure_Cnt++;__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 启动输入捕获break;case 3:high_time = measure_Buf[1] - measure_Buf[0]; // 高电平时间printf("\r\n----高电平时间-%d-us----\r\n", high_time);float distance = (high_time * 0.034f) / 2; // 单位cmprintf("\r\n-检测距离为-%.2f-cm-\r\n", distance);measure_Cnt = 0; // 清空标志位TIM2->CNT = 0; // 清空计时器计数// 返回计算得到的距离值return distance;}return 0; // 如果没有测量完成,返回0或合适的默认值
}//===============================================us延时函数void delay_us(uint32_t us)//主频72M
{uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);while (delay--){;}
}//===============================================中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//
{if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2{switch(measure_Cnt){case 1:measure_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.__HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获measure_Cnt++;                                            break;              case 2:measure_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);measure_Cnt++;  }}}

led.h:

#ifndef __LED_H__
#define __LED_H__#include "stm32f1xx_hal.h"void LED_Init(void);
void LED_Flash(uint32_t period); 
uint32_t CalculateFlashRate(float distance);#endif // __LED_H__

led.c:

#include "led.h"#define LED_GPIO_Port       GPIOB
#define LED_Pin             GPIO_PIN_9void LED_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIOB时钟__HAL_RCC_GPIOB_CLK_ENABLE();// 配置GPIO Pin为推挽输出,无上拉电阻,低频率GPIO_InitStruct.Pin = LED_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
}void LED_Flash(uint32_t period) {// 切换LED状态HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);// 延时HAL_Delay(period);// 再次切换LED状态,完成一次闪烁HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}uint32_t CalculateFlashRate(float distance) {uint32_t flashRate;if (distance < 10.0f) {flashRate = 100; // 距离小于10厘米时,快速闪烁} else if (distance < 50.0f) {flashRate = 500; // 距离在10-50厘米之间时,中速闪烁} else {flashRate = 1000; // 距离大于50厘米时,慢速闪烁}return flashRate;
}

三、效果展示

在这里插入图片描述

HC-SR04

四、总结

本次实现了STM32F103C8T6微控制器和HC-SR04超声波测距模块的结合应用,并通过LED闪烁频率表现出来。通过CubeMX的图形化配置和Keil5的开发环境,项目简化了开发流程,提高了开发效率。此外,项目还提供了对超声波测距原理的深入理解,以及如何通过软件控制硬件来实现特定功能的方法。

五、引用

【嵌入式创客工坊】STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

这篇关于STM32F103C8T6 HC-SR04超声波模块——超声波障碍物测距(HAl库)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001968

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

C8T6超绝模块--EXTI

C8T6超绝模块–EXTI 大纲 控制流程结构体分析EXTI实现按键 具体案例 控制流程 这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析 结构体分析 typedef struct {uint32_t EXTI_Line; // 中断/事件线EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_

1、创建多模块的maven springboot项目

现在的java的项目都是多模块的,这次也跟个风。 目标:实现下述结构 项目AcedBoot, 子模块:         aced-api 对外提供接口,         aced-web 给前端提供接口,         aced-service 服务层,         aced-dao 数据底层,包含数据库mapper和实体类entity,         aced-commo

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板  MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮,都可以打开的New Project from a MCU/MPU对话框。

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

PrestaShop免费模块/插件/扩展/工具下载

PrestaShop免费模块/插件/扩展/工具下载 PrestaShop免费模块 适用于您的电子商务网站的PrestaShop模块 现有超过3,000个PrestaShop模块可帮助您自定义在线商店,增加流量,提高转化率并建立客户忠诚度。 使您的电子商务网站成功! 下载(超过142+之多的PrestaShop官网认证的免费模块) 标签PrestaShop免费, PrestaShop免费工