zgbkdlm 发表于 2012-9-12 11:55:30

关于超声波测距的问题

本帖最后由 zgbkdlm 于 2012-9-12 12:01 编辑

器件为Atmega128
用定时器3捕获来算时间.
interrupt void cap3 (void)    //这是捕获中断
{
    icr3h=ICR3H;
    icr3l=ICR3L;
    TCNT3H=0x00;
    TCNT3L=0x00;
    TCCR3B^=0b01000000;    //触发方式取反   
}

      PORTA=0xff;
      delay_us(30);   //发射一个宽度>20US的脉冲
      PORTA=0x00;
      delay_ms(300);
      timerdata=icr3l+icr3h*256;//开始计算转化距离
      time=4*timerdata/1000000.000000;
      distance=time*340/2.0000;
      distance1=time*100;
      lcd_clear();                  //To display the number
      lcd_puts("The distance is");
      lcd_gotoxy(1,1);
      temp1=distance1/1000;
      lcd_putchar(data);
      temp1=distance1%1000/100;
      lcd_putchar(data);
      lcd_putchar(46);
      temp1=distance1/10%100/10;
      lcd_putchar(data);
      temp1=distance1%10;
      lcd_putchar(data);
      lcd_putchar(0x4d);


实际显示始终显示00.01,液晶显示部分没有问题,设置了一个数5236,显示为52.36没有问题.而且输入捕捉也工作,转化部分哪出了问题呢?

0712 发表于 2012-9-12 11:56:59

楼主啊,你的莫元才 9啊

zgbkdlm 发表于 2012-9-12 11:58:36

0712 发表于 2012-9-12 11:56 static/image/common/back.gif
楼主啊,你的莫元才 9啊

已经扣了58莫元...提前扣的,,,

coobot 发表于 2012-9-12 12:03:16

哥们,超声波要发送40KHz,50%占空比的方波,而不是像你说的发送大于20us的电平信号,方波最好发送5个以上,这样探测到物体后反射回来的信号才能有效触发接收端,一般都设置为8个方波信号,大概能探测2m远吧。

zgbkdlm 发表于 2012-9-12 12:06:53

coobot 发表于 2012-9-12 12:03 static/image/common/back.gif
哥们,超声波要发送40KHz,50%占空比的方波,而不是像你说的发送大于20us的电平信号,方波最好发送5个以上 ...

我用的HC-SR04能自动发出40KHZ的,只需要对模块发出20us的脉冲即可..
基本工作原理:
(1)采用IO 口TRIG 触发测距,给最少10us 的高电平信呈。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 口ECHO 输出一个高电平,高电平持续的时间就是超声
波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

zgbkdlm 发表于 2012-9-12 12:10:20

PORTA=0xff;
      delay_us(30);   //发射一个宽度>20US的脉冲
      PORTA=0x00;
      delay_ms(300);
          icr3l=0x0e;
          icr3h=0xef;   //我直接在这付了一个值,显示也还是00.01.那就肯定是这部分原因了
      timerdata=icr3l+icr3h*256;//开始计算转化距离
      time=4*timerdata/1000000.000000;
      distance=time*340/2.0000;
      distance1=time*100;
      lcd_clear();                  //To display the number
      lcd_puts("The distance is");
      lcd_gotoxy(1,1);
      temp1=distance1/1000;
      lcd_putchar(data);
      temp1=distance1%1000/100;
      lcd_putchar(data);
      lcd_putchar(46);
      temp1=distance1/10%100/10;
      lcd_putchar(data);
      temp1=distance1%10;
      lcd_putchar(data);
      lcd_putchar(0x4d);

anvy178 发表于 2012-9-12 12:15:36

我建议你加个 测试的临时变量 先把寄存器里的值 先显示出来确保 寄存器里的值 是对的先 ,。一步 一步来。

guilty2468 发表于 2012-9-12 12:34:43

zgbkdlm 发表于 2012-9-12 12:10 static/image/common/back.gif
PORTA=0xff;
      delay_us(30);   //发射一个宽度>20US的脉冲
      PORTA=0x00;


你的time和timedata之类的数据类型是什么?我觉得是数据类型的问题,你最好一步一步显示计算中间值。一步步调试,不要急

zgbkdlm 发表于 2012-9-12 12:42:34

啊...谢谢各位大大啊...寄存器的值木有问题啊...亲...
我的timerdata和distance1是LONG INT.
TIME和DISTANCE是FLOAT型...
我也觉得是变量哪个地方不对..

guilty2468 发表于 2012-9-12 12:47:11

本帖最后由 guilty2468 于 2012-9-12 12:48 编辑

time=4*timerdata/1000000.000000;
这个除太大了,你把它改成
time=4*timerdata/1000000试试
这个类型应该不同,或者
time=4*((float)timerdata)/1000000.000000;
试试

guilty2468 发表于 2012-9-12 12:58:36

zgbkdlm 发表于 2012-9-12 12:42 static/image/common/back.gif
啊...谢谢各位大大啊...寄存器的值木有问题啊...亲...
我的timerdata和distance1是LONG INT.
TIME和DISTANC ...

?不行?

zgbkdlm 发表于 2012-9-12 12:59:38

guilty2468 发表于 2012-9-12 12:58 static/image/common/back.gif
?不行?

恩........一直是00.01...蛋疼....

guilty2468 发表于 2012-9-12 11:55:31

timedata可能超了,你把它直接付个值,付个10000 ,要是没问题就是timedata不够。
不行,再把distance1赋个值,应该可以。
那就是distance1可能超过了转换,你除1000应该大于10,没法显示
temp1 是int型?

zgbkdlm 发表于 2012-9-12 15:23:51

guilty2468 发表于 2012-9-12 13:07 static/image/common/back.gif
timedata可能超了,你把它直接付个值,付个10000 ,要是没问题就是timedata不够。
不行,再把distance1赋个 ...

谢谢你的回答,我犯了一个2B错误
timerdata=icr3l+icr3h*256;//开始计算转化距离
      time=4*timerdata/1000000.000000;
      distance=time*340/2.0000;
      distance1=time*100;

distance1=distance*100

我2B了.......

新月弯刀 发表于 2012-9-12 15:26:42

计时器没调用好,要不就是你那个超声波出问题了换一个试试,你测试的时候那个灯闪吗?要是不闪就是接收不到!还有这个time=4*((float)timerdata)/1000000.000000;你看看手册是这公式吗?{ //以下为路程计算
temp=high_time*256+low_time;
temp=(temp/1000)/2;
temp*=340;
temp=temp/10;
你试试这个公式

guilty2468 发表于 2012-9-12 16:04:43

zgbkdlm 发表于 2012-9-12 15:23 static/image/common/back.gif
谢谢你的回答,我犯了一个2B错误
timerdata=icr3l+icr3h*256;//开始计算转化距离
      time=4*timerd ...

我擦,我怎么就没看出来,其实看不了不同了,但是没在意
页: [1]
查看完整版本: 关于超声波测距的问题