OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6815|回复: 5

基于STM32CUBEIDE HC-SR04超声波测距

[复制链接]

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
发表于 2021-3-16 15:22:04 | 显示全部楼层 |阅读模式
本帖最后由 jiangyy 于 2021-3-25 13:26 编辑

1.引脚配置图

1.jpg 2.jpg


3.工作原理
VCC: 供5V电源
GND: 为地线
TRIG: 触发控制信号输入
ECHO: 回响信号输出

4.png

4.时序图
认真看好以下工作原理,后面的代码就是基于工作原理来实现的。
(1)采用IO口TRIG触发测距,给最少10us的高电平信号。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2
时序图:
3.png

5.代码

  1. /*
  2. * bsp_ultrasonicwave.c
  3. *
  4. *  Created on: Mar 15, 2021
  5. *      Author: jiangyuanyuan
  6. */

  7. #include "bsp_ultrasonicwave.h"
  8. #include "stdio.h"

  9. //定时器初始化,分频系数为71,则频率为1MHZ,每个计数为1us,(频率越高越精确)
  10. //重装载值为65535,溢出时间为1us*65536=    65.536ms=0.065536s
  11. //一个计数周期可以测距 0.065536s * 340m/s / 2 = 11.14112m
  12. float Distance_Calculate(uint32_t count)
  13. {
  14.         //单位cm
  15.         //v = 340m/s = 34000cm/s = 34000cm/10^6us = 0.034cm/us
  16.         //s = vt/2 = t*0.034/2 = t*0.017 ≈ t/58
  17.     float Distance = 0;
  18.     Distance = ((float)count /1000000*340/2 *100);
  19.     return Distance;
  20. }

  21. void UltrasonicWave_Start(void)
  22. {
  23.         HAL_GPIO_WritePin(GPIOB, SR04_TRIG_Pin, GPIO_PIN_RESET); //拉低PB6电平
  24.         HAL_GPIO_WritePin(GPIOB, SR04_TRIG_Pin, GPIO_PIN_SET);//拉高PB6电平
  25.         delay_us(10);//持续10us
  26.         HAL_GPIO_WritePin(GPIOB, SR04_TRIG_Pin, GPIO_PIN_RESET); //拉低PB6电平
  27. }

  28. /***** 测距 *****/
  29. void UltrasonicWave_Measure(void)
  30. {
  31.         float Distance;
  32.         uint16_t i = 0;
  33.         UltrasonicWave_Start();
  34.          while(HAL_GPIO_ReadPin(GPIOB,SR04_ECHO_Pin) == 0)//等待 echo的高电平到来
  35.          {
  36.                  //超时处理
  37.                  if(++i>20000)
  38.                          break;
  39.          }
  40.          i = 0;
  41.          __HAL_TIM_SET_COUNTER(&htim3,0);//清零计数器
  42.          __HAL_TIM_ENABLE(&htim3); //使能定时器3,开始计数
  43.          while(HAL_GPIO_ReadPin(GPIOB,SR04_ECHO_Pin)==1)//echo为高电平时,则等待至低电平
  44.          {
  45.                  //超时处理
  46.                  if(++i>20000)
  47.                          break;
  48.          }
  49.          __HAL_TIM_DISABLE(&htim3);   //失能定时器3,截止计数
  50.          //count是计数器,单位是us,可根据上图转换一下即可。
  51.         Distance = Distance_Calculate(__HAL_TIM_GET_COUNTER(&htim3));        //计算距离
  52.         printf("\r\nDistance = %.2fcm\r\n", Distance);
  53.          *(uint16_t *)&ucParamMem[ID_DISTANCE][0] =(uint16_t)Distance;
  54.         printf("\r\nDistance = %dcm\r\n",  *(uint16_t *)&ucParamMem[ID_DISTANCE][0]);
  55. }

复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2099
金钱
2099
注册时间
2017-2-11
在线时间
306 小时
 楼主| 发表于 2021-3-16 15:26:11 | 显示全部楼层

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2021-3-13
在线时间
11 小时
发表于 2021-5-21 10:20:03 | 显示全部楼层
此帖仅作者可见

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-7-15
在线时间
3 小时
发表于 2021-7-18 13:44:24 | 显示全部楼层
此帖仅作者可见

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-7-15
在线时间
3 小时
发表于 2021-7-18 14:46:20 | 显示全部楼层
此帖仅作者可见

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2020-11-12
在线时间
14 小时
发表于 2021-7-19 14:41:41 | 显示全部楼层
此帖仅作者可见

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 11:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表