STM32基于HAL庫的HC-SR04模塊超聲波測距

文章目錄

  • 一·、HC-SR04模塊介紹
  • 二、創建工程
    • 1.選擇芯片
    • 2.配置RCC、SY![在這里插入圖片描述](https://img-blog.csdnimg.cn/direct/9d2a5b883f0e409eabb804e6da861277.png)
    • 3.配置串口1
    • 4.配置定時器
    • 5.配置GPIO
  • 三、Keil代碼
    • 1.勾選Use MicroLIB
    • 2.創建SR04.c和SR04.h文件
    • 3.其他代碼
  • 四、效果
  • 五、參考資料:

一·、HC-SR04模塊介紹

在這里插入圖片描述

? 超聲波是振動頻率高于20kHz的機械波。它具有頻率高、波長短、繞射現象小、方向性好、能夠成為射線而定向傳播等特點。HC-SRO4是一款尺寸完全兼容老版本,增加UART和IIC功能的開放式超聲波測距模塊,默認條件下,軟件與硬件完全兼容老版本HC-SRO4;可以通過電阻設置成UART或IIC模式。2CM盲區,4.5M典型最遠測距,2.2mA作電流。采用升級解調芯片RCWL-9206,帶UART與IIC功能MCU:使其外圍更加簡潔,工作電壓更寬(3-5.5V),接口功能更多。

  • 模塊參數:
    ①專業解調測距芯片RCWL-9206
    ②支持GPIO,UART與IIC三種模式接口
    ③2.2mA工作電流
    ④2cm最小盲區
    ⑤2cm-450cm的超寬測量范圍
    ⑥工作溫度:-10°C-70°c
    ⑦3V-5.5V寬電壓供電

在這里插入圖片描述

在這里插入圖片描述
注:0~40℃聲速誤差7%左右,實際應用時需要考慮溫度影響

  • 實驗步驟

    1.配置GPIO引腳結構體(Trig,Echo)
    2.配置定時器結構體
    3.配置定時器中斷結構體
    4.開啟時鐘(定時器、GPIO)
    5.Trig引腳輸出高電平(10us以上),然后關閉
    6.等待Echo引腳輸出高電平開始,定時器打開->開啟計數器計數
    7.等待Echo引腳輸出高電平結束,定時器關閉->停止計數器計數


二、創建工程

1.選擇芯片

打開STM32CubuMax,新建一個項目,選擇芯片

2.配置RCC、SY在這里插入圖片描述

S、時鐘樹

rcc
在這里插入圖片描述

sys

在這里插入圖片描述

時鐘樹

在這里插入圖片描述


3.配置串口1

在這里插入圖片描述

4.配置定時器

在這里插入圖片描述

在這里插入圖片描述

5.配置GPIO

在這里插入圖片描述

完成后生成keil工程


三、Keil代碼

1.勾選Use MicroLIB

在這里插入圖片描述

2.創建SR04.c和SR04.h文件

SR04.c

#include "SR04.h"float distant;      //測量距離
uint32_t measure_Buf[3] = {0};   //存放定時器計數值的數組
uint8_t  measure_Cnt = 0;    //狀態標志位
uint32_t high_time;   //超聲波模塊返回的高電平時間//===============================================讀取距離
void 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);	//啟動輸入捕獲       或者: __HAL_TIM_ENABLE(&htim5);                                                                                    		break;case 3:high_time = measure_Buf[1]- measure_Buf[0];    //高電平時間printf("\r\n----高電平時間-%d-us----\r\n",high_time);							distant=(high_time*0.034)/2;  //單位cmprintf("\r\n-檢測距離為-%.2f-cm-\r\n",distant);          measure_Cnt = 0;  //清空標志位TIM2->CNT=0;     //清空計時器計數break;}
}//===============================================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++;  }}}

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);
void SR04_GetData(void);#endif

添加進工程

3.其他代碼

usrat.c中添加

/* USER CODE BEGIN 0 */
#include "stdio.h"
/* USER CODE END 0 *//* USER CODE BEGIN 1 */
/*********************************************************
*
*重定義 fputc 函數
*
*********************************************************/
int fputc(int ch,FILE *f)
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch;
}
/* USER CODE END 1 */

main函數

/* 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"
/* 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){SR04_GetData(  );HAL_Delay(300);/* 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 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

四、效果

HC-SR04模塊接線

VCC接5V
GND接地
TRIG接A1
ECHO接A0

在這里插入圖片描述

在這里插入圖片描述

五、參考資料:

[1]https://blog.csdn.net/qq_52215423/article/details/131034232?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32%E8%B6%85%E5%A3%B0%E6%B3%A2%E6%B5%8B%E8%B7%9D&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-131034232.142

[2]https://blog.csdn.net/lwb450921/article/details/123670786?spm=1001.2014.3001.5502

[3]https://blog.csdn.net/weixin_72921448/article/details/127586521?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171721873616800186519673%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171721873616800186519673&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_click~default-4-127586521-null-null.142

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

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

相關文章

html three.js 引入.stl模型示例

1.新建一個模塊用于放置模型 <div id"chart_map" style"width:800px;height:500px"></div> 2. 引入代碼根據需求更改 <!-- 在head或body標簽內加入以下鏈接 --> <script src"https://cdn.jsdelivr.net/npm/three0.137/build/t…

算法題-字符串排序

題目描述 給定n個字符串&#xff0c;請對n個字符串按照字典序排列。 輸入描述: 輸入第一行為一個正整數n(1≤n≤1000),下面n行為n個字符串(字符串長度≤100),字符串中只含有大小寫字母。 輸出描述: 數據輸出n行&#xff0c;輸出結果為按照字典序排列的字符串。 輸入 #輸…

2.7HDR與LDR

一、基本概念 1.基本概念 動態范圍&#xff08;Dynamic Range&#xff09; 最高亮度 / 最低亮度 HDR High Dynamic RangeLDR Low Dynamic Range HDR與LDR和Tonemapping的對應關系&#xff1a; 我們常用的各種顯示器屏幕&#xff0c;由于不同的廠家不同的工藝導致它們的…

HALCON-從入門到入門-軟件界面介紹

1.廢話 從halcon12到halcon23&#xff0c;開發的IDE界面大差不差&#xff0c;簡單說下界面上不同功能按鍵的分布&#xff0c;以及一些快捷鍵啥的&#xff0c;要是還有我沒有總結到的&#xff0c;又比較好用的&#xff0c;歡迎大家補充一下。 1.菜單欄 從上看到下&#xff0c;…

如何從0到設計一個CRM系統

什么是CRM 設計開始之前&#xff0c;先來了解一下什么是CRM。CRM&#xff08;Customer Relationship Management&#xff09;是指通過建立和維護與客戶的良好關系&#xff0c;達到滿足客戶需求、提高客戶滿意度、增加業務收入的一種管理方法和策略。CRM涉及到跟蹤和管理客戶的所…

python深度學習入門-從零構建CNN和RNN

文章目錄 第1章 基本概念1.1. 導數1.2. 鏈式法則1.3. 多輸入函數的導數1.4. 多輸入向量函數的導數1.5. 向量函數及其導數&#xff1a; 再進一步1.6. 包含兩個二維矩陣數據的計算圖 第2章 基本原理2.1. 監督學習概述2.2. 監督學習模型2.3. 線性回歸2.3.1. 線性回歸&#xff1a; …

[激光原理與應用-94]:電控 - 低噪聲運放的原理

目錄 一、什么是低噪聲運放 1.1 什么是低噪聲水平 1.2 什么是高增益 在電子工程中的應用 在通信領域的應用 在音頻和視頻處理中的應用 注意事項 1.3 什么是寬帶寬 1.4 什么是低偏置電流 重要性 特點 解決方法 應用 二、低噪聲運放的原理圖 1. 基本構成 2. 設計…

HTML5新元素探索:重塑網頁結構與功能的革新

隨著互聯網技術的飛速發展&#xff0c;HTML5作為新一代超文本標記語言標準&#xff0c;不僅增強了對多媒體內容的支持&#xff0c;還引入了一系列新元素&#xff0c;旨在使網頁結構更加語義化、可訪問性更強。本文將深入探討幾個核心的新元素&#xff0c;通過代碼示例展示它們如…

22data 腳本語言基礎——Python

橫線為沒講到的。 1. 基礎語法 變量&#xff1a;變量的聲明和使用。 數據類型&#xff1a;整數&#xff08;int&#xff09;、浮點數&#xff08;float&#xff09;、字符串&#xff08;str&#xff09;、布爾值&#xff08;bool&#xff09;等。 運算符&#xff1a;算術運算符…

第五維度【百度之星】/二分

第五維度 二分 思路&#xff1a;看到題目是盡可能晚的情況下最早就應該想到貪心。 #include<bits/stdc.h> using namespace std; typedef long long ll; ll a[100005],b[100005]; ll n,m; bool check(ll t) {ll res0,big0;for(ll i0;i<n;i) {if(a[i]>t) continue…

JMeter工具介紹

Jmeter功能概要 JDK常用文件目錄介紹 Bin目錄&#xff1a;存放可執行文件和配置文件 Docs目錄&#xff1a;是Jmeter的API文檔&#xff0c;用于開發擴展組件 printable_docs目錄&#xff1a;用戶幫助手冊 lib目錄&#xff1a;存放JMeter依賴的jar包和用戶擴展所依賴的Jar包 修…

HALCON-從入門到入門-讀取圖片保存圖片

1.廢話 視覺算法庫的第一步。 讀取圖片&#xff1a; 看你是從哪里讀取&#xff0c;從相機讀取還是從本地硬盤中讀取。 保存圖片&#xff1a;就只有保存到本地了。 上面的截圖顯示我讀取了一張圖片 從相機中讀取另開一篇來說&#xff0c;先說從本地磁盤讀取哈。 怎么讀取的…

創建maven 項目

一、groupId, artifactId When creating a Maven project in IntelliJ IDEA, "groupId" and "artifactId" are two essential elements of the projects metadata. groupId: This typically identifies your project uniquely across all projects. For e…

C語言程序設計第二講:順序程序設計

一、數據類型 1. 基本數據類型 C語言中提供了一些基本數據類型&#xff0c;用于表示各種不同類型的數據&#xff1a; 整數類型&#xff1a; int&#xff1a;表示整數&#xff0c;通常占用4個字節。short int&#xff1a;表示短整數&#xff0c;通常占用2個字節。long int&am…

Pycharm 的使用

使用文檔&#xff1a; Getting started | PyCharm DocumentationPyCharm 中文指南 — PyCharm 中文指南(Win版) 2.0 documentation 在Ubuntu中安裝并配置Pycharm教程&#xff08;安裝 Pycharm&#xff09;Ubuntu安裝pycharm及快速創建pycharm的快捷方式&#xff0c;便于使用&am…

數據結構復習指導之交換排序(冒泡排序,快速排序)

目錄 交換排序 復習提示 1.冒泡排序 1.1基本思想 1.2算法代碼 1.3性能分析 2.快速排序 2.1基本思想 2.2算法代碼 2.3性能分析 交換排序 復習提示 所謂交換&#xff0c;是指根據序列中兩個元素關鍵字的比較結果來對換這兩個記錄在序列中的位置。 基于交換的排序算法很…

鏈表逆序用哨兵位頭節點

在C語言中實現鏈表的逆序&#xff0c;使用哨兵頭節點是一種常見的做法。哨兵頭節點可以簡化代碼邏輯&#xff0c;特別是當鏈表為空時&#xff0c;可以避免空指針異常。下面是一個使用哨兵頭節點逆序單鏈表的C語言實現 示例&#xff1a; #include <stdio.h> #include &l…

富格林:應用正規技巧阻撓被騙

富格林悉知&#xff0c;隨著如今入市現貨黃金的朋友愈來愈多&#xff0c;不少投資者也慢慢開始重視起提高自身的正規投資技巧&#xff0c;希望能阻撓被騙更高效地在市場上獲利。雖然目前黃金市場存在一定的受害風險&#xff0c;但只要投資者嚴格按照正規的交易規則來做單&#…

python解決flask啟動的同時啟動定時任務

業務場景描述&#xff1a;在常規的開發中&#xff0c;我們開發接口服務&#xff0c;一般會將數據放在數據庫、文件等第三方文件&#xff0c;啟動服務后&#xff0c;服務到后臺數據庫中加載數據&#xff0c;這樣做的好處當然是開發會更加便利以及數據的可復用性較高&#xff0c;…

深度學習-03-函數的連續調用

深度學習-03-函數的連續調用 本文是《深度學習入門2-自製框架》 的學習筆記&#xff0c;記錄自己學習心得&#xff0c;以及對重點知識的理解。如果內容對你有幫助&#xff0c;請支持正版&#xff0c;去購買正版書籍&#xff0c;支持正版書籍不僅是尊重作者的辛勤勞動&#xff0…