极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22219|回复: 10

GPS模块和声波测距模块共存问题

[复制链接]
发表于 2012-10-16 16:21:48 | 显示全部楼层 |阅读模式
最近GPS输出数据很不正常。以为GPS模块坏掉了。之后发现把声波测距函数注释掉输出正常。有人知道原因吗?
去掉声波测距之后输出正常:


加上声波之后,UTC时间也不动了,而且数据很不正常
不正常:

声波测距的函数:
  1. void lan_distance()
  2. {
  3.      digitalWrite(TrigPin, HIGH);            
  4.      delayMicroseconds(20);//>10us                  
  5.      digitalWrite(TrigPin, LOW);               
  6.       Time_Echo_us = pulseIn(EchoPin, HIGH);   
  7.    if((Time_Echo_us < 60000) && (Time_Echo_us > 2))     //a valid pulse width should be between (1, 60000).
  8.     {      
  9.       Len_mm = (Time_Echo_us*34/1000)/2;  
  10.       Serial.print(Len_mm);
  11.     }
  12. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-10-16 16:29:40 | 显示全部楼层
看看你的TrigPin是了什么Arduino引脚?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-16 16:38:19 | 显示全部楼层
飞翔的红猪 发表于 2012-10-16 16:29
看看你的TrigPin是了什么Arduino引脚?

我的板子是mega1280
unsigned int EchoPin = 50;           
unsigned int TrigPin = 51;           
unsigned long Time_Echo_us = 0;
unsigned long Len_mm  = 0;

刚刚排除发现是测距函数里面的延迟问题。可能延迟太长了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-16 16:55:00 | 显示全部楼层
  Time_Echo_us = pulseIn(EchoPin, HIGH);
  {:soso_e110:} 是这句问题
不是延迟问题,延迟到100都没事。
  Time_Echo_us = pulseIn(EchoPin, HIGH);  去掉这句之后 OK 纠结
回复 支持 反对

使用道具 举报

发表于 2012-10-16 17:11:32 | 显示全部楼层
是串口问题吧~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-16 17:19:09 | 显示全部楼层
maojidan 发表于 2012-10-16 17:11
是串口问题吧~

不是啦 刚刚试了 是 Time_Echo_us = pulseIn(EchoPin, HIGH); 这句代码问题。 删除这句话之后输出很流畅,加上这句话无论在什么地方都会有问题
回复 支持 反对

使用道具 举报

发表于 2012-10-16 17:21:37 | 显示全部楼层
心之永恒 发表于 2012-10-16 17:19
不是啦 刚刚试了 是 Time_Echo_us = pulseIn(EchoPin, HIGH); 这句代码问题。 删除这句话之后输出很流畅, ...

哦哦~这样啊~
回复 支持 反对

使用道具 举报

发表于 2012-10-16 17:29:02 | 显示全部楼层
心之永恒 发表于 2012-10-16 16:55
Time_Echo_us = pulseIn(EchoPin, HIGH);
   是这句问题
不是延迟问题,延迟到100都没事 ...

注释掉这句,就相当于删掉了超声波模块了~~,问题还是没解决
回复 支持 反对

使用道具 举报

发表于 2012-10-16 17:57:20 | 显示全部楼层
查看下超声波函数内是不是用了中断,和GPS用的冲突了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-16 18:04:54 | 显示全部楼层
飞翔的红猪 发表于 2012-10-16 17:29
注释掉这句,就相当于删掉了超声波模块了~~,问题还是没解决

arduino0022和arduino1.01都试过,1.01问题更明显 而且输出速度变慢了。
想想其他办法唉,能不能用中断呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-16 19:04:46 | 显示全部楼层
用外部中断解决问题了
attachInterrupt(5,echo_time,FALLING);//18PIN
当18pin高电平转到低电平开始中断,
计算发送完检测信号到进入中断时候经历的时间。
  1. void len_distance()
  2. {
  3.      noInterrupts();
  4.      digitalWrite(EchoPin, HIGH);
  5.      digitalWrite(TrigPin, HIGH);            
  6.      delayMicroseconds(20);//>10us  
  7.       interrupts();   
  8.      digitalWrite(TrigPin, LOW);               
  9.      len_now =  micros();//当前时间(us)
  10. }
  11. void echo_time()
  12. {
  13.     len_in_time =  micros();//当前时间(us)
  14.     Time_Echo_us  =len_in_time - len_now;
  15.      if((Time_Echo_us < 60000) && (Time_Echo_us > 1))     //a valid pulse width should be between (1, 60000).
  16.     {      
  17.       Len_cm = (Time_Echo_us*34/1000)/2;  
  18.     }
  19. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 13:35 , Processed in 0.044421 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表