小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 13864|回复: 16

【求助】关于超声波测距代码

[复制链接]
发表于 2012-7-29 09:02:17 | 显示全部楼层 |阅读模式
近日在驱动板上添加了超声波传感器,刷了坛主的新驱动板代码,然后驱动板直接连接PC机进行调试,在串口助手上接收到驱动板返回的测距数据包一直为FF 03 00 FF,请问是什么原因?可以确认超声波传感器能正常工作(在UART模式下直接通过串口测试没有问题),且连接上没有问题。
另外:
  1. uchar Get_Distance(void)
  2. {
  3.     uint32 Distance = 0;

  4.     Send_wave();
  5.     TH1 = 0;
  6.     TL1 = 0;
  7.         while(TH1<250 && Echo!= 1);          
  8.         if(TH1 <= 250)        //测距范围<0.5M
  9.         {
  10.            TH1 = 0;
  11.            TL1 = 0;
  12.            while(Echo == 1);
  13.            Distance = TH1;        //放入高8位数据
  14.            Distance = Distance * 256;        //左移8位
  15.            Distance = Distance + TL1;
  16.            Distance = Distance * 17;
  17.            Distance = Distance / 22118;
  18.            return (uchar)(Distance&0xFF);
  19.         }
  20. }
复制代码
这是liuviking提供的测距代码,谁能帮我解释下,谢谢! :
Distance = Distance + TL1;
这句执行后,Distance存储的值是以什么为单位?是us吗?

接下来再*17/22118是什么意思?(我知道这部分是换算距离,但为什么这么算?)
最后输出时为什么要加 &0xFF操作?

回复

使用道具 举报

发表于 2012-7-29 09:30:29 | 显示全部楼层
同求{:2_25:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-29 10:55:12 来自手机 | 显示全部楼层
顶起.......
回复 支持 反对

使用道具 举报

发表于 2012-7-29 11:07:38 | 显示全部楼层
这个肯定是不对的,如果正确的应该返回FF 00 XX YY FF格式数据,你检查一下你的模块是否接对了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-29 14:34:57 来自手机 | 显示全部楼层
本帖最后由 cjnt007 于 2012-7-29 17:29 编辑

嗯,是我打错了,返回的数据一直是FF 03 00 00 FF
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-29 17:31:24 | 显示全部楼层
本帖最后由 cjnt007 于 2012-7-29 18:01 编辑
liuviking 发表于 2012-7-29 11:07
这个肯定是不对的,如果正确的应该返回FF 00 XX YY FF格式数据,你检查一下你的模块是否接对了?
确定没有接错,我调换过echo和trig,这种情况下只能接收一组FF 03 00字符,应该是程序运行到UART_send_byte(Get_Distance());,Get_Distance()函数一直没能返回。


  1. void Send_Distance(void)
  2. {
  3.    UART_send_byte(0xFF);
  4.    UART_send_byte(0x03);
  5.    UART_send_byte(0x00);
  6.    UART_send_byte(Get_Distance());
  7.    UART_send_byte(0xFF);
  8.    Delay_Ms(1000);
  9. }
复制代码
根据这函数,返回的数据应该是FF 03 00 XX FF格式,其中XX应为测得的距离值。
我尝试让Get_Distance()函数直接返回TH1和TL1,在传感器前移动遮挡物的情况下,这两个输出值一直是固定不变的。是不是可以判断计数器1的值没有更新?
回复 支持 反对

使用道具 举报

发表于 2012-7-29 21:02:25 | 显示全部楼层
cjnt007 发表于 2012-7-29 17:31
确定没有接错,我调换过echo和trig,这种情况下只能接收一组FF 03 00字符,应该是程序运行到UART_send_byte ...

是否有尝试过直接使用编译好的那个固件呢?一群管理员的右手谈情已经成功安装超声波了,你也可以咨询一下他。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-29 21:16:44 来自手机 | 显示全部楼层
谢谢!我继续试试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-1 10:42:54 | 显示全部楼层
下面这两段代码分别是在timer.c和main.c中,在运行的时候都在使用计时器1,是否会相互影响?请高手帮忙看一下。
  1. //timer.c
  2. void Timer_1(void) interrupt 3
  3. {
  4.     static uint16 ms_count=0;
  5.     TH1     =   0xA9;   
  6.     TL1     =   0x9A;
  7.     if(ms_count++ >= 10)        //10ms切换一次
  8.     {
  9.          ms_count = 0;
  10.              if(rec_flag)
  11.              {
  12.                  LED5 = ~LED5;        //控制LED5在接收数据时闪烁
  13.              }
  14.              else
  15.              {
  16.                  LED5 = 1;                //不接收时常亮
  17.              }
  18.     }
  19. }
复制代码
  1. //main.c
  2. uchar Get_Distance(void)
  3. {
  4.     uint32 Distance = 0;
  5.     Send_wave();
  6.     TH1 = 0;
  7.     TL1 = 0;
  8.         while(TH1<256 && Echo!= 1);
  9.         if(TH1 <= 256)        //测距范围<0.5M
  10.         {
  11.            TH1 = 0;
  12.            TL1 = 0;
  13.            while(Echo == 1);
  14.            Distance = TH1;
  15.            Distance = Distance*256;       
  16.            Distance = Distance + TL1;        //取得以ms为单位的时间值
  17.            Distance = Distance * 17;         //17mm/ms
  18.            //Distance = Distance / 22118;
  19.            return (uchar)(Distance);         //&0xFF,这两行经过修改,已经可以动态返回距离值,但返回的值不稳定,也不正确,怀疑是上面那段代码在干扰。
  20.         }
  21. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-1 21:15:30 | 显示全部楼层
liuviking 发表于 2012-7-29 21:02
是否有尝试过直接使用编译好的那个固件呢?一群管理员的右手谈情已经成功安装超声波了,你也可以咨询一下 ...


liuviking你好!经过测试,你所发布的驱动板超声波代码,main.c中的Get_Distance()函数与timer.c中的函数Timer_1()都在使用定时器1,它们之间确实存在干扰。我今晚把Timer_1()函数中的代码注释掉后,超声波测试功能基本正常了。(这样做,好像唯一的问题就是驱动板接收数据时LED5就不能闪烁了)

另外我发现:
在Get_Distance()中的
while(TH1<256 && Echo!= 1);
if(TH1 <= 256)
这两句里的常量256貌似要改大一些才行,我设置成2000是没有问题的。

请恕我不敬,上述有不对的地方请多多指教。

评分

参与人数 1金钱 +3 贡献 +2 收起 理由
liuviking + 3 + 2 很认真!肯动手动脑的车友!

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-23 00:29 , Processed in 1.083658 second(s), 20 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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