HC-SR04 超声波模块基于STM32F103

实物简介

在这里插入图片描述

工作原理

在这里插入图片描述
具体工作流程如下:

  • 将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 */
}

效果展示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想写代码的我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值