基于stm32的超声波测距

本文介绍了一种超声波测距模块的实际应用案例,包括模块的基本参数、测距原理及程序实现方法。通过STM32单片机控制,实现了稳定的距离测量,并探讨了提高测距精度的方法。

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

首先来看模块图 

 

在某宝上一搜就能找到,关于它的使用也是非常简单,先看数据手册里面需要注意的几点 

 

1 基本的参数

 

  在实际测试当中,最大测量三米多的距离还是可以,最小距离我没有做测试,我测的最小距离是50厘米,再往下没有继续测。 

 

2 测距的基本原理 

 

 

这里的基本原理其实应该是它的使用方法,如果你仔细看它的数据手册会发现这种测距模块还有另外一种使用方法:USART通信。

看文字不是很直观,简单粗暴来看图

 



 

在写程序的时候没有使用USART的方法,因为上图的这种驱动方式我认为比较简单,后面的程序也是按照这个时序图来编写的。


注意:上图中关于测距的公式,在程序中我没有使用他给的公式,这一点在后面会提到。


3 实物图的连接 
实物图的连接就不上图了,购买此模块的时候一般卖家会给你相应的资料。 
 

 

 

直接上程序:

主函数:

 

int main(void)
{
	  unsigned int count=0;
	  float distance=0;
	  float distancebuf[]={0}; //这里的数组没有意义,是在调试程序的时候,怕测的距离有误差,把连续几次测到的数值放入数组中求平均值,以提高精度
		/* USART1 config 115200 8-N-1 */
    USART1_Config();
    Distance_Config();  //距离转换函数,在上面的说明中有提到,但是具体的实现和上面的公式是不相同的
    CLI() ;//关闭总中断
	  SEI(); //开启总中断
	  Tim3_Config();  //定时器初始化
	
	  
	  GPIO_ResetBits(GPIOA,GPIO_Pin_5);  //先拉低电平
	
	  while(1)
		{
    
			  GPIO_SetBits(GPIOA,GPIO_Pin_5);  //再拉高电平,这里拉低拉高电平是根据上面给出的测距原理来写的
			  Delay(30);  //延时30个us,注意这里使用的是粗略的延时函数,测距原理中说是延时10个us,这里给30个us也无妨
			//  Delay(20);
			//  Delay(20);
			 GPIO_ResetBits(GPIOA,GPIO_Pin_5); 

       TIM3->CNT=0;  //TIM3的计数器清零

       while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 0); //等待ECHO的高电平
		

       TIM_Cmd(TIM3,ENABLE);  //运行TIM3进行计数
       
			while((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 1) && (TIM3->CNT < TIM3->ARR-10));
			 
			  TIM_Cmd(TIM3,DISABLE);  
       		
        count=TIM3->CNT;

        printf("count=%d",count);			
			  distance=ChangeDistance(count);
			  printf(" µ±Ç°¾àÀëΪ£º%f\n",distance);
			  Delay(20000); 
				Delay(20000); //这里的延时没有具体的意义,可以去掉
			  while(1);  //程序测距一次后卡死在这里
				
     }
}

距离转换函数

 

 

float ChangeDistance(unsigned int cout1)
{
    float distance=0;
	  printf("cou1=%d\n",cout1);
	  distance=cout1/58.0;
	
	  return distance;
}

参数是TIM3->CNT的计数,也就是高电平的时间,distance是测距距离

 

 

注意:distance的单位是厘米
 

关于转换的公式为什么是cout1/58.0  这里我也不是很清楚安静安静安静

 

另外:当ECHO引脚输出高电平后,另一种思路是采用上升沿触发定时器中断的方式来计算高电平时间的,我认为没有必要再配置一次中断,使用while()来等待这个高电平的方法完全可以。当然不容忽视的一个问题是,如果始终检测不到高电平,程序会卡死在while()语句这里,因此有必要加上一个时间的判断。

 

通过串口打印相应的测量结果。

 

模块的资料就不上传了,在某宝店里一般都有相应的下载链接。

 

其他的具体细节,例如定时器的配置,引脚的配置请参考我上传的程序,如有疑惑欢迎留言。

http://download.youkuaiyun.com/detail/qq_27312943/9541979

 

注意:1 有的超声波模块是有温度校准的,有温度校准的模块测距精度要高一些。

            2 模块再稳定下来之后测距是比较准确的,即便是我上面写的代码,也需要稳定一下再测距才可以,举个例子,当你将超声波模块对着墙时,刚上电测到的距离并不准确,但是很短时间后测距就会变得非常精准。

           3 上面的程序采用的是电平触发的方式,我看到有的说使用串口的方式会使精确度更高,但我没有做相关的实验。

           4 想要提高测距精度的另一种方法就是多次测量,去掉最大值,最小值后取平均值的方法,我在另一份程序中采用的是测五次距离,然后取出平均值得方法,需要注意多次测量的周期最好大于60ms

 

________________________________________________________________________________________________

链接:https://pan.baidu.com/s/1YUMvCvMKTJwBTenTyZuSeQ 
提取码:rvm7 
复制这段内容后打开百度网盘手机App,操作更方便哦

百度链接放在了上面,一个一个的发实在是来不及,没有发到的,对不起大家了。

谢谢大家的抬爱,给我评论,但是这个博客我以后不打算再继续更新了。

说一下我目前的状态吧,在某个211大学读研究生,但是老师不是做硬件方向的,所以我自己很纠结。

最后祝福大家新年快乐。

评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值