STM32——超声波测距模块(HAL库CubeMx)

1. 超声波测距模块原理

(2021/11/28 16:25编辑)
超声波测距模块有Trig引脚和Echo引脚来进行测距,当Trig引脚拉高大于11us之后触发超声波测距模块,Echo引脚变高,随后发出超声波,经过反弹回来接受到回来的超声波之后Echo引脚会变低
距 离 = E c h o 引 脚 从 高 变 低 的 时 间 ∗ 声 速 距离=Echo引脚从高变低的时间*声速 =Echo
(2021/11/28 16:35编辑结束)

2. CubeMx配置

在这里插入图片描述

3. 代码的编写

(2021/11/28编辑)

3.1 定时器计时的计算

  • 定时器计时的时间=计数值(CNT)分频数(PSC)/晶振频率(72M)+周期数周期(单位:S)
  • 比如:我如下代码我返回的时间是us,晶振是72MHZ,PSC是7200-1,CNT是10000-1,所以我一个周期就是(PSC+1)(CNT+1)/72M=1S,计数一次的时间是:(PSC+1)/72M=1/10000说明一秒中振荡10000次,所以计数一次是(1/10000)S,所以换算成us的时候要计数值100
  • 具体可以看我的文章:STM32——定时器TIM(重中之重)
/*
** 函数功能:获取定时器计时的时间
** 参    数:定时器句柄htimx
** 返 回 值:定时器计算的时间(单位:us)
** 作   者: LJF
*/
uint32_t Get_TIM_Time(TIM_HandleTypeDef* htimx)
{
    uint32_t time;
    /*时间=当前定时器计数值*计数一次所需要的时间+周期数*周期*/
    time=htimx->Instance->CNT*100+Time_Sound_Interrupt*TIM_T;
    Time_Sound_Interrupt=0;//周期计数变量手动置0
    htimx->Instance->CNT=0;//定时器计数寄存器置0
    return time;
}

参考文章:
STM32定时器的预装载值和预分频系数如何确立
STM32的定时器定时时间计算(计数时间和中断定时时间)
(2021/11/28 1:24编辑结束)

3.2 接口函数

/*
** 函数功能:超声波测距
** 参    数:定时器句柄*htimx、
** 返 回 值:测试出来的最终距离(单位:cm)
** 作   者: LJF
** 说   明:
*/
float HCSR04_GetDistant(TIM_HandleTypeDef* htimx,GPIO_TypeDef *Trig_GPIO_Port, uint16_t Trig_Pin,GPIO_TypeDef *Echo_GPIO_Port, uint16_t Echo_Pin)
{
    uint32_t times=0;

    HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_SET);//拉高Trig
    delay_us(11);               	//将Trig拉高至少10us
    HAL_GPIO_WritePin(Trig_GPIO_Port,Trig_Pin,GPIO_PIN_RESET);//拉低Trig
    
    while (HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin)==GPIO_PIN_RESET);//等待高电平              
    HAL_TIM_Base_Start(htimx);     //开启TIMx开始计时
    HAL_TIM_Base_Start_IT(htimx);  //使能TIM2中断
    while (HAL_GPIO_ReadPin(Echo_GPIO_Port,Echo_Pin)==GPIO_PIN_SET);//等待低电平
    HAL_TIM_Base_Stop(htimx);      //关闭TIMx停止计时
    HAL_TIM_Base_Stop_IT(htimx);  //使能TIM2中断
	
    times=Get_TIM_Time(htimx);          //获取TIMx的时间
	printf("times=%d\r\n",times);
    return  times*0.017;//0.017=340/2/1000000*100
}
  • 11
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
摘要:超声波测距是一种典型的非接触测量方式,应用非常广泛。本文提出了一种基于STM32单片机的高精度超声波测距方案。与传统单片机相比,STM32的主频和定时器的频率可以通过PLL倍频高达72MHz,高分辨率的定时器为高精度的测量提供了保证。超声波的发射使用定时器的PWM功能来驱动,回波信号的接收使用定时器的输入捕获功能,开始测距时,定时器的开启将同时启动PWM和输入捕获,完全消除了启动发射和启动计时之间的偏差,提高了测量精度。为使回波信号趋于稳定,设计了时间增益补偿电路(TGC),在等待回波的过程中随着时间的推移需要将放大器的增益值不断增大,通过实验获取不同距离需要设置的增益值,对应不同时间需要设置数字电位器的增量,并将该参数固化在单片机的FALSH中,在测距过程中,根据时间查询电位器增量表改变电位器阻值,实现回波信号的时间补偿,提高了测量的精度。为了在减小盲区的同时而不减小测量范围,设计了双比较器整形电路分别处理近、远距离的回波信号,近距离比较器可以有效屏蔽超声波衍射信号从而减小了测量盲区。传统的峰值检测方法大多通过硬件电路实现,设计较复杂,稳定性差。本文通过软件算法对回波信号进行峰值时间检测。不仅简化了电路,降低了成本,而且提高了系统的稳定度。经研究表明,该系统测量精度达到了lmm,盲区低至3cm,量程可达500cm。本系统在近距离测试时,系统的精度较理想,可作为停车时的倒车雷达使用,也可以用于液面检测(油箱液位),还可以用于自动门感应,机器人视觉识别等。如果多使用几个测距仪,将这些集成一个大系统,那么整个大系统可用于定位避障。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值