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超聲波模塊實現測距

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15002.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15002.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15002.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024全新Langchain大模型AI應用與多智能體實戰開發

2024全新Langchain大模型AI應用與多智能體實戰開發 LangChain 就是一個 LLM 編程框架&#xff0c;你想開發一個基于 LLM 應用&#xff0c;需要什么組件它都有&#xff0c;直接使用就行&#xff1b;甚至針對常規的應用流程&#xff0c;它利用鏈(LangChain中Chain的由來)這個概念…

Facebook之魅:數字社交的體驗

在當今數字化時代&#xff0c;Facebook作為全球最大的社交平臺之一&#xff0c;承載著數十億用戶的社交需求和期待。它不僅僅是一個簡單的網站或應用程序&#xff0c;更是一個將世界各地的人們連接在一起的社交網絡&#xff0c;為用戶提供了豐富多彩、無與倫比的數字社交體驗。…

C++實現基礎二叉搜索樹(并不是AVL和紅黑樹)

本次實現的二叉搜索樹并不是AVL數和紅黑樹&#xff0c;只是了解流程和細節。 目錄 二叉搜索樹的概念K模型二叉搜索樹的實現二叉搜索樹的架構insert插入find 查找中序遍歷Inorder刪除earse替換法的思路情況一 &#xff1a;假如要刪除節點左邊是空的。在左邊時在右邊時 情況二&a…

文心智能體,零代碼構建情感表達大師智能體

前言 隨著智能體技術的突飛猛進&#xff0c;各行各業正迎來前所未有的變革與機遇。智能體&#xff0c;作為人工智能領域的重要分支&#xff0c;以其自主性、智能性和適應性&#xff0c;正逐步滲透到我們生活的每一個角落&#xff0c;成為推動社會進步和科技發展的新動力。 為了…

軟考 系統架構設計師系列知識點之雜項集萃(20)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;19&#xff09; 第28題 在單元測試中&#xff0c;&#xff08; &#xff09;。 A. 驅動模塊用來調用被測模塊&#xff0c;自頂向下的單元測試中不需要另外需要編寫驅動模塊 B. 樁模塊用來模擬被…

visual studio 2022 ssh 主機密鑰算法失敗問題解決

 Solution - aengusjiang 問題&#xff1a; I follow the document, then check sshd_config, uncomment“HostKey /etc/ssh/ssh_host_ecdsa_key” maybe need add the key algorithms: #HostKeyAlgorithms ssh-ed25519[Redacted][Redacted]rsa-sha2-256,rsa-sha2-512 Ho…

Redis常用命令——String篇

前面我們講解了一些 Redis 的全局命令&#xff08;Redis常用基本全局命令&#xff09;。所謂全局命令&#xff0c;就是可以匹配任意一個數據結構進行使用。但是不同的數據結構&#xff0c;也有自己的操作命令。本篇文章主要講解的是 String 的操作命令&#xff0c;希望會對你有…

ClickHouse課件

列式存儲數據庫&#xff1a;hbase clickhouse 簡介 ClickHouse入門 ClickHouse是俄羅斯的Yandex于2016年開源的列式存儲數據庫&#xff08;DBMS&#xff09;&#xff0c;使用C語言編寫&#xff0c;主要用于在線分析處理查詢&#xff08;OLAP&#xff09;&#xff0c;能夠使用…

2024年電工杯B題論文首發+問題一論文代碼分享

問題一論文代碼鏈接&#xff1a;https://pan.baidu.com/s/1kDV0DgSK3E4dv8Y6x7LExA 提取碼&#xff1a;sxjm --來自百度網盤超級會員V5的分享 基于數據分析的大學生平衡膳食食譜的優化設計及評價 摘要 大學時期不僅是學術學習和身體成長的關鍵階段&#xff0c;更是青年學生…

supermind讀寫自選股的功能來了

python custom_sector() # 返回所有板塊的dataframecustom_sector(板塊1) # 返回 板塊1 的屬性和股票custom_sector(板塊1, append, [000001.SZ]) # 增加板塊1的股票列表custom_sector(板塊1, pop, [000001.SZ]) # 移除板塊1的股票custom_sector(板塊1, remove) # 刪除板塊1zxg…

