从超声波HC-SR04读取

时间:2015-04-26 20:40:24

标签: c pic microc

我想在一个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;
}




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

2 个答案:

答案 0 :(得分:0)

根据设备的文档,

“你只需要  供应短10uS 脉冲到触发输入开始测距,一个 然后模块将发送出去 超声波的8周期突发,频率为40 kHz并升高 它的回声。回声是一个 距离对象是脉冲宽度和范围i n比例。 你可以 通过时间间隔计算范围 发送触发信号和 接收回波信号。 公式:uS / 58 =厘米 rs或uS / 148 =英寸;或者 范围=高水平时间*速度(340M / S)/ 2; 我们  建议使用超过60毫秒 测量周期,以防止触发标志 al到回声信号

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

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

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

该文件可在以下网址获得: http://www.micropik.com/PDF/HCSR04.pdf

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

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

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

答案 1 :(得分:0)

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

  1. PIC单片机需要向HC-SR04 Trig Pin发送至少10 us触发脉冲。
  2. 获得触发脉冲后,HC-SR04自动发送8个40 kHz声波并等待Echo引脚的上升沿输出。
  3. 当连接到PIC输入的Echo引脚发生上升沿捕捉时,启动PIC18F4550的定时器并再次等待Echo引脚的下降沿。
  4. 只要在Echo引脚捕获下降沿,微控制器就会读取定时器的计数。此时间计数用于计算到对象的距离。
  5. 查看您的程序,不确定计数器是否会以这种方式运行。为了更好的准确性,使用带捕获模式的Timer在这里找到更多相关信息:PIC controller Timer Capture mode

    使用Timer计算超声波模块的距离,请参阅此处     Interfacing PIC controller with Ultrasonic sensor module HC-SR04