stm32控制SR04超声波传感器

该文描述了一个使用STM32微控制器通过超声波传感器进行测距的程序。通过设置GPIO引脚Trig发送触发信号并检测Echo引脚的高低电平变化,计算出往返时间以确定距离。当距离小于5cm时,LED1点亮;否则保持熄灭状态。主要涉及HAL库、定时器和GPIO的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述

怎么让它发送波
Trig ,给Trig端口至少10us的高电平
怎么知道它开始发了
Echo信号,由低电平跳转到高电平,表示开始发送波
怎么知道接收了返回波
Echo,由高电平跳转回低电平,表示波回来了
怎么算时间
Echo引脚维持高电平的时间!
波发出去的那一下,开始启动定时器
波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
怎么算距离
距离 = 速度 (340m/s)* 时间/2

stm32CubeMXtimer配置图

在这里插入图片描述

需求:

使用超声波测距,当手离传感器距离小于5cm时,LED1点亮,否则保持不亮状态。

main.c代码:

#include "main.h"
#include "tim.h"
#include "gpio.h"

void SystemClock_Config(void);

//微妙级的计数
void TIM2_Delay_us(uint16_t n_us)
{
	/* 使能定时器2计数 */
	__HAL_TIM_ENABLE(&htim2);
	__HAL_TIM_SetCounter(&htim2, 0);
	while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );//卡时间
	/* 关闭定时器2计数 */
	__HAL_TIM_DISABLE(&htim2);
}


int main(void)
{

	uint16_t cnt = 0;
	double distance = 0;//距离
	


  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM2_Init();
 
  while (1)
  {
    /* USER CODE END WHILE */
		//1. Trig ,给Trig端口至少10us的高电平
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);//拉高PB6
		TIM2_Delay_us(20);//保持20us
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);//拉低PB6
		
		//2. echo由低电平跳转到高电平,表示开始发送波
		//波发出去的那一下,开始启动定时器
		while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_RESET);//用while卡发波时机
		HAL_TIM_Base_Start(&htim2);//开始计时
		__HAL_TIM_SetCounter(&htim2,0);
		
		//3. 由高电平跳转回低电平,表示波回来了 
		//波回来的那一下,我们开始停止定时器 
		while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_SET);//用while卡收波时机
		HAL_TIM_Base_Stop(&htim2);//计时结束
		
		//4. 计算出中间经过多少时间 
		cnt = __HAL_TIM_GetCounter(&htim2);
		
		//5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us) 
		distance = cnt * 340/2*0.000001*100;//单位为cm
		
		if(distance < 5){
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);//点亮LED1
		
		}else{
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);//关闭LED1
		
		}
		
		//每500毫秒测试一次距离
		HAL_Delay(500);//防止不停歇的测导致程序卡死
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值