超声波测距模块是用来测量距离的一种产品,通过发送和收超声波,利用时间差和声音传播速度, 计算出模块到前方障碍物的距离
1.测距原理:
给Trig端口至少10us的高电平发送声波,Echo信号,由低电平跳转到高电平,开始发送波;Echo,由高电平跳转回低电平,表示波回来了
计算时间:Echo引脚维持高电平的时间!声波发出去的那一下,开始启动定时器声波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
计算距离:
距离=速度(340m/s)*时间/2
2. 时间函数
#include int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
1. timeval 结构体定义:
struct timeval{
long tv_sec; /*秒*/
long tv_usec; /*微妙*/
};
2. timezone 结构定义:
struct timezone{
int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
int tz_dsttime; /*type of DST correction*/
}:
代码实现:
//计算程序在当前环境中数数10万次耗时多少
#include <sys/time.h>
#include <stdio.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )
void mydelay()
{
int i,j;
for(i=0;i<100;i++){
for(j=0;j<1000;j++);
}
}
int main()
{
struct timeval startTime;
struct timeval stopTime;
gettimeofday(&startTime,NULL);
mydelay();
gettimeofday(&stopTime,NULL);
long diffTime = 1000000*(stopTime.tv_sec - startTime.tv_sec) +
(stopTime.tv_usec - startTime.tv_usec);
printf("全志H6的Linux数100000耗时%ldus\n",diffTime);
return 0;
}
3.实现超声波实时返回距离
getDistance()函数实现声波测定距离,主函数main()中获取并打印,sleep()控制每次测定距离的间隔
double getDistance()
{
double dis;
struct timeval start;
struct timeval stop;
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
digitalWrite(Trig ,LOW);
usleep(5);
digitalWrite(Trig ,HIGH);
usleep(10);
digitalWrite(Trig ,LOW);
/*above init CSB*/
while(!digitalRead(Echo));
gettimeofday(&start,NULL);
while(digitalRead(Echo));
gettimeofday(&stop,NULL);
}
long diffTime = 1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec -
start.tv_usec);
printf("diffTime = %ld\n",diffTime);
dis = (double)diffTime/1000000 * 34000 / 2;
return dis;
int main(){
double dis;
if(wiringPiSetup() == -1){
fprintf(stderr,"%s","initWringPi error");
exit(-1);
}
while(1){
dis = getDistance();
printf("dis = %lf\n",dis);
usleep(500000);
}
return 0;
}