一、实验简介及原理
本次实验需要通过STM32与HC_SR04模块实现实时测距,并将测距信息通过串口显示在电脑上
原理
超声波测距原理是在超声波发射装置发出超声波,它的根据是接收器接到超声波时的时间差,与雷达测距原理相似。 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t(秒),就可以计算出发射点距障碍物的距离(s),即:s=340t/2
HC-SR04模块
- 采用IO口TRIG触发测距,给至少10us的高电平信号,模块自动发送8个40khz的方波,自动检测是否有信号返回。
- 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。
二、实验设备
硬件:STM32F103C8T6、HC_SR04超声波测距模块
软件:CubeMX、Keil5、FlyMCU、野火串口调试助手
三、实验主要代码
(完整源码在代码块后)
uint32_t csb_get_distance(void)
{
uint32_t CSB_value = 0 ;
//给发射引脚一个高电平
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET);
//延时10us以上
TIM1_Delay_us(20);
//给发射引脚一个低电平
HAL_GPIO_WritePin(Echo_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);
//等待接收引脚变为高电平
while( HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == 0);
//设置定时器初始值为0
__HAL_TIM_SetCounter(&htim1, 0);
//开始计时
__HAL_TIM_ENABLE(&htim1);
//当接受引脚从高电平转换为低电平时,停止计时,获取计时时间
while( HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin) == 1);
//获取定时器的计数值a = b;
CSB_value = __HAL_TIM_GetCounter(&htim1);
//停止计时
__HAL_TIM_DISABLE(&htim1);
//已知高电平总时间,即可利用公式测试距离= (高电平时间*声速(340M/S))/2
//如果需要返回毫米级别距离,公式为:测试距离= (高电平时间*声逮(340M/1000ms))/2
return ( CSB_value*340/1000/2);
}
/* USER CODE END 0 */
uint32_t data[5] = {0};
uint32_t averageFilter(uint32_t in_data)
{
float sum = 0;
for(int i=0; i<4; i++)
{
data[i]=data[i+1];
sum = sum + data[i];
}
data[4] = in_data;
sum = sum + data[4];
return(sum/5);
}
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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_TIM1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
int distance;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
distance = averageFilter(csb_get_distance());
if(distance<=10)
{
HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);
}
else
HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);
printf("超声波检测距离%dcm\n", distance/10);
HAL_Delay(500);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
完整源码:
链接:https://pan.baidu.com/s/1YR_0m4aP8GznQenHikV3ug
提取码:n3mq文章来源:https://www.toymoban.com/news/detail-676361.html
四、最终结果
文章来源地址https://www.toymoban.com/news/detail-676361.html
到了这里,关于基于STM32的HC_SR04模块实现超声波测距(附源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!