网站设计搜索栏怎么做seo导航站
HC-SR04介绍
- 典型工作电压:5v (如果你的超声波模块没有工作,可以看一下是不是电压不够)
- 超小静态工作电流:<2mA
- 感应角度:<15° (超声波模块,是一个范围式的探索,所以在做测速等一些适合直线传播的项目的时候,不建议使用超声波模块)
- 探测距离:2cm-400cm
- 高精度:可以达到0.3cm
- 盲区:2cm (当物体和超声波模块的距离小于2cm,超声波模块失效)
工作原理
- 采用IO触发测距,给至少10us的高电平。
- 模块自动发送8个4kHz的方波,自动检测是否有信号返回。
- 有信号返回,通过IO输出一高电平,高电平的持续时间就是超声波从发射到返回的时间
测试距离=(高电平时间*声速)/2
因为声音会来回两段,所以要除以二,声速我们一般取340m/s
接口定义
Vcc,Trig(控制端),Echo(接收端),GND
向Trig发送10us以上的高电平,就可以在Echo等待高电平输出,一有输出就可以打开定时器计时,当Echo变为低电平时,就可以读定时器的值,此时就为此次测距的时间,就可以算出距离,不断周期性的测量,就可以达到你移动测量的值。
思路
- IO输出=》Trig,IO输入《=Echo
- 给Trig管脚一个>10us的高电平(启动)
- 启动后,Echo开启计时器计数,等待检验,进入while(Echo==1),当Echo不等于高电平的啥时候结束while,关掉计时器。
- 设开启定时器时间为T1,关闭定时器时间为T2,所得时间T即等于T2-T1,所以测距距离即为(T2-T1)*340/2
代码
配置Echo和Trig
void Echo_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Trig_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);
}
然后配置TIM2
void TIM2_Count_Configuration(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_Cmd(TIM2, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, DISABLE);
}
在define几个等下用到的函数
#define TRIG_H GPIO_WriteBit(GPIOA,GPIO_Pin_9,Bit_SET)
#define TRIG_L GPIO_WriteBit(GPIOA,GPIO_Pin_9,Bit_RESET)#define ECHO GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
main
int main(void)
{unsigned int time = 0;float distance = 0.00;void Echo_Configuration();void Trig_Configuration();void TIM2_Count_Configuration();RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);while(1){TIM_Cmd(TIM2,ENABLE);TRIG_H;Delay_us(15);TRIG_L;while(ECHO == 0);TIM_SetCounter(TIM2,0);while(ECHO == 1);TIM_Cmd(TIM2,DISABLE);time = TIM_GetCounter(TIM2);distance = time * 0.017;printf("Distance = %.2fcm\n", distance);Delay_us(1000000);}
}
- 配置Echo,Trig和TIM2,使能RCC_APB1Periph_TIM2
- TIM_Cmd(TIM2,ENABLE) 使能TIM2
- TRIG_H 给TRIG高电平,等待15us,TRIG_L给TRIG低电平
- while(ECHO==0) 如果ECHO为低电平,就复位TIM2为0
- while(ECHO==1) 如果ECHO为高电平,TIM_Cmd(TIM2,DISABLE);关闭TIM2
- time = TIM_GetCounter(TIM2);记录时间为time
- 计算距离distance = time * 0.017;