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

时序图

  • 怎么让它发送波 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

    编写微秒级函数

    //使用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 */
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32实现超声波测距

    发表评论