搜索
bottom↓
回复: 15

关于超声波测距的问题

[复制链接]

出0入0汤圆

发表于 2012-9-12 11:55:30 | 显示全部楼层 |阅读模式
本帖最后由 zgbkdlm 于 2012-9-12 12:01 编辑

器件为Atmega128
用定时器3捕获来算时间.
interrupt [26] 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]);
        temp1=distance1%1000/100;
        lcd_putchar(data[temp1]);
        lcd_putchar(46);
        temp1=distance1/10%100/10;
        lcd_putchar(data[temp1]);
        temp1=distance1%10;
        lcd_putchar(data[temp1]);
        lcd_putchar(0x4d);


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-12 11:56:59 | 显示全部楼层
楼主啊,你的莫元才 9啊

出0入0汤圆

 楼主| 发表于 2012-9-12 11:58:36 | 显示全部楼层
0712 发表于 2012-9-12 11:56
楼主啊,你的莫元才 9啊

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

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2012-9-12 12:06:53 | 显示全部楼层
coobot 发表于 2012-9-12 12:03
哥们,超声波要发送40KHz,50%占空比的方波,而不是像你说的发送大于20us的电平信号,方波最好发送5个以上 ...

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

出0入0汤圆

 楼主| 发表于 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]);
        temp1=distance1%1000/100;
        lcd_putchar(data[temp1]);
        lcd_putchar(46);
        temp1=distance1/10%100/10;
        lcd_putchar(data[temp1]);
        temp1=distance1%10;
        lcd_putchar(data[temp1]);
        lcd_putchar(0x4d);

出0入0汤圆

发表于 2012-9-12 12:15:36 | 显示全部楼层
我建议你加个 测试的临时变量 先把寄存器里的值 先显示出来  确保 寄存器里的值 是对的先 ,。一步 一步来  。

出0入0汤圆

发表于 2012-9-12 12:34:43 | 显示全部楼层
zgbkdlm 发表于 2012-9-12 12:10
PORTA=0xff;
        delay_us(30);   //发射一个宽度>20US的脉冲
        PORTA=0x00;

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

出0入0汤圆

 楼主| 发表于 2012-9-12 12:42:34 | 显示全部楼层
啊...谢谢各位大大啊...寄存器的值木有问题啊...亲...
我的timerdata和distance1是LONG INT.
TIME和DISTANCE是FLOAT型...
我也觉得是变量哪个地方不对..

出0入0汤圆

发表于 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;
试试

出0入0汤圆

发表于 2012-9-12 12:58:36 | 显示全部楼层
zgbkdlm 发表于 2012-9-12 12:42
啊...谢谢各位大大啊...寄存器的值木有问题啊...亲...
我的timerdata和distance1是LONG INT.
TIME和DISTANC ...

?不行?

出0入0汤圆

 楼主| 发表于 2012-9-12 12:59:38 | 显示全部楼层
guilty2468 发表于 2012-9-12 12:58
?不行?

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

出0入0汤圆

发表于 2012-9-12 11:55:31 | 显示全部楼层
timedata可能超了,你把它直接付个值,付个10000 ,要是没问题就是timedata不够。
不行,再把distance1赋个值,应该可以。
那就是distance1可能超过了转换,你除1000应该大于10,没法显示
temp1 是int型?

出0入0汤圆

 楼主| 发表于 2012-9-12 15:23:51 | 显示全部楼层
guilty2468 发表于 2012-9-12 13:07
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了.......

出0入0汤圆

发表于 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;
你试试这个公式

出0入0汤圆

发表于 2012-9-12 16:04:43 | 显示全部楼层
zgbkdlm 发表于 2012-9-12 15:23
谢谢你的回答,我犯了一个2B错误
timerdata=icr3l+icr3h*256;  //开始计算转化距离
        time=4*timerd ...

我擦,我怎么就没看出来,其实看不了不同了,但是没在意
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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