基于HAL库的STM32超声波测距模块(白话文)

非输入捕获教程

定时器的配置

在这里插入图片描述
在这里插入图片描述
同样的操作你们试试TIM3
在这里插入图片描述
在这里插入图片描述
每1us,CNT++;CNT加到65535就会溢出,产生中断。
所以可以将PSC ARR当作两次时钟分频,两次分频乘积/72MHZ 就是
每隔这么多时间定时器就中断一次
但arr中设置的count可以检测出来。因此,我们就将预分频系数设为72-1,此时为1us一个时钟周期,再设置arr为65535,这样我们最多可以计数65535us,完全够超声波的计时了。并且中断次数少,不会太影响程序进程。

串口printf准备工作

在这里插入图片描述
在 USER CODE BEGIN 4 中写
(注意还要添加头文件stdio.h)

int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
	//采用轮询方式发送一个字节的数据,没有发送成功就一直等待
	return ch;
}
int fgetc(FILE *f)
//int fgetc(int ch, FILE *F)
{
	uint8_t ch;
	HAL_UART_Receive (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
	return ch;
}

此后,就可以在主函数中使用printf函数打印数据用串口显示啦,如果还不懂可以参考下我之前的博客
link:串口全讲解

生成代码后main.c的工作

us级定时

us级定时的三种方法

/* USER CODE BEGIN 4 */
void user_delaynus_tim(uint32_t nus)
{

 uint16_t  differ = 0xffff-nus-5;
 //设置定时器2的技术初始值
  __HAL_TIM_SetCounter(&htim3,differ);
  //开启定时器
  HAL_TIM_Base_Start(&htim3);

  while( differ<0xffff-5)
 {
  differ = __HAL_TIM_GetCounter(&htim3);
 };
 //关闭定时器
  HAL_TIM_Base_Stop(&htim3);
}
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define Trig_H  	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_SET );   
#define Trig_L  	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,GPIO_PIN_RESET );   
   

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
uint16_t count;
uint16_t distance;
uint16_t  time;
uint16_t i;
/* USER CODE END PM */
while (1)
  {
		printf("准备中\r\n");
		HAL_Delay (500);
		Trig_H ;
		user_delaynus_tim(12);
		Trig_L ;
		  //开启定时器
        HAL_TIM_Base_Start(&htim3); 
		while( HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_2) != GPIO_PIN_SET)
			;
		__HAL_TIM_SetCounter(&htim3,0);
	//	printf("准备完毕开始测试\r\n");
		/* 打开中断,对Echo高电平时间计时 */
		while(HAL_GPIO_ReadPin (GPIOB ,GPIO_PIN_2) == GPIO_PIN_SET)
			;
		//关闭定时器
		count = __HAL_TIM_GetCounter(&htim3);
        HAL_TIM_Base_Stop(&htim3);
	  /* 关闭中断,通过参数time来取得距离参数 */
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 distance = (uint16_t )count*0.017;
		 i++;
		 printf("第%d次的距离为 %d \n\r",i,distance);
  }
  /* USER CODE END 3 */
}

完成以上步骤,就可以在串口调试助手中看见超声波测试的距离啦

在这里插入图片描述

输入捕获教程

待更ing

  • 12
    点赞
  • 110
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值