1 超声波测距模块原理
超声波测距模块有4个引脚,VCC接3.3~5v电源,Trig是触发信号引脚,Echo是接收信号引脚
普通的超声波测距模块工作原理都一样,工作时序图如下:
在Trig引脚输入至少10us的高电平就能触发超声波测距模块,在Echi引脚会返回一段持续的高电平,该高电平持续时间就是超声波从发射到返回的传播时间,因此:测量距离=高电平时间*声速(340m/s)/2
使用该模块的难点即如何测量高电平的时间,测量高电平时间有两种方法:
1、采用定时器输入捕获功能
2、采用一普通定时器进行计时
方法一较为复杂,因此本文采用方法二
2 配置程序
本文采用硬石电机控制板(STM32F407igt6)作演示,任何32板子都一样,只需要使用两个引脚和一个定时器
首先选择芯片
选择一调试方法
修改时钟,采用外部晶振
选用基础定时器6,基础定时器最高时钟频率为84Mhz,因此将分频系数设置为84-1,计数器周期设置为10-1
打开定时器6全局中断
在上图右下角处搜索需要使用的引脚,所搜索的引脚会变黑,如2处所示,点击2处将该引脚设置为GPIO_OUTPUT,再在红色框处设置该引脚为下拉输出,并将名称改为Trig
同理,将PB3设置为下拉输入模式
时钟设置时,直接在输入最大时钟频率168Mhz按回车,其他时钟自动配置
最后打开生成代码,在图示界面加入以下代码:
其中distance得到的数据即为测量的距离,可以通过串口打印出来,使用CubeMX时,用户程序要写在USER_CODE_BEGIN和USER_CODE_END之间,这样可以避免重新生成代码时覆盖已有内容
uint16_t time_out=0;
uint16_t time_count=0;
uint16_t time_count_end=0;
float distance=0;
void ultra(void)
{
HAL_TIM_Base_Start_IT(&htim6);
/*------------------------触发---------------------------*/
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET);
HAL_Delay(20);
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET);
/*-----------------------接收----------------------------*/
/*等待电平变高进行计时,设置超时时间避免陷入死循环*/
while(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin)==0)
{
time_out++;
if(time_out>=30000) break;
}
time_count=0;
/*电平变低停止计时,同样设置超时时间*/
/*最大超时时间根据超声波最大测量距离设置*/
while(HAL_GPIO_ReadPin(Echo_GPIO_Port, Echo_Pin)==1)
{
if(time_count>=2355) break;
}
time_count_end=time_count;
/*计算测量距离*/
distance=time_count_end*10*340/2;
distance=distance/1000;
/*关闭定时器,避免持续占用资源*/
HAL_TIM_Base_Stop_IT(&htim6);
}
//定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim==(&htim6)){
time_count++;
}
}
超声波模块有时候测量的数据为一常数,这个时候需要重新上电,这样测量值就恢复正常了