一、超声波模块

 二、超声波原理

       TRIG引脚负责发送超声波脉冲串。此引脚应设置为高电平10μs,此时HC-SR04将以40 kHZ发出8个周期的声波脉冲。发出声波爆发后,ECHO引脚将变为高电平。 ECHO引脚是数据引脚 - 用于进行距离测量。发送超声波脉冲串后, ECHO引脚将变为高电平,它将保持高电平,直到检测到超声波脉冲串为止,此时它将变为低电平。
在这里插入图片描述
就是TRIG引脚给一个持续10us的高电平,触发超声波模块自动发送8个40khz的方波,发出声波后,ECHO引脚会被拉高,待接收到之后,ECHO引脚拉低,我们只要测出ECHO引脚从拉高到拉低的时间就可以知道距离了

三、计算公式

我们知道声速是340m/s
根据x=vt
因为超声波发送出去和回来是测量距离的两倍,所以假设距离是L
2L=344xt
t我们用定时器测出来一般都是us
所以就是tx172x10的-6次方=L,L单位为cm
最终的出 L= t(us) * 0.0172(cm/us)
0.0172=1/58
所以 L= t(us)/58(cm)

 四、测试代码

#include <stdio.h>
#include <sys/time.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <unistd.h>

#define Trig 0 //设置Trig引脚
#define Echo 1//设置 Echo引脚

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);

    dis= (double)diffTime/1000000 * 34000 /2;

    return dis;
}

int main()
{
    double dis;

    if(wiringPiSetup() == -1){
        fprintf(stderr,"%s","initWrin");
    }

    while(1)
    {
    
        dis = getDistance();
        printf("dis = %lf\n",dis);
        usleep(500000);
    }

    return 0;
}

五、说明

        本次实验使用的是wiringOP-master.zip。

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