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

超声波测距

  • 1. 超声波测距模块原理
  • 2. CubeMx配置
  • 3. 代码的编写
    • 3.1 定时器计时的计算
    • 3.2 接口函数

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配置

STM32——超声波测距模块(HAL库CubeMx)_第1张图片

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
}

你可能感兴趣的:(单片机,stm32,单片机,arm)