0

我想在一个 PIC16F877A 上运行两个 HC-SR04 并将两个超声波测量的值发送到串口。

这是我使用 PIC C 编译器的代码:

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) 
#define e1 PIN_B6
#define t1 pin_B7 
#define e2 pin_B4 
#define t2 pin_B5 
int a; 
int distanse(int,int); 

void main()
{

while(1){
int u1,u2;
u1=distanse(e1,t1);u2=distanse(e2,t2);
printf("%3u", u1);
printf("%3u", u2);
delay_ms(1000);

}
}

int distanse(int e,int t){
long long counter=0;
output_bit(t,1);delay_us(10);output_bit(t,0);
a=input(e);
while(a==0){a=input(e);}
while(a==1){counter=counter+1;a=input(e);}
return counter/3.333333;
}

但是计算机收到随机值!问题是什么 ?

4

2 回答 2

0

根据设备的文档,

“您只需向触发输入提供一个短的 10uS 脉冲即可开始测距,然后模块将发出一个 8 周期的 40 kHz 超声波脉冲串并提高其回声。回声是一个距离物体,是脉冲宽度与范围成正比。可以通过发送触发信号和接收回波信号的时间间隔来计算范围。公式:uS/58=厘米或uS/148=英寸;或者:范围=高电平时间*速度(340M/S)/2;我们建议使用超过60ms的测量周期,以防止触发信号对回波信号造成

测量的不是信号保持高电平的时间,而是“开始”脉冲结束与输入信号开始为高电平之间的时间。

因此,代码测量了错误的间隔。

它应该测量“低”区间,而不是“高”区间。

该文档位于:http: //www.micropik.com/PDF/HCSR04.pdf

值得注意的是,由于您运行两个设备,因此根据文档(任何设备的)测量之间的时间需要超过 60 毫秒。

我没有看到触发不同设备之间所需的时间间隔。

我建议使用 delay_us() 函数进行时间间隔测量,而不是自由运行的 while 循环

于 2015-04-26T21:29:24.167 回答
0

连接时,请确保执行以下步骤

  1. PIC 单片机需要向 HC-SR04 Trig Pin 发送至少 10 us 的触发脉冲。
  2. 收到触发脉冲后,HC-SR04 自动发送 8 个 40 kHz 声波,等待 Echo 引脚的上升沿输出。
  3. 当连接到 PIC 输入的 Echo 引脚发生上升沿捕获时,启动 PIC18F4550 的定时器并再次等待 Echo 引脚的下降沿。
  4. 一旦在 Echo 引脚捕获下降沿,微控制器就会读取定时器的计数。此时间计数用于计算到对象的距离。

查看您的程序,不确定该计数器是否会以这种方式工作。为了获得更好的准确性,请使用带捕获模式的定时器。在此处找到更多信息:PIC 控制器定时器捕获模式

使用计时器计算与超声波模块的距离,请参阅此 接口 PIC 控制器与超声波传感器模块 HC-SR04

于 2017-07-29T09:58:01.407 回答