首先简单了解一下hc-sr04的工作原理
首先我们给hc-sr04发送一个大于10us的信号,触发他工作,trigger
然后他会发送8个超声波用于测距,transmit
然后在接收返回的超声波,echo(很形象,回声的意思)
目标明确:
配置两个引脚,一个用于发送10us的高电平启动信号
另一个用于接收返回的回声信号,配置为上升沿中断和下降沿中断,当上升沿过来时,清零计数器打开定时 器,开始计数,当下降沿过来时,关闭定时器,取出计数值,等待下一次测距
这里选择pa3为触发信号,配置为gpio output
PA2配置为外部中断,注意选择上升沿和下降沿都中断,并且在nvic里面使能exti2,否则无法进入中断
接下来配置定时器
时钟源选择内部时钟,预分频值7200-1,便于计算,引脚配置完成
代码部分
void read_distance()
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(12);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
}
首先输出触发信号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==SET)
{
__HAL_TIM_SetCounter(&htim3,0);
HAL_TIM_Base_Start(&htim3);
}
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2)==RESET)
{
count=__HAL_TIM_GetCounter(&htim3);
distence=count*1.7;
}
}
然后接收echo,进入中断,判断是上升沿还是下降沿,调用Hal_GPIO_ReadPin读取是上升沿还是下降沿,上升沿就清零计数值打开定时器,最后计算距离值,我们设置的tim3的预分频值为7200,那么tim3的时钟频率就是72x10^6/7200,计数器里一个数就是1*10^-4秒,乘上340/2得到米为单位再乘上100得到厘米为单位。