本帖最后由 jiangyy 于 2021-3-25 13:26 编辑
1.引脚配置图
3.工作原理
VCC: 供5V电源
GND: 为地线
TRIG: 触发控制信号输入
ECHO: 回响信号输出
4.时序图
认真看好以下工作原理,后面的代码就是基于工作原理来实现的。
(1)采用IO口TRIG触发测距,给最少10us的高电平信号。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(340M/S))/2
时序图:
5.代码
- /*
- * bsp_ultrasonicwave.c
- *
- * Created on: Mar 15, 2021
- * Author: jiangyuanyuan
- */
- #include "bsp_ultrasonicwave.h"
- #include "stdio.h"
- //定时器初始化,分频系数为71,则频率为1MHZ,每个计数为1us,(频率越高越精确)
- //重装载值为65535,溢出时间为1us*65536= 65.536ms=0.065536s
- //一个计数周期可以测距 0.065536s * 340m/s / 2 = 11.14112m
- float Distance_Calculate(uint32_t count)
- {
- //单位cm
- //v = 340m/s = 34000cm/s = 34000cm/10^6us = 0.034cm/us
- //s = vt/2 = t*0.034/2 = t*0.017 ≈ t/58
- float Distance = 0;
- Distance = ((float)count /1000000*340/2 *100);
- return Distance;
- }
- void UltrasonicWave_Start(void)
- {
- HAL_GPIO_WritePin(GPIOB, SR04_TRIG_Pin, GPIO_PIN_RESET); //拉低PB6电平
- HAL_GPIO_WritePin(GPIOB, SR04_TRIG_Pin, GPIO_PIN_SET);//拉高PB6电平
- delay_us(10);//持续10us
- HAL_GPIO_WritePin(GPIOB, SR04_TRIG_Pin, GPIO_PIN_RESET); //拉低PB6电平
- }
- /***** 测距 *****/
- void UltrasonicWave_Measure(void)
- {
- float Distance;
- uint16_t i = 0;
- UltrasonicWave_Start();
- while(HAL_GPIO_ReadPin(GPIOB,SR04_ECHO_Pin) == 0)//等待 echo的高电平到来
- {
- //超时处理
- if(++i>20000)
- break;
- }
- i = 0;
- __HAL_TIM_SET_COUNTER(&htim3,0);//清零计数器
- __HAL_TIM_ENABLE(&htim3); //使能定时器3,开始计数
- while(HAL_GPIO_ReadPin(GPIOB,SR04_ECHO_Pin)==1)//echo为高电平时,则等待至低电平
- {
- //超时处理
- if(++i>20000)
- break;
- }
- __HAL_TIM_DISABLE(&htim3); //失能定时器3,截止计数
- //count是计数器,单位是us,可根据上图转换一下即可。
- Distance = Distance_Calculate(__HAL_TIM_GET_COUNTER(&htim3)); //计算距离
- printf("\r\nDistance = %.2fcm\r\n", Distance);
- *(uint16_t *)&ucParamMem[ID_DISTANCE][0] =(uint16_t)Distance;
- printf("\r\nDistance = %dcm\r\n", *(uint16_t *)&ucParamMem[ID_DISTANCE][0]);
- }
复制代码
|