超声波测距原理与代码实现详解
创作时间:
作者:
@小白创作中心
超声波测距原理与代码实现详解
引用
CSDN
1.
https://blog.csdn.net/qq_59510647/article/details/138501586
超声波测距是一种常见的测距技术,广泛应用于机器人、自动化设备等领域。本文将详细介绍HC-SR04超声波测距模块的工作原理、接线方式以及具体的代码实现,帮助读者快速掌握这一实用技术。
超声波测距
1. 测距原理基本说明
超声波测距模块通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离。HC-SR04是常用的超声波测距模块型号,除了两个电源引脚外,还有TRIG(触发)和ECHO(回声)两个信号引脚。
2. 接线方式
- VCC接5V电源
- GND接地
- TRIG接GPIO 0
- ECHO接GPIO 1
发波与接收原理
- 发波:给TRIG端口至少10us的高电平
- 开始发波判断:ECHO信号由低电平跳转到高电平
- 接收返回波判断:ECHO信号由高电平跳转回低电平
- 时间计算:ECHO引脚维持高电平的时间
- 距离计算:距离 = 速度(340m/s)* 时间 / 2
3. 时序图
(时序图部分原文未提供具体内容,可以补充相关时序图以增强理解)
4. 时间函数
在Linux系统中,可以使用gettimeofday函数获取高精度时间。该函数原型如下:
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
其中,struct timeval结构体定义如下:
struct timeval {
long tv_sec; /* 秒 */
long tv_usec; /* 微秒 */
};
下面是一个测试代码示例,用于计算程序在当前环境中数数10万次耗时:
#include <sys/time.h>
#include <stdio.h>
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>
#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);
digitalWrite(Trig, HIGH);
usleep(10);
digitalWrite(Trig, LOW);
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;
}
5.1 验证结果
(验证结果部分原文未提供具体内容,可以补充实际测试数据或现象描述)
热门推荐
强迫症自愈的最佳方法
守护一江碧水东流 筑牢上游生态屏障
秋季牛仔裤搭配:休闲与时尚的完美融合
花梨木菜板用前的养护吗
车辆报废注销步骤及必备材料清单
SSL证书是什么?SSL证书对SEO的影响
成年人也值得好好活着:如何培养并保鲜一个爱好
一线城市去化周期回归合理,房地产市场迎来新机遇
从"谋女郎"到百亿影后,周冬雨的逆袭人生太精彩!
内分泌失调吃什么调整?
CT扫描在肺部疾病诊断与观察中的应用
网站信息维护怎么进行内容更新?
凉皮减肥期间可以吃吗?一文解答你的疑惑
事业单位退休员工死亡,手续该如何办理?
显示器尺寸选购指南:从需求到体验全方位解析
百度智能汽车事业部总经理顾维灏加盟 长城汽车智能驾驶再添悍将
各大银行存款利息2025最新利率表一览表
空调的功率,3匹空调的功率
穆斯林为什么不吃猪肉?史上最正确的解读!
手术室精益管理:打造高效安全的医疗环境
基因编辑疗法新突破,「治愈」90%以上的血液遗传病
苏轼《后赤壁赋》中的神来之笔
解密历史谜团:袁崇焕杀毛文龙背后的真相
伊朗的地理环境如何?
医院洗牙为什么比外面贵?从硬件到服务的全面解析
计算机网络体系结构详解:从快递网络到五层协议
法律职业资格证考试的题型有哪些?
老撕鸡车祸:网络谣言的法律责任与社会影响
鼻子在生活中的多面展现:呼吸感知、文化艺术之窗
MATLAB绘图技巧:让你的图表更专业