Hsql每日一題 | day03

前言 就一直向前走吧&#xff0c;沿途的花終將綻放~ 題目&#xff1a;打折日期交叉問題 如下為平臺商品促銷數據&#xff1a;字段為品牌&#xff0c;打折開始日期&#xff0c;打折結束日期 brand stt edt oppo,2021-06-05,2021-06-09 oppo,2021-06-11,2021-06-21 vivo,…

Java中流的概念細分

按流的方向分類&#xff1a; 輸入流&#xff1a;數據流向是數據源到程序&#xff08;以InputStream、Reader結尾的流&#xff09;。 輸出流&#xff1a;數據流向是程序到目的地&#xff08;以OutputStream、Writer結尾的流&#xff09;。 按處理的數據單元分類&#xff1a; 字…

PVE 虛擬機環境下刪除 local-lvm分區

1、刪除邏輯卷 lvremote pve/data 2、擴展邏輯卷 lvextend -l 100%FREE -r pve/root 3、 修改存儲目錄內容 點擊 Datacenter - Storage &#xff08;1&#xff09;刪除local-lvm分區 &#xff08;2&#xff09;編輯local分區&#xff0c;在內容一項中勾選所有可選項。

mysql 兩個不同字段的表導入數據

下面這個場景就是A表的字段和B表的字段不一樣&#xff0c;但是現在我想把b表中的數據導入到A表里面&#xff0c;下面是導入公式如下&#xff1a; 語法&#xff1a; 將SYS_ORG表中的數據導入到sys_depart&#xff0c;但是這兩個表的字段不一樣&#xff0c;在()里面填寫要新增數據…

Spring Boot 3.3 正式發布,王炸級更新,應用啟動速度直接起飛!

最新消息&#xff0c;Spring Boot 一次性發布了 3 個版本&#xff1a; 3.3.0 3.2.6 3.1.13 Spring Boot 3.3 正式發布了&#xff0c;3.1.x 在前幾天也停止維護了。 最新的支持版本如下&#xff1a; 從路線圖可以看到每個版本的終止時間&#xff0c;每個版本的生命周期只有…

安徽大學數學科學學院教授陳昌昊

男&#xff0c;本&#xff08;2005-2009&#xff09;、碩&#xff08;2009-2012&#xff09;學位都在湖北大學獲得&#xff0c;博士學位在芬蘭獲得&#xff08;2012-2016&#xff09;&#xff0c;博士后分別在澳大利亞&#xff08;2016-2019&#xff09;、香港&#xff08;2020…

vue3中el-form表單校驗,再點擊提交按鈕的時候通過校驗才進行提交

vue3中el-form表單校驗&#xff0c;再點擊提交按鈕的時候通過校驗才進行提交 一、前言1、案例 一、前言 在 Vue 3 中&#xff0c;可以使用 Element UI 的 <el-form> 組件配合 <el-form-item> 來實現表單的必填項校驗&#xff0c;并在提交時根據校驗結果來決定是否…

clickhouse 中的數組(array)和元組(Tuple)—— clickhouse 基礎篇(二)

文章目錄 數組判斷是否為空計算數組長度獲取數組元素判斷某個元素是否存在數組切片數組元素展開數組元素去重刪除連續重復元素連接多個數組數組倒序數組拍平數組元素映射數組元素過濾數組聚合分析計算數組交集計算數組并集計算數組差集SQL 子查詢進行集合操作 元組創建元組獲取…

LeetCode刷題之HOT100之二叉樹的直徑

2024/5/25 陰天。這幾天睡眠質量都非常好&#xff0c;一切似乎都在慢慢上升。先把題做了 1、題目描述 2、邏輯分析 題目要求就是給一個二叉樹&#xff0c;求出兩個節點之間的最大長度即為二叉樹的直徑。怎么做呢&#xff1f;我想不出來。看一下題解吧。題解給出的解法是深度優…

Swagger2 和 Swagger3 的不同

Swagger2 和 Swagger3 的不同 SpringBoot 整合 Swagger3 和 Swagger2 的主要區別如下&#xff1a; 區別一&#xff1a;引入不同的依賴 如果使用的是 Swagger 3 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter<…