Zen的小站

小舟从此逝,江海寄余生

0%

【模块】超声波测距

文章概览

参考CSDN这篇

原理

超声波测距原理都差不多

引脚

VCCTrigEchoGND
一般5V接收信号,触发开始返回信号,用于计算距离

顺序

在这里插入图片描述

注意

被测物体的面积不少于0.5平方米且平面尽量要求平整

使用方法

  1. 在 cubemx 中设置 trig 为 output GPIO,设置 echo 为 input GPIO
  2. 开启 TIM 时钟,两参数分别为 72-1 和 65535,用于精确计时
1
2
3
4
#define CSB_Trig_GPIO_Port 	GPIOB
#define CSB_Trig_Pin GPIO_PIN_5
#define CSB_Echo_GPIO_Port GPIOB
#define CSB_Echo_Pin GPIO_PIN_6
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
//使用TIM1来做us级延时函数,此函数为1us
void TIM1_Delay_us(uint16_t n_us)
{
__HAL_TIM_SetCounter(&htim1, 0);//htim1

/* 开启定时器1计数 */
__HAL_TIM_ENABLE(&htim1);

//获取定时器的计数值!!!再判断计数值,但是计数值不得大于定时器配置的重装载值。\
假如:定时器设定的重装载值为65536-1, 比较值需小于重装载值,即(计数1次 * n_us)-1) 小于(65536-1)\
即传进来的参数n_us需要小于65536-1;
while(__HAL_TIM_GetCounter(&htim1) < ((1 * n_us)-1) );
/* Disable the Peripheral */
__HAL_TIM_DISABLE(&htim1);
}


//获取超声波模块的检测距离
float csb_get_distance(void)
{
float CSB_value = 0 ;
//给发射引脚一个高电平
HAL_GPIO_WritePin(CSB_Trig_GPIO_Port, CSB_Trig_Pin , GPIO_PIN_SET);
//延时10us以上
TIM1_Delay_us(20);
//给发射引脚一个低电平
HAL_GPIO_WritePin(CSB_Trig_GPIO_Port, CSB_Trig_Pin, GPIO_PIN_RESET);
//等待接收引脚变成高电平
while( HAL_GPIO_ReadPin(CSB_Echo_GPIO_Port,CSB_Echo_Pin) == 0);
//设置定时器初始值为0
__HAL_TIM_SetCounter(&htim1, 0);
//开始计时
__HAL_TIM_ENABLE(&htim1);
//接收完全后不再为高电平,即当接收引脚变成低电平后,停止计时,获取计数时间
while( HAL_GPIO_ReadPin(CSB_Echo_GPIO_Port,CSB_Echo_Pin) == 1);
//获取定时器的计数值,赋值操作 a = b;
CSB_value = __HAL_TIM_GetCounter(&htim1);
//停止计时
__HAL_TIM_DISABLE(&htim1);
//已知高电平总时间,即可利用公式( 测试距离= (高电平时间*声速(340M/S))/2 ),计算超声波模块距离障碍物的单程距离;
//如果需要返回 毫米级别距离,公式为( 测试距离= (高电平时间*声速(340M/1000mS))/2 )
return ( CSB_value*340/1000/2); //*340/1000/2
}

多想多做,发篇一作

-------------本文结束感谢您的阅读-------------
// 在最后添加