c-从超声波HC-SR04读取



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

但是电脑收到了随机值!问题出在哪里?

根据设备的文档,

"你只需要提供短10uS脉冲到触发输入以开始测距d则模块将发出在40kHz下的8个周期的超声波爆发并提高它的回声。回声是脉冲宽度和范围i的距离对象n比例你可以通过我们之间的时间间隔计算范围en发送触发信号,以及接收回波信号公式:uS/58=厘米rs或uS/148=英寸;或:范围=高电平时间*速度(340M/S)/2我们建议使用60毫秒以上测量周期,以防止触发符号al至回波信号">

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

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

它应该测量"低"间隔,而不是"高"间隔。

该文档可在以下位置获取:http://www.micropik.com/PDF/HCSR04.pdf

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

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

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

接口时,确保以下步骤

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

查看您的程序,不确定计数器是否会以这种方式工作。为了获得更好的精度,请使用带捕获模式的定时器。在这里可以找到更多关于它的信息:PIC控制器定时器捕获模式。

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

最新更新