HY-SRF05超声波测距模块的使用
测距模块介绍
- VCC和GND:接电源的正负极,也可接单片机的5V或3.3V,注意与单片机共地
- Trig:触发控制信号输入。通过这个引脚输入10us以上的高电平触发信号,然后模块自动发送8个40KHz的方波进行一次测距。
- Echo:回响信号接收。该引脚可以在接收到回响信号后输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
- OUT:该引脚在手册中提到为开关量输出,可以做报警模块使用,应该是一个模块状态口,通过判断OUT的高低电平来判断模块是否上电,基本不用。
- 时序图
距离=高电平持续时间340/2*
代码说明
- 先利用基本定时器6实现微秒级别的延时函数,再在此基础上完成控制信号发送
延时函数
void Delay_us(uint16_t myus)//基于TIM6定时器的μs级延时函数
{
uint16_t differ = 0xffff-myus-5;
HAL_TIM_Base_Start(&htim6);
__HAL_TIM_SetCounter(&htim6,differ);
while(differ < 0xffff-5)
{
differ = __HAL_TIM_GetCounter(&htim6);
}
HAL_TIM_Base_Stop(&htim6);
}
控制信号发送
void Send_Trig(void)
{
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, SET);
Delay_us(20);
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, RESET);
}
- 利用通用定时器6的输入捕获功能测出高电平持续时间
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim3)
{
switch(polarity)
{
case PO_Rising:
{
Period_Num=0;
Capture_Value1=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);
polarity=PO_Falling;
break;
}
case PO_Falling:
{
Capture_Value2=HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);
Distance_Value[Distance_Num]=(Capture_Value2+Period_Num*65536-Capture_Value1)*170/1000;
Distance_Num++;
if(Distance_Num>=100)
Distance_Num=0;
__HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);
polarity=PO_Rising;
break;
}
}
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==&htim3)
{
Period_Num++;
}
}
- 主函数循环里实现初始化和周期测距,周期须大于60ms
polarity=PO_Rising;
Distance_Num=0;
Period_Num=0;
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, RESET);
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Send_Trig();
HAL_Delay(100);
}
- 一些全局变量定义和函数声明
/* USER CODE BEGIN PD */
#define PO_Rising 1
#define PO_Falling 2
/* USER CODE END PD */
/* USER CODE BEGIN PV */
uint8_t polarity;
uint16_t Capture_Value1;
uint16_t Capture_Value2;
float Distance_Value[100];
uint16_t Distance_Num;
uint16_t Period_Num;
/* USER CODE END PV */
/* USER CODE BEGIN PFP */
void Delay_us(uint16_t myus);
void Send_Trig(void);
/* USER CODE END PFP */
一定要记得开启定时器输入捕获中断
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
- 图形化配置
记得开启中断
经实际测距发现,同一距离下的测量最大值和最小值差值最大为30mm 左右,并有部分数据出现溢出