搜索
bottom↓
回复: 4

超声波测距SR04,测量距离有问题

[复制链接]

出0入0汤圆

发表于 2012-4-9 09:30:19 | 显示全部楼层 |阅读模式

每次调试测试时,TH1总是在10以下,就是说不管多远,距离显示总是在10厘米以内,彻底无语了,求高手指点

先贴出程序
----------------------------------------------------------------------------------------
uint distance;
uchar num1,num2,num3,num4;                    

----------------------------系统初始化------------------------------------------
void init()
{
        Trig = 0;
        TMOD = 0x91;                 
        ET0 = 1;   
        ET1 = 1;                  

        TR1 = 0;
        TR0 = 0;       

        EX1 = 1;
        IT1 = 1; //下降沿触发方式

        EA = 1;                       
}


----------------------开启sensor------------------------------
void start_sensor()
{
        Trig = 1;
        TH0 = 0xff;
        TL0 = 0xf0;
        TR0 = 1;
}

---------------定时器0中断,用于产生10us高脉冲-------------------------
void timer0() interrupt 1          
{
        Trig = 0;
        TR0 = 0;
        TH1 = 0x00;
        TL1 = 0x00;
        TR1 = 1;
}


--------------记录ECHO的脉冲长度---------------------------由于时间没有这么长,这段程序基本不肯能执行
void timer1() interrupt 3                  
{
        TH1 = 0x00;
        TL1 = 0x00;
}

----------------根据脉冲长度计算距离-------------------------------------------
void out1_interrupt() interrupt 2               
{
        TR1 = 0;
        num1 = TH1;
        num2 = TL1;
        num3 = num1*256/1000*170;
        num4 = num2*340/2000;
        distance= num3 + num4;        //测量的实际距离

        TH1 = 0x00;
        TL1 = 0x00;       
}

-------------------------主函数-----------------------------------------------
void main()
{
        init();
        while(1)
        {
                i = i + 1;
                if(i >100)
                {
                        start_sensor();
                        i = 0;
                }
                display(distance);               
        }                                 
}



基本思路是:1、由 i 控制发射波的频率,由于display()大约10ms,故大约一分钟发射一次
            2、用定时器0来控制Trig启动信号的脉冲宽度,大约有16个us长度
            3、用定时器1和外部中断1共同控制计算Echo的脉冲长度,只计算第一个高脉冲的长度
            4、外部中断通过Echo的下降沿触发,取出Echo脉冲长度的信息,计算出距离


但是每次调试测试时,TH1总是在10一下,就是说不管多远,距离显示总是在10厘米以内,彻底无语了,求高手指点

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-4-9 14:04:16 | 显示全部楼层
这应该和硬件有关关系呀

出0入0汤圆

 楼主| 发表于 2012-4-11 12:06:14 | 显示全部楼层
SR04在没有发射超生波的情况下,接收到超声波会不会有高脉冲产生?

出0入0汤圆

发表于 2012-4-11 12:59:49 | 显示全部楼层
LZ有些必要的东西没说明,如连接图,晶振频率。假设代码中的数值是正确的设置。
看了下代码,按照我手头的SR04的说明,LZ的程序测出的是从发出10us高电平后,一直记录到echo输出完高电平(下降沿触发)为止的时间,而这段时间包含了模块发射脉冲进行测量所需的时间。在这不正确用法的基础上,对于为啥只显示有10cm就不继续深究了。
代码中有段没用的
void timer1() interrupt 3                  
{
        TH1 = 0x00;
        TL1 = 0x00;
}
这个是T1中断后执行的程序,要中断就要溢出,溢出后必然为0x0000。再执行归零没用处。
建议LZ再看下模块的时序操作,重写部分代码。记录时间应该在发出10us后,echo的正跳变开始,而这个不能直接触发中断,如果要查询echo的状态,就要给对应的I/O置“1”。

出0入0汤圆

发表于 2012-4-11 14:12:59 | 显示全部楼层
好多中断。。。定时器0选gate位为1,echo接外中断0好像更方便点吧,num3,num4用uchar能行么?俺新手,刚做过这个,说错不负
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 04:01

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

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