我有 raspberry pi b,我正在尝试用 C 编写代码,这将允许我使用 HC-SR04 Ultrasonic Ranging Module .我使用 bcm2835 库来控制 GPIO 引脚。我已经按照this website连接了.这是我的尝试:
# include <bcm2835.h>
# include <stdio.h>
# include <time.h>
# include <stdlib.h>
# define ECHO RPI_V2_GPIO_P1_03
# define TRIG RPI_V2_GPIO_P1_05
int main(int argc, char **argv) {
if (!bcm2835_init())
return 1;
bcm2835_gpio_fsel(ECHO, BCM2835_GPIO_FSEL_INPT);
bcm2835_gpio_fsel(TRIG, BCM2835_GPIO_FSEL_OUTP);
time_t clockstart = 0;
time_t clockstop = 0;
bcm2835_gpio_write(ECHO, LOW);
delay(2);
printf("trigger\n");
bcm2835_gpio_write(TRIG, HIGH);
usleep(10);
bcm2835_gpio_write(TRIG, LOW);
printf("measure\n");
while (bcm2835_gpio_lev(ECHO) == 0) {
clockstart = time(NULL);
}
printf("B: %i\n", (int)clockstart);
while (bcm2835_gpio_lev(ECHO) == 1) {
clockstop = time(NULL);
}
printf("E: %i\n", (int)clockstop);
time_t delta = clockstop - clockstart;
printf("D: %i\n", delta);
double distance = (delta * 340) / 2;
printf("DISTANCE: %i\n", distance);
bcm2835_close();
return 0;
}
存在两个问题:
- 我的读取时间的方法最多只能准确到 1 秒,但是当我寻找更好的方法时,我发现了两种方法,但没有明确的答案,哪一种实际上更好(clock_gettime() 或 gettimeofday()) .
- 即使指向很远的地方,循环也几乎立即完成,导致两次 time() 调用的值完全相同。这可能是由于我获取当前时间的糟糕方法,但我不确定。
我很确定我在这里遗漏了一些明显的东西,但我需要帮助才能找到它。
编辑:更好的解决方案是使用 GPIO 中断来计时回声间隔
一个建议(必须是评论,但我没有足够的声誉)
使用 gettimeofday() 而不是 time() —— 它提供了更高的时间分辨率。
此外,我将以这种方式更改 while 循环:
struct timeval start, end;
while (!bcm2835_gpio_lev(ECHO)); // Although gcc may be smart
gettimeofday(&start, NULL); // enough to do this optimisation
while (bcm2835_gpio_lev(ECHO)); // on its own
gettimeofday(&end, NULL);
double delta = (end.tv_sec - start.tv_sec) * 1000.0; // s to ms
delta += (end.tv_usec - start.tv_usec) / 1000.0; // us to ms
printf("D: %f ms\n", delta);
我是一名优秀的程序员,十分优秀!