超声波测距原理与代码实现详解
创作时间:
作者:
@小白创作中心
超声波测距原理与代码实现详解
引用
CSDN
1.
https://blog.csdn.net/qq_59510647/article/details/138501586
超声波测距是一种常见的非接触式测距方法,广泛应用于机器人、自动化设备等领域。本文将详细介绍基于HC-SR04模块的超声波测距原理、硬件接线、时序控制以及具体的代码实现,帮助读者快速掌握这一实用技术。
超声波测距
1. 测距原理基本说明
超声波测距模块通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。常用的型号是HC-SR04,其除了两个电源引脚外,还有TRIG(触发)和ECHO(回声)两个信号引脚。
2. 接线说明
- VCC 接 5V
- GND 接 GND
- TRIG 接 GPIO 0
- ECHO 接 GPIO 1
发波与接收机制
- 发波:给 TRIG 端口至少 10us 的高电平
- 开始发波判断:Echo 信号由低电平跳转到高电平
- 接收返回波判断:Echo 信号由高电平跳转回低电平
- 时间计算:Echo 引脚维持高电平的时间
- 距离计算:距离 = 速度(340m/s)* 时间 / 2
3. 时序说明
4. 时间函数
在实现中,需要使用高精度时间函数来准确测量超声波往返时间。以下是相关函数原型和结构体定义:
#include<sys/time.h>
int gettimeofday(struct timeval *tv,struct timezone *tz )
gettimeofday()//会把目前的时间用tv 结构体返回,当地时区的信息则放到tz所指的结构中
struct timeval
{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
测试代码
以下是一个测试代码示例,用于计算程序在当前环境中数数10万次耗时:
//计算程序在当前环境中数数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;
}
5. 代码实现和验证
以下是完整的代码实现,包括初始化、测距函数以及主循环:
#include <stdio.h>
#include <sys/time.h>//时间操作库,用于获取高精度时间
#include <wiringPi.h>// Wiring Pi库,用于树莓派的GPIO操作
#include <stdlib.h>
#include <unistd.h>
#define Trig 0//定义触发引脚为GPIO 0
#define Echo 1// 定义回声引脚为GPIO 1
// 函数用于测量距离并返回以厘米为单位的值
double getDistance()
{
double dis;//储存算出的距离
struct timeval start;//开始时间
struct timeval stop;//结束时间
pinMode(Trig, OUTPUT);// 设置触发引脚为输出模式
pinMode(Echo, INPUT);//设置回声引脚为输入模式
digitalWrite(Trig ,LOW);//触发引脚拉低
usleep(5);//维持5微秒低电平
digitalWrite(Trig ,HIGH);//将触发引脚拉高,发送超声波脉冲
usleep(10);//维持10微秒高电平
digitalWrite(Trig ,LOW);//再拉下去才是一个10微秒的方波
/*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;//根据超声波在空气中的传播速度(34000厘米/秒)和时间差计算距离
return dis;// 返回计算出的距离
}
int main()
{
double dis;
if(wiringPiSetup() == -1){//初始化wiringPi库,如果失败则打印错误并退出
fprintf(stderr,"%s","initWringPi error");
exit(-1);//异常退出程序
}
while(1){
dis = getDistance();// 调用函数测量距离
printf("dis = %lf\n",dis);
usleep(500000);// 暂停0.5秒,用于下一次测量
}
return 0;
}
5.1 验证结果
热门推荐
从《红玫瑰与白玫瑰》到《延禧攻略》:白月光的文化之旅
冬游婺源:江岭雪景与篁岭民俗的完美邂逅
网络借款防坑指南:教你安全借贷五步走
捷达VA3底盘揭秘:MQB平台的秘密武器
歼-20出口热议:性能超越F-35,中东国家为何如此执着?
南瓜的营养密码:富含β-胡萝卜素,守护视力与心脏
手机系统修复指南:从常见问题解决到专业修复工具的使用
2024版中国高血压防治指南发布,明确诊断标准和家庭测量规范
清热解毒又美容,腊梅花的多重功效与使用方法
四川张家界自驾游:两条三日游线路详解,附预算和注意事项
云南自驾游攻略:60岁以上老人享门票优惠,7天行程规划
理想很丰满,现实很骨感:老年人自驾游的五重困境
放屁臭是肠癌预警?教你辨别正常与异常,守护肠道健康
二战原子弹基地重获新生,美军布局西太平洋应对中国
传统风水遇上现代家居:如何用古老智慧提升居住品质
有片丨华润雪花啤酒诞生地沈阳获“中国啤酒之都”称号
辽宁本钢队六年四冠,CBA联赛展现统治力
打卡学习神器,让你养成学霸习惯!
最新研究:母乳喂养超过三个月可降低哮喘风险
北京明年禁行“老头乐”,多地跟进治理违规电动车
面部特征揭秘男性的健康密码
1-2万公里或3-6个月,汽车空调滤芯更换指南
营养专家:鸡胸肉应作为健康饮食一部分,而非单一减肥食物
低卡高蛋白饮食全攻略:从食材到注意事项
《一如既往》:23条永恒规律揭示人类社会不变的真相
来一场杭州之旅?三种交通方式从上海前往杭州
当归羊肉、山药枸杞:冬至必喝的四款养生汤
陆海英主任解读:胆碱酯酶偏高怎么办?
党参食疗,轻松应对胆碱酯酶偏高
从游戏评论到文化符号:“希望人没事”的网络梗进化史