学习笔记12

 

引脚

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,方便下次计算,最后延时一下防止循环中测距间隔太快.

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值