目录
1、HC-SR04超声波模块说明
1.1 超声波测距原理
让它发送波:给Trig端口至少10us的高电平
开始发送波:Echo信号由低电平跳转到高电平
接收返回波:Echo信号由高电平跳转回低电平
计算时间:Echo引脚维持高电平的时间!
开始发送波,启动定时器,接收到返回波,停止计时器
计算距离:测试距离=(高电平时间*声速(340m/s))/2
1.2 超声波的时序图
2、时间函数
2.1 函数原型
#include <sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中。
struct timeval
{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
2.2、测试代码(time.c)
#include <stdio.h>
#include <sys/time.h>
//#include<sys/time.h>
//int gettimeofday(struct timeval *tv,struct timezone *tz )
//struct timeval
//{
//long tv_sec;/*秒*/
//long tv_usec;/*微妙*/
//};
void cnttime()
{
int i,j;
for(i=0;i<100;i++){
for(j=0;j<10000;j++){
}
}
}
int main()
{
struct timeval timestart; //定义结构体开始时间
struct timeval timestop;//定义结构体结束时间
gettimeofday(×tart,NULL);
cnttime();
gettimeofday(×top,NULL);
long timediff = (timestop.tv_sec-timestart.tv_sec)*1000000+(timestop.tv_usec-timestart.tv_usec);//这是将单位化为微妙
printf("raspberryPi count 100W time:%ld\n",timediff);//在树莓派上数100w次需要多少微妙
return 0;
}
运行结果:
3、超声波代码实现(csb.c)
● 重点提醒:
① 代码编写一定要结合时序图分析过程;
② 计算波在空气中的时间,要尽量统一把时间单位换算成微妙。
#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>
#define Trig 0
#define Echo 1
double get_distance()//double定义距离,比float精度更高
{
double distance;
struct timeval start;
struct timeval stop;
pinMode(Trig,OUTPUT);//输出,发送波
pinMode(Echo,INPUT);//输入,接收波
digitalWrite (Trig, LOW);//结合时序图,低电平上先维持5us
usleep(5);
digitalWrite (Trig, HIGH);//上到高电平 维持10us
usleep(10);
digitalWrite (Trig, LOW);//最后拉到低电平,完成整个放波流程
/*以上是对超声波进行初始化*/
while(!digitalRead(Echo));//卡点,当变为高电平的时候就跳出循环。
gettimeofday(&start,NULL);
while(digitalRead(Echo));
gettimeofday(&stop,NULL);
long diffTime = (stop.tv_sec-start.tv_sec)*1000000+(stop.tv_usec-start.tv_usec);
//long diffTime = 1000000*(stop.tv_sec - start.tv_sec)+(stop.tv_usec - start.tv_usec);
distance = diffTime*34000/2000000; //记住时间很小,如果不先乘的话就会为0,所以先乘\
以34000,也可以用(double)强制转换, 距离 = 时间 * 速度(340m/s)/ 2 注意单位换算
return distance;
}
int main()
{
double dis;
if(wiringPiSetup()==-1){ //wiringPi库初始化
fprintf(stderr,"%s","initWringPi error"); //将错误打印出来
exit(-1);
}
while(1){
dis = get_distance();//距离值
printf("dis = %lf\n",dis);//双精度用lf%
usleep(500000);
}
return 0;
}
运行结果: