超声波模块
工作原理
- 单片机引脚触发Trig测距,给至少 10us 的高电平信号;
- 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
- 有信号返回,通过 IO 输出一高电平,并单片机定时器计算高电平持续的时间;
- 超声波从发射到返回的时间.
- 计算公式:测试距离=(高电平时间*声速(340M/S))/2
gettimeofday函数
-
我们可以使用c库函数gettimeofday()函数来得到精确时间,它可以返回自1970-01-01 00:00:00到现在经历的时间,它的精度可以达到微妙。
-
函数原型
#include<sys/time.h> int gettimeofday(struct timeval*tv,struct timezone *tz )
-
tv是保存获取时间结果的结构体:
struct timeval{ long int tv_sec; // 秒数 long int tv_usec; // 微秒数 }
-
tz用于保存时区结果(不用传NULL即可):
struct timezone{ int tz_minuteswest;/*格林威治时间往西方的时差*/ int tz_dsttime;/*DST 时间的修正方式*/ }
代码编写
#include<stdio.h>
#include<wiringPi.h>
#include<sys/time.h>
#define Trig 22
#define Echo 23
int init()
{
if (wiringPiSetup()==-1){ //wiringPi初始化
printf("wiringPiSetup no up!\n");
return -1;
}
pinMode(Trig,OUTPUT); // 设置引脚输出
pinMode(Echo,INPUT); // 设置引脚输入
}
float howLong()
{
long start; // 开始的时间
long stop; //结束的时间
float dis; //距离
struct timeval tv1; // 开始接收信号时间的结构体
struct timeval tv2; // 最后接收信号时间的结构体
digitalWrite(Trig,LOW); //给10us高电平
delayMicroseconds(2);
digitalWrite(Trig,HIGH);
delayMicroseconds(10);
digitalWrite(Trig,LOW);
while(!digitalRead(Echo)==1){ // 开始接受信号
gettimeofday(&tv1,NULL); // 获取开始接收信号的时间
}
while(!digitalRead(Echo)==0){ // 高电平结束
gettimeofday(&tv2,NULL); // 获取 最后接收信号的时间
}
start = tv1.tv_sec *1000000 + tv1.tv_usec; // 换算成微秒
stop = tv2.tv_sec *1000000 + tv2.tv_usec;
dis = (float)(stop-start)/ 1000000 * 34000/ 2; // 算出距离
return dis;
}
int main()
{
init();
while(1){
printf("h = %0.2f cm\n", howLong()); // 获取的距离 精确到两位小数点
delay(2000);
}
return 0;
}