[其他ST产品] 基于stm32的超声波测距

[复制链接]
 楼主| yutingwei 发表于 2023-8-25 15:28 | 显示全部楼层
在tim.c中编写毫秒延时函数
  1. /* USER CODE BEGIN 1 */

  2. //使用TIM1来做us级延时函数,此函数为1us
  3. void TIM1_Delay_us(uint16_t n_us)
  4. {
  5.         /* 使能定时器1计数 */
  6.         __HAL_TIM_ENABLE(&htim1);
  7.        
  8.         __HAL_TIM_SetCounter(&htim1, 0);//htim1
  9.        
  10.         while(__HAL_TIM_GetCounter(&htim1) < ((1 * n_us)-1) );
  11.        
  12.     /* 失能定时器1计数 */
  13.         __HAL_TIM_DISABLE(&htim1);
  14. }


  15. /* USER CODE END 1 */
 楼主| yutingwei 发表于 2023-8-25 15:28 | 显示全部楼层
 楼主| yutingwei 发表于 2023-8-25 15:28 | 显示全部楼层
在main.c中编写超声波开始函数
  1. void Start()
  2. {
  3.         HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET);//拉高
  4.                
  5.         TIM1_Delay_us(20);
  6.                
  7.         HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);//拉低
  8. }
 楼主| yutingwei 发表于 2023-8-25 15:28 | 显示全部楼层
 楼主| yutingwei 发表于 2023-8-25 15:29 | 显示全部楼层
在主函数外定义变量
  1. int Cnt;//计数值
  2. float Distance;//距离
 楼主| yutingwei 发表于 2023-8-25 15:29 | 显示全部楼层
 楼主| yutingwei 发表于 2023-8-25 15:29 | 显示全部楼层
重写主函数
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_USART1_UART_Init();
  17.   MX_TIM1_Init();
  18.   /* USER CODE BEGIN 2 */
  19.        
  20.         HAL_TIM_Base_Start(&htim1);//开启定时器
  21.        
  22.   /* USER CODE END 2 */

  23.   /* Infinite loop */
  24.   /* USER CODE BEGIN WHILE */

  25.   while (1)
  26.   {
  27.                 /* 定时器1,通道1,模式随便,主要用于计数,没有使用边沿捕获 */       
  28.                 Start();//开启超声波模块
  29.                
  30.                 HAL_TIM_Base_Start(&htim1);//开启定时器

  31.                 //对超声波输入端口操作
  32.                 while( HAL_GPIO_ReadPin (Echo_GPIO_Port ,Echo_Pin) == GPIO_PIN_RESET);//等待输入电平拉高
  33.                
  34.                 __HAL_TIM_SetCounter(&htim1,0);
  35.                
  36.                 //对超声波输入端口操作
  37.                 while( HAL_GPIO_ReadPin (Echo_GPIO_Port ,Echo_Pin) == GPIO_PIN_SET);//等待输入电平变低
  38.                
  39.                 Cnt = __HAL_TIM_GetCounter(&htim1);
  40.                
  41.                 HAL_TIM_Base_Stop(&htim1);
  42.                
  43.                 Distance = Cnt*340/2*0.000001*100 ;
  44.                
  45.                 printf("Distance=%.1fcm\n",Distance);
  46.                
  47.                 HAL_Delay(500);
  48.                
  49.     /* USER CODE END WHILE */

  50.     /* USER CODE BEGIN 3 */
  51.   }
  52.   /* USER CODE END 3 */
  53. }
 楼主| yutingwei 发表于 2023-8-25 15:29 | 显示全部楼层
硬件连接
trig——PA2;
echo——PA11;
vcc——3.3v;
GND——GND;
 楼主| yutingwei 发表于 2023-8-25 15:29 | 显示全部楼层
烧录运行结果如下:
4055264e8586e3d303.png
chenho 发表于 2023-8-25 22:24 | 显示全部楼层
测距精度能到3mm?
daichaodai 发表于 2023-8-26 09:13 来自手机 | 显示全部楼层
HC-SR04大学时期用的第一个超声波模块就是这个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部