STM32F1与STM32CubeIDE编程实例-超声波测距传感器驱动 超声波测距传感器驱动 超声波测距模块HC-SR04提供2cm-400cm非接触测量功能,测距精度可达3mm。 该模块包括超声波发射器、接收器和控制电路。
HC-SR04 的工作非常简单直接。模块发出 40 KHz 的超声波,在被障碍物反射后,反射回模块。 通过使用传播时间和声音的速度,我们可以计算出传感器与障碍物之间的距离。
HC-SR04工作的时序图如下:
结合工作时序图,我们可以得到HC-SR04的驱动步骤如下:
Trig引脚保持高电平至少 10us
模块现在将发送 8 个周期的 40 kHz 超声波脉冲串并检测是否有脉冲信号返回
如果信号返回,模块将输出一个高脉冲,其宽度将与物体的范围成正比。
距离可以使用以下公式计算:距离 = 高脉冲时间 * 速度 (340m/s) / 2
以厘米为单位计算公式: 距离 = us / 58
以英寸为单位计算公式:距离 = us / 148
建议至少等待 60ms 后再开始一下轮操作。
1、超声波测距传感器配置 开发环境搭建、系统时钟配置、调试配置及串口配置,请参考:
传感器配置如下:
保存配置并生成代码。
2、超声波测距传感器驱动 1)基本定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 /\* \* hsr04.h \* \* Created on: Apr 25, 2022 \* Author: jenson \*/ #ifndef \_\_HSR04\_H\_\_ #define \_\_HSR04\_H\_\_ #include <stdio.h> #include <stm32f1xx\_hal.h> #include "main.h" typedef struct { uint16\_t id; GPIO_TypeDef \*Echo_GPIOx; // ECHO引脚端口 uint16\_t Echo_GPIO_Pin; // ECHO引脚 GPIO_TypeDef \*Triggle_GPIOx; // Triggle引脚端口 uint16\_t Triggle_GPIO_Pin; // Triggle引脚 } hsr04\_t; /\*\*\* \* @brief 初始化 \*/ void hsr04\_init(void); /\*\*\* \* @brief 测量距离 \* @returen 返回以厘米为单位的距离 \*/ float hsr04\_measure\_cm(hsr04\_t\* hsr04); #endif /\* \_\_HSR04\_H\_\_ \*/
2)测距实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 /\* \* hsr04.c \* \* Created on: Apr 25, 2022 \* Author: jenson \*/ #include "hsr04.h" #include "dwt\_delay.h" /\*\*\* \* @brief 初始化 \*/ void hsr04\_init(void) { } /\*\*\* \* @brief 测量距离 \* @returen 返回以厘米为单位的距离 \*/ float hsr04\_measure\_cm(hsr04\_t \*hsr04) { uint32\_t counter = 1; float distance = 0; HAL\_GPIO\_WritePin(hsr04->Triggle_GPIOx, hsr04->Triggle_GPIO_Pin, GPIO_PIN_RESET); dwt\_delay\_us(2); HAL\_GPIO\_WritePin(hsr04->Triggle_GPIOx, hsr04->Triggle_GPIO_Pin, GPIO_PIN_SET); dwt\_delay\_us(10); HAL\_GPIO\_WritePin(hsr04->Triggle_GPIOx, hsr04->Triggle_GPIO_Pin, GPIO_PIN_RESET); // 等待返回响应 while (!HAL\_GPIO\_ReadPin(hsr04->Echo_GPIOx, hsr04->Echo_GPIO_Pin)) ; // 响应计数 while (HAL\_GPIO\_ReadPin(hsr04->Echo_GPIOx, hsr04->Echo_GPIO_Pin)) { counter++; dwt\_delay\_us(1); } //distance = (float) counter / 29.1; dwt\_delay\_ms(60); // distance = distance / 10 /1000000; // 换算距离 distance = counter \* 0.034; return distance; }
测距实现使用了DWT模块进行计时,请参考DWT(Data Watchpoint and Trigger)精确延时
3)主程序
在main.c文件中,添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 /\* Private includes ----------------------------------------------------------\*/ /\* USER CODE BEGIN Includes \*/ #include "hsr04/hsr04.h" #include "dwt\_delay.h" /\* USER CODE END Includes \*/ /\* Private variables ---------------------------------------------------------\*/ /\* USER CODE BEGIN PV \*/ hsr04\_t hsr04; /\* USER CODE END PV \*/ int main(void) { /\* USER CODE BEGIN 1 \*/ float distance = 0.0; /\* 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 \*/ hsr04.Echo_GPIO_Pin = ECHO_Pin; hsr04.Echo_GPIOx = ECHO_GPIO_Port; hsr04.Triggle_GPIO_Pin = TRIGGER_Pin; hsr04.Triggle_GPIOx = TRIGGER_GPIO_Port; printf("\*\*\*\*STM32CubeIDE:HSR04 Demo\*\*\*\*\r\n"); if (dwt\_init()) { printf("DWT inited\r\n"); } else { printf("DWT init failed\r\n"); while (1) ; } /\* USER CODE END 2 \*/ /\* Infinite loop \*/ /\* USER CODE BEGIN WHILE \*/ while (1) { /\* USER CODE END WHILE \*/ /\* USER CODE BEGIN 3 \*/ distance = hsr04\_measure\_cm(&hsr04); printf("distance = %f\r\n", distance); HAL\_Delay(100); } /\* USER CODE END 3 \*/ }
输出结果如下:
文章来源: https://iotsmart.blog.csdn.net/article/details/125514367
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!