超声波传感器HCSR04

应运:粮仓,油罐(页面平整)。不可用测速或者点对点的测距

1 产品特色:

1、典型工作用电压:5V。

2、超小静态工作电流:小于 2mA。

3、感应角度:不大于 15 度 。

4、探测距离:2cm-400cm

5、高精度:可达 0.3cm。

6、盲区(2cm)超近。

2. 接口定义:

Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd

产品使用方法:控制口发一个 10US 以上的高电平,就可以在接收口等待高电平输出.一

有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距

的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。

3. 模块工作原理:

(1)采用 IO 触发测距,给至少 10us 的高电平信号; (IO口输出)

(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;

(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是(IO口输入测量高电平时间)

(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;

在这里插入图片描述

1. 采用 IO 触发测距,给至少 10us 的高电平信号; (IO口输出)
2. Echo等待检测,等到echo为高电平时,开启定时器的计数一
3. while(Echo);
4. 关定时器 -> T(s) * 364 / 2
#define TRIG_H GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET)
#define TRIG_L GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET)

#define ECHO	GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)


void TIM2_Count_Configuration(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	// 65535 * 0.000001 * 340 / 2 = 11.14095m 大于其最大测距,计数器永远不会溢出。所以不需要中断
	TIM_TimeBaseStructure.TIM_Period = 0xFFFF;  // 65535
	TIM_TimeBaseStructure.TIM_Prescaler = 71;  //71+1= 72分频 -> 0.000001
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

	TIM_Cmd(TIM2, ENABLE);
	//暂时先关闭TIM2时钟,等全部初始化结束后正式使用定时器前再开启
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
}


//PB6(output):TRIG   PB7(input):ECHO
void HCSR04_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

float get_len()
{
    TIM_Cmd(TIM2, ENABLE);
    TRIG_H;
    u8 time;
    float dis;
    Delay_us(15);
    TRIG_L;
    while (ECHO == 0);
    //定时器的计数器清0
    TIM_SetCounter(TIM2,0);
    while (ECHO == 1);
    TIM_Cmd(TIM2, DISENABLE);
    time = TIM_GetCounter(TIM2);
    dis = time * 0.034 / 2; //米转厘米
    Delay_us(100000);
    return dis;
}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值