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