超声波测距原理与代码实现详解
创作时间:
作者:
@小白创作中心
超声波测距原理与代码实现详解
引用
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 验证结果
(验证结果部分原文未提供具体内容,可以补充实际测试数据或现象描述)
热门推荐
天庭什么样子?揭秘神仙居住的神秘层次,三清四御居住在哪?
英语人才培养中跨文化交际能力的重要性探究
瓷质抛光砖划痕怎么修复?瓷质抛光砖划痕修复方法介绍
愈酚甲麻那敏颗粒流鼻涕能吃吗
相变储能材料引领储能技术革命,助力可持续发展
1950-2100年中国60岁及以上人口比例及预测数据分析
控卫和分卫有什么区别?
如何制定高效的排班计划方案?
你看过这样的《白鲸》吗?用绘画描述经典文学,探索人类与自然的关系
如何用软件测试TF卡:使用专业软件、进行读写速度测试、检查数据完整性、检测坏块
中国篮球的奥运之路,挑战与希望——中美对决背后的深意
动画《金牌得主》:追梦花滑运动动画 点燃热血与感动
中国人民解放军第15军历史沿革
深入探讨“性别”与“性别认同”的复杂性与社会影响
2025年个税退税攻略:手把手教你"捡钱",3分钟搞定!
排查自媒体侵权行为:保护知识产权的有力手段
八十多岁犯罪坐牢吗?刑事责任年龄与高龄犯罪者的司法适用
颈肩痛是怎么回事?颈椎病还是肩周炎?医生教你2个动作甄别!
如何保持健康体重,助力理想血压?
“社保数字员工”上岗,淄博社保业务经办效率提升6倍!
木材百科:枫木的分类、特征与应用价值
新安医学:明清中医药的“硅谷”
山茱萸的副作用与使用禁忌全解析
疫苗造假案:揭示疫苗生产和销售中的问题
新手必看!手机SIM卡激活全流程详解,轻松搞定新卡上手
心衰的指标有哪些
什么是PEST分析?一文读懂
获取麦克风权限
腰肌劳损吃什么中药方
多少公里需要更换刹车盘?内行人告诉你更换标准数据,不怕被坑