引脚
VCC:电源正极(一般为5V输入,也有3.3V输入)
GND:电源负极
TRIG:触发引脚
ECHO:接收引脚
原理
手动给(TRIG)触发引脚一个至少10us的高电平信号后,模块会自动循环发出8个40KHz的脉冲,即超声波,发出后ECHO引脚自动置为高电平,当超声波返回被模块接收时,ECHO引脚置低电平.
代码以及分析(代码学习->江协科技)
将Trig引脚配置在GPIO_Pin_7上:将引脚配置为推挽输出模式
Echo引脚配置在GPIO_Pin_6上:将引脚配置为下拉输入模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//Trig
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_7); //将引脚电平下拉
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //Echo
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
选择一个TIM作为计时器:
自动重装计时器设置 0~65535
预分频器设置 0~65535
TIM作为内部时钟频率为72MHz,通过预分频器进行720分频->计数器(CNT)每秒向上计数72MHz/7200(72000000/7200=10000)即每秒计10000个数,[当计数达到自动重装值60000时会产生中断信号并清零计数器(这里用不上)],以下代码可计数6秒.
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
/*配置时钟源*/
TIM_InternalClockConfig(TIM3);//选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数器模式,选择向上计数
TIM_TimeBaseInitStructure.TIM_Period = 60000-1; //ARR-自动重装计时器
TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1; //PSC-预分频器
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
//重复计数器,高级定时器才会用到
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
测距函数
将GPIO_Pin_7引脚置1延时15us后在置0:发送如下信号
GPIO_SetBits(GPIOA,GPIO_Pin_7);
Delay_us(15);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
根据原理发送触发信号后会有模块内部发出的信号,即超声波信号
此时输出回响信号置高电平且在未接收到返回超声波时一直为高电平:
所以当检测到GPIO_PIN_6引脚为高电平时开启计时器,当检测到GPIO_PIN_6引脚为低电平时关闭计时器
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==RESET){};
TIM_Cmd(TIM3, ENABLE);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)==SET){};
TIM_Cmd(TIM3, DISABLE);
然后将TIM3中计数器(CNT)的值读出即可计算距离:
CNT每秒计10000个数->超声波运动CNT/10000秒
声音的传播速度约为340m/s->超声波运动来回路程为340*CNT/10000米
总路程的一半为障碍物到超声波模块的距离->x = [转化为小数]1.0*340*100*CNT/10000/2(转化为厘米)
Cnt=TIM_GetCounter(TIM3);
Distance = Cnt * 1.7 ; //
TIM3->CNT=0;
Delay_ms(100);
由于没有触发定时器的中断使计数器CNT自动清零,所以最后要手动将TIM3->CNT置0,方便下次计算,最后延时一下防止循环中测距间隔太快.