应运:粮仓,油罐(页面平整)。不可用测速或者点对点的测距
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;
}