1、超声波测距模块介绍
1、HC-SR04共四个引脚:VCC、GND、Trig、Echo,如下图
2、使用
1、通过gpio口向Trig引脚发送一个脉冲信号。
2、HC-SR04接收到脉冲信号后,就会向外发送一段超声波,模块会将echo拉高。
3、当模块接收到反射回来的超声波后,模块会将echo拉低。那么echo引脚高电平持续的时间,也就是超声波在往返途中消耗的时间。
知道超声波往返的时间,我们就可以算出距离。
给trig发送一个脉冲很简单。但是如何高效、精确的获取echo高电平持续的时间??答案是使用定时器输入捕获功能。
2、输入捕获
2.1、什么是输入捕获
1、当定时器输入通道上检测到上升沿或者下降沿时,立刻将此时刻计数器的数值记录到捕获寄存器中,以待程序稍后读取。
2.2、输入捕获的详细机制
1、每个输入通道都有它自己的捕获寄存器。
如上图,TI1FP1通过一个预分频器后接入捕获寄存器1上,TI2FP2通过一个预分频器后接入捕获寄存器2上。
3、一个输入捕获通道只能设置为上升沿或者下降沿,不能设置为双边沿。
4、假设我们启用了输入通道1的输入捕获模式,并且设置为上升沿捕获。定时器启动计数后,若输入到输入通道的TI1的信号出现了一个上升沿,边沿检测器就会立即检测到,随后触发信号就会通过TI1FP1传递到捕获寄存器1,捕获寄存器1编立刻将此时计数器的值复制到自身。这种叫做直接捕获。
5、如果我们还为此输入捕获开启了中断,还会触发中断HAL_TIM_IC_CaptureCallback
。这样我们在中断中读取捕获寄存器的值,就得到了上升沿出现时定时器的时刻。
6、只要再获得到下降沿出现的时刻,就能够知道高电平持续的时间了,这里我们就要使用间接捕获了,借助TI2的输入捕获寄存器2来保存下降沿时定时器计数器的值即可。
7、TI1和TI2可以相互借用,TI3和TI4可以相互借用。
3、使用
超声波模块echo引脚接在单片机PA10上,Trig引脚接在PA11上。
3.1、配置
1、设置TIM1的CH3为直接输入捕获,CH4为间接输入捕获:
2、设置定时器预分频值为72,定时器的时钟频率为1MHz,方便计算,CH3为上升沿捕获,CH4为下降沿捕获
3、开启捕获终中断
3.2、代码
int upEdge = 0;
int downEdge = 0;
float distance = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if((htim == &htim1)&&(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_4)){
upEdge = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_3);
downEdge = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_4);
distance = (downEdge - upEdge) * 0.034 / 2;//340m/s = 0.034cm/us
}
}
while (1)
{
//启动测距
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, 1);
HAL_Delay(1);
HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, 0);
__HAL_TIM_SET_COUNTER(&htim1, 0);
//等待测距完成
HAL_Delay(20);
sprintf(message,"juli:%.2fcm",distance);
OLED_PrintString(0, 0, message);
HAL_Delay(500);
}
3.3、效果
4、总结
使用STM32 TIM1 CH3 输入捕获中断,设置为上升沿捕获,来获取超声波模块echo变为高电平时刻;STM32 TIM1 CH4 输入捕获中断,设置为下降捕获,来获取超声波模块echo变为低电平时刻。计算高电平持续的时间进而算出距离。