STM32—超声波测距

超声波简介
超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离。
型号:HC-SR04
STM32—超声波测距_第1张图片
时序图
STM32—超声波测距_第2张图片

  • 怎么让它发送波 Trig触发信号,给Trig端口至少10us的高电平

  • 怎么知道它开始发了 Echo信号,由低电平跳转到高电平,表示开始发送波

  • 怎么知道接收了返回波

    Echo信号,由高电平跳转回低电平,表示波回来了

  • 怎么算时间
    Echo引脚维持高电平的时间! 波发出去的那一下,开始启动定时器 波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间

  • 怎么算距离

  • 距离 = 速度 (340m/s)* 时间/2

编程实战

使用超声波测距,当手离传感器小于10cm时,led亮,否侧灭
接线:Tring ——PB6 Echo——PB7 led——PC13
PB6设置为输出,给Tring一个触发信号,PB7设置为输入,接收Echo的信号
定时器配置
使用TIM2,只用作计数功能,不用做定时。
将PSC配置为71,则计数1次为1us
STM32—超声波测距_第3张图片
编写微秒级函数

//使用TIM2来做us级别的延时函数
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);
	
	
}
//使用TIM2来做us级别的延时函数
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);
	
	
}



/* USER CODE END 0 */

/**
  * @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_TIM2_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  int cnt = 0;
	float distance = 0;
	while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		//给Tring至少10us的高电平,触发信号
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_SET);
		TIM2_Delay_us(20);
		HAL_GPIO_WritePin(GPIOB,GPIO_PIN_6,GPIO_PIN_RESET);
		
		//波发出去时打开定时器计时
		while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_RESET);
		HAL_TIM_Base_Start(&htim2);
		__HAL_TIM_SetCounter(&htim2,0);//设置每次都从0开始计算次数
		//波回来的时候关闭定时器,停止计时
		while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_7) == GPIO_PIN_SET);
		HAL_TIM_Base_Stop(&htim2);
		
		//获取时间,转换为距离,计算一次为1us,获取计算次数cnt
		cnt = __HAL_TIM_GetCounter(&htim2);
		
		distance  = cnt*340/2*0.000001*100;//单位cm
		
		if(distance < 10){
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
		}else {
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
		}
		
		HAL_Delay(1000);
		
		
		
		
  }
  /* USER CODE END 3 */
}

你可能感兴趣的:(STM32学习,stm32,单片机,嵌入式硬件)