基于STM32F103VET6的超声波传感器HC-SR04测距实例

超声波传感器HC-SR04测距实例

最近刚学了点32的知识,找了个超声波传感器练习一下,这是我的一点学习经验,和大家分享一下,如有不足希望各位大佬多多指导。

软件

STM32CubeMX,keil5,野火串口调试助手

硬件

stm32f103vet6开发板,J-Link,超声波传感器HC-SR04

原理

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第1张图片
HC-SR04超声波模块工作原理
(1)采用IO口触发测距,给至少10us高电平脉冲;
(2)模块内自动发送八个40khz方波,并自主检测是否有电波返回;
(3)当有信号返回时,通过IO口输出一个高电平,高电平的持续时间就是超声波从发送到返回的时间;
(4)测距公式:距离=(高电平时间*声速)/2;
我自己的理解:本模块使用时,给Trig一个10US以上的高电平,模块开始工作,模块内自动发送八个40khz方波,并自主检测是否有电波返回。这是我们需要检测Echo处的电平,当为高电平的时候记一个时间;当Echo出为低电平的时候在记一个时间,这两个时间的差就是高电平持续的时间,然后用测距公式进行计算。

步骤

1,设置RCC和SYS

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第2张图片
基于STM32F103VET6的超声波传感器HC-SR04测距实例_第3张图片

2,设置Trig输出引脚,Echo输入引脚以及LED灯

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第4张图片

3,设置TIM2和USART1

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第5张图片

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第6张图片

4,设置时钟树,项目名称以及其他设置

不同板子的时钟树设置不同,自己去查资料。
基于STM32F103VET6的超声波传感器HC-SR04测距实例_第7张图片
基于STM32F103VET6的超声波传感器HC-SR04测距实例_第8张图片

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第9张图片

5,生成代码,并打开keil5

基于STM32F103VET6的超声波传感器HC-SR04测距实例_第10张图片
基于STM32F103VET6的超声波传感器HC-SR04测距实例_第11张图片

6,编写代码

让LED灯快速亮灭三次----表示代码已下载到板子中,并开始运行

 /* USER CODE BEGIN 2 */
 int i=0;
 while(i<7)
  {
      
   HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
   HAL_Delay(400);
   i=i+1;
  }
  /* USER CODE END 2 */

按照原理,编写while函数体里面的代码。(第一个while是当有信号返回时,如果满足条件,就会卡在这里,当不满足条件时,开始往下走,记一个时间,然后会卡在另一个while处,当条件不成立了再继续往下走,在记一个时间。两个while可以理解为条件延时。)

/* USER CODE BEGIN WHILE */
  while (1)
  {
     
    /* USER CODE END WHILE */
     /* USER CODE BEGIN 3 */
 HAL_TIM_Base_Start_IT(&htim2);
   htim2.Instance->CNT = 0;
   float t1,t2,distance;
   HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);
   HAL_Delay(1);
   HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
  while(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_RESET)
  t1=htim2.Instance->CNT;
  while(HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == GPIO_PIN_SET)
  t2=htim2.Instance->CNT;
  htim2.Instance->CNT = 0;
  distance=(t2-t1)*17/(float)1000;
  printf("The distance is %0.1fcm\n",(float)distance);
  HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);
  HAL_Delay(500);
   }
  /* USER CODE END 3 */

7,编译,下载代码,打开串口调试助手并且运行代码

在编译前,点击魔术棒选项卡,确认J-Link仿真器已连接好以及其他设置也是正确的。
基于STM32F103VET6的超声波传感器HC-SR04测距实例_第12张图片

8,用传感器测距离

有些人的printf无法使用,点击这里[printf无法使用的解决方法。]。(https://blog.csdn.net/weixin_45139319/article/details/103439854)

你可能感兴趣的:(超声波传感器测距,STM32F103VET6,HAL库,stm32,超声波传感器)