实物简介
工作原理
具体工作流程如下:
- 将TRIG端口拉高持续10us以上,后将TRIG引脚拉低
- 等待ECHO变为高电平,开始计时
- 等待ECHO变为低电平,中间高电平持续的时间,即为超声波来回所用的时间
通过s = v * t 可得出距离。
CubeMX配置
发送/接收引脚
定时器配置
驱动代码
//返回值为距离,单位为cm
// 参数为定时器句柄,可自由选择空闲的定时器
float Get_Distance(TIM_HandleTypeDef* tim_baseHandle) // 超声波使用到的定时器。
{
unsigned int x1,x2; //接收端高电平起始、结束时定时器的计数值
float Distance; //定义距离
tim_baseHandle->Instance->CNT = 0; //清空定时器计数值
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,GPIO_PIN_SET); //开始测距,将TRIG拉高
HAL_Delay(1); //保持高电平10us以上
HAL_GPIO_WritePin(TRIG_GPIO_Port,TRIG_Pin,GPIO_PIN_RESET); //将TRIG拉低
while(HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 0); //等待ECHO的高电平起始时间
x1 = tim_baseHandle->Instance->CNT;
while(HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 1); //记录ECHO高电平结束时间
x2 = tim_baseHandle->Instance->CNT;
tim_baseHandle->Instance->CNT = 0; //
Distance = (x2-x1)*0.017 ; //计算距离,单位为cm
return Distance;
}
- 距离计算
- 声波的传输速度 340m/s = 340* 100 / 1000 000 cm/us = 0.0.34 cm/s
- 距离(cm) = t(us)* 0.034(cm/us)/2 = t * 0.017
mian函数
int main(void)
{
/* USER CODE BEGIN 1 */
float Distance;
/* 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 */
HAL_TIM_Base_Start(&htim2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
Distance = Get_Distance(&htim2);
printf("distance = %0.1fcm\r\n",Distance);
HAL_Delay(400);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}