搜索
bottom↓
回复: 66

讨论一个比较简单的超声波测距的实例

[复制链接]

出0入0汤圆

发表于 2007-12-12 15:11:21 | 显示全部楼层 |阅读模式
在双龙找到的一个超声波测距设计

实际按这个电路制作测试了一下:

   1、5V供电 检测距离 0.5M

   2、输入捕获抖动较大 LCD(或数码管)老是在不停的跳

  请高人指点一下如何提高检测距离以及如何防止抖动。


下面是具体资料






SL-SRF-25超声波传感器
由于超声波指向性强,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等,都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人的研制上也得到了广泛的应用。
为了使移动机器人能自动避障行走,就必须装备测距系统,以使其及时获取距障碍物的距离信息(距离和方向)。在三方向(前、左、右)组成超声波测距系统,就是为机器人了解其前方、左侧和右侧的环境而提供一个运动距离信息。
SL-SRF-25超声波传感器,接上电源,可以单独作为超声波测距使用,由3位LED数码管显示障碍物距离, 3位LED数码管采用积木式插装方式,便于调试检查及使用在不同场合。测量范围10cm-250cm,测距小于100cm时,误差是1~2cm.,大于100cm时,误差是3~5cm。SL-SRF-25超声波传感器,还可以指定从单片机I/O端口上输出分段距离检测信号,可以直接装在双龙SL系列机器人上,作为寻物、避障探测等应用。
超声波接LED数码管显示所测距离
超声波接LED发光二极管显示所测分段距离范围信号,可以用于机器人控制



超声波传感器不带显示器安装

短路插针JD1-2/-3脚功能接地;JD1-1接PC5;短路块插于2,3间,使用LED数码管显示; 短路块插于1,2间,使用LED发光二极管显示,或超声波传感器输出分段控制信号;

超声波传感器输出分段控制信号对应J1引脚
1:  J1-1—PD0  避障距离范围5~9cm
        2:  J1-2—PD1  避障距离范围10~19cm
        3:  J1-3—PD2  避障距离范围20~29cm
        4:  J1-4—PD3  避障距离范围30~39cm
        5:  J1-5—PD4  避障距离范围40~49cm
        6:  J1-6—PD5  避障距离范围50~99cm
        7:  J1-7—PD6  避障距离范围100~179cm
        8:  J1-8—PD7  避障距离范围180~250cm




J1,J2引脚功能图
SLSRF-25电原理图

双龙SL-SRF-25超声波测距—AVR单片机
/*********************************************************************
Project        :   超声波测距
Chip type      :   ATMEGA8
Clock frequency:   8.000000MHz
*********************************************************************/
#include<iom8v.h>
#include<macros.h>
#pragma interrupt_handler intt0:10                    //T0溢出中断
#pragma interrupt_handler icp_timer1:6                //T1捕捉中断
#pragma data:code  //设定数据区为程序存储器
const unsigned char tab1[]={0X28,0XEE,0X32,0XA2,0XE4,
                            0XA1,0X21,0XEA,0X20,0XA0};//七段译码字型表(lm,cm)
const unsigned char tab2[]={0X08,0XCE,0X12,0X82,0XC4,
                            0X81,0X01,0XCA,0X00,0X80};//七段译码字型表(m)
#pragma data:data //设定数据区回到数据存储器
unsigned char ledbuff[]={0X08,0X28,0X28};//显示缓冲区
unsigned char count;
unsigned char newcount;
unsigned char oldcount;
void intt0(void)//T0中断定时程序,定时58US,即测距1CM.
{
TCNT0=0XC6;
count++;
}
void icp_timer1(void)//ICP1捕捉中断,捕捉频率38.5~41.6
{
if (96<=ICR1<=104)
{
  SREG&=0X7f;
  newcount=count-13;
  ICR1=0;
  TCNT1=0;
  TCCR1B=0X81;
}
}
void delay_1us(void)//1us
{
asm("nop");
}
void delay_us(unsigned int t)//tus
{
unsigned int i=0;
for(i=0;i<t;i++)
delay_1us();
}
void delay_1ms(void)//1ms
{
unsigned int i;
for(i=1;i<1142;i++);
}
void delay_ms(unsigned char t)
{
unsigned char  i=0;
for(i=0;i<t;i++)
{
  delay_1ms();
}
}

void send40kHz(void)           //发射40KHz超声波
{
count=0;
TIMSK&=0XDF;//禁止ICP1使能
OCR2=0X64;
TCCR2=0X19;
}
void close40kHz(void)         //停止发射超声波
{
TCCR2=0X00;
}
void hextobcd(unsigned char m)//将count十六进制数据转换为LED七段码
{
unsigned char temp;
temp=m%10;
ledbuff[0]=tab1[temp];//mm位
m=m/10;
temp=m%10;
ledbuff[1]=tab1[temp];//lm位
temp=m/10;
ledbuff[2]=tab2[temp];//m位
}
void display3led(void)        //数码管显示
{
unsigned char i;
  for(i=0;i<3;i++)
{
  PORTD=ledbuff;
  PORTC=~(1<<i);//PC0-mm位,PC1-lm位,PC2-m位
  delay_1ms();
  PORTC=(1<<i);
}
}

void display8led(void)        //8LED显示
{
    if(newcount<10)               
      PORTD=0XFE;
    else if (newcount<20)
          PORTD=0XFD;
    else if (newcount<30)   
      PORTD=0XFB;
    else if (newcount<40)
      PORTD=0XF7;
    else if (newcount<50)  
      PORTD=0XEF;
    else if (newcount<100)
      PORTD=0XDF;
    else if (newcount<180)
      PORTD=0XBF;
    else                        
     PORTD=0X7F;
}  

void mcu_init(void)//MCU初始化
{
DDRD=0XFF;
PORTD=0XFF;
DDRC=0XDF;       //PC5为输入
PORTC=0XFF;
DDRB=0XFE;
PORTB=0XF7;
TCNT2=0X00;
TCNT0=0XC6;      //T0定时58US
TCCR0=0X02;      //T0定时器1/8分频
TCNT1=0X00;
TCCR1A=0X00;
TCCR1B=0X81;     //输入捕获噪音抑制允许,ICP1下降沿触发,系统时钟
TIMSK=0X01;      //使能T0定时溢出

}
void main(void)
{
unsigned char i;
mcu_init();
for(;;)
{
  send40kHz();
  SREG|=0X80;
  delay_us(50);
  close40kHz();
  delay_us(20);
  TIMSK=0X21;
  if(!(PINC&0X20))                    //如果插上JD1短路块,则数码管显示距离
    {
    if (newcount!=oldcount)
       oldcount=newcount;
       hextobcd(oldcount);
    for(i=0;i<20;i++)
       display3led();
    }
  else
    {  
    PORTC=0XFF;
    display8led();
    delay_ms(100);
    }  
  }

}

双龙SL-SRF-25超声波避障程序—51单片机
/***********************************************************************/
/*
                 广州双龙电子
                WWW.SL.COM.CN
   功能:
        超声波避障,避障距离为10cm;前进遇障后退左转弯.
    接线方法:
         52板P1.0(用短线)接超声波传感器J1-1(J1插针的第一脚)
   注意:
         用户可以根据自已的避障距离,把52板P1.0脚连接到超声波传感器的相应脚
   以下是避障距离范围情况:
        1:  J1-1  避障距离范围5~9cm
        2:  J1-2  避障距离范围10~19cm
        3:  J1-3  避障距离范围20~29cm
        4:  J1-4  避障距离范围30~39cm
        5:  J1-5  避障距离范围40~49cm
        6:  J1-6  避障距离范围50~99cm
        7:  J1-7  避障距离范围100~179cm
        8:  J1-8  避障距离范围180~250cm
   Chip type       :  AT89S52   
   Clock frequency :  24MHz
*/
/************************************************************************/
#include "reg52.h"
sbit P1_0=P1^0;              //定义避障距离检测脚
void delay_1ms(void)         //1毫秒延时程序
{
unsigned char j=0,i=8;
   do
     {
        while(--j) ;
     }
   while(--i);
}

void delay(unsigned char i)  // 毫秒级延时程序
{
  while(i--)
  delay_1ms();  
}

void forward(void)           //LED4~5亮,前进
{
   P0=0XE7;
   P3=0x50;
}
void left (void)             //LED1~3亮,左转
{
  P0=0XF8;
  P3=0x60;
}
void back (void)            //LED全亮,后退
{
  P0=0;
  P3=0XA0;
}

void init(void)            //端口初始化
{
  P1|=0X01;                //要读取P1.0,就先写1
  P0=255;                  //8LED全不亮
  P3=0;
}
/***********************************************************************
                     主函数
***********************************************************************/
void main(void)   
{
  init();                //系统初始化
  while(1)               //循环
  {
    if(!P1_0)            //如果在避障范围,则后退,左转弯
    {
      back();
      delay(200);         //后退200毫秒
      left();
      delay(200);         //左转90度.
    }
   else
      {
       forward();
       delay(200);
      }
    }
}




原文档
点击此处打开ourdev_187911.doc(文件大小:2.69M)

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2007-12-12 20:01:22 | 显示全部楼层
超声波测距!以前做过,如果你是买现成模块,能看到数据!那问题是程序问题!觉得是显示刷新不够快!就出现LCD(或数码管)不停的跳
如果是数据变动大的话!进行数据滤波!测到几组数据进行数据滤波!再刷新数据显示,这样应该行了吧~!

出0入0汤圆

发表于 2007-12-13 09:53:53 | 显示全部楼层
1、用变压器升压可以增大距离

   2、如果输入不经过处理,跳动是肯定的。最简单的方法,多次取平均值。

出0入0汤圆

 楼主| 发表于 2007-12-13 14:11:43 | 显示全部楼层
对程序的理解和大家交流一下,以下是我的理解和疑问:

  1、对于延时、数码管、LED 这些就不说了;

  2、T0定时 58us溢出一次 计数变量+1,即增加1cm 距离;

     T2定时 12.5us oc2脚高低电平翻转一次,脉冲输出40KHz;

     T1以系统时钟输入捕获,当有下降沿触发时 计算计数变量--> 距离;

  3、声音以340m/s计算 T1以系统时钟8M计满FFFF 需8.19ms ,340*0.00819= 2.78米
     不明白为何:要 if(96<=ICR1<=104) 才去计算距离! 单是这一句并不能判别输入的脉冲是38.5~41.6的频率吧!

    个人觉得如果要捕获38.5~41.6的频率,那么要发送2个波,
    第一个波捕获时T0清零,第二个波捕获时比较if(96<=ICR1<=104)才算是确认38.5~41.6的频率。

---------------------------------------------
    本人才疏学浅,以上分析若有错误请勿见笑,还望能人多多指正

出0入0汤圆

发表于 2007-12-14 15:16:54 | 显示全部楼层
告訴你一個好的方法,數碼管采用實時掃描控制就不會抖了.不要用程序延時,一定要用時間中斷並設置實時控制的標志.

出0入0汤圆

发表于 2007-12-14 17:34:31 | 显示全部楼层
大家为什么不试着研究一下超声波流量计呢,那个技术运用到测距,肯定精度高.

出0入0汤圆

发表于 2007-12-14 18:11:04 | 显示全部楼层
没有整过,增大C1是否有用?

出0入0汤圆

 楼主| 发表于 2007-12-15 21:23:39 | 显示全部楼层
抖动与 用液晶或者数码管 应该没有关系吧!!
  取平均值的方法试过了 10个数的平均还是有一点会抖,不过好多了,20个数的平均值基本不抖了

  不过我想这应该不是完善的解决方法吧!

(是在障碍距离固定的情况下测试的!)

出0入0汤圆

发表于 2007-12-15 23:06:29 | 显示全部楼层
楼主,你做过这个原理图的作品出来吗?能测量的距离有多远啊?

出0入0汤圆

 楼主| 发表于 2007-12-18 13:05:52 | 显示全部楼层
能检测的距离是0.5M!

看来我要用集成功放来做接收电路了!

  发射端用RS232升压  (至今还没弄清楚为什么用RS232可以升压,有资料的朋友请共享一下)

,或者谁告知一下 脉冲变压器要怎么制作(哪里有买也可以!)



电路还有一些地方不太明白,

1、555与RS232 之间的两个逻辑电路只是取一个方向信号吗?用什么型号的器件!

2、由于没有示波器,用555的话不知道实际输出波形是个什么样子,所以想用单片机直接输出40KHz的方波
(但是不知道这个方波对发射来讲是占空比50%好,还是小一点好?)

3、Vcc 选5V?  9V、12V ?



哪位有兴趣一起制作,可以共同探讨。

出0入0汤圆

 楼主| 发表于 2007-12-21 09:31:59 | 显示全部楼层
根据集成功放的图纸做了测试:

   1、非门用了 HEF40106BP ;

   2、装好后收不到超声波反馈,把第一级LM324的放大改成25倍(把R1改成4K)后,收到反馈信号

   3、LM311按图方法连接不行,我是按照下图方式连接的(主要是第4脚和max232的区别)
   


   4、最重要的一点:  有效检测距离还是只有0.5M 不知道为什么!!??

------------------
下周去借一个示波器,仔细查一下原因!
  
  有做过类似电路的朋友能告知一下你们的检测距离吗?

出0入0汤圆

发表于 2007-12-21 09:39:18 | 显示全部楼层
距离只有0.5M 是因为发射电压不够的原因。

使用中周变压器就可以解决这问题。

现在倒车雷达用的 中周变压器都已经 成品化了,你直接到 GOOGLE搜索 就可以找到好多厂家,跟他们买样品就可以了,买的少一个0.5元左右。

出0入0汤圆

发表于 2007-12-21 10:04:32 | 显示全部楼层
楼主,阿莫邮购部以前推出一款超声波测距的套件,全部资料都公开了。可以研究下.
我也一直想搞这个东西,有空我们探讨下。

出0入0汤圆

 楼主| 发表于 2007-12-24 16:57:58 | 显示全部楼层
用9楼的发射图  +  1楼的接收图, 实际检测距离到1M

另 9楼图  LM311的4号脚 干什么跑到这么远去接地???  望指点!

   (c2、c3用的是电解电容,是否可以?)

出0入0汤圆

发表于 2008-3-24 15:20:30 | 显示全部楼层
老贴在翻出来。顶一个。还是学生,不错。

出0入0汤圆

发表于 2008-3-25 00:50:30 | 显示全部楼层
好资料,学习!

出0入46汤圆

发表于 2008-3-25 19:04:49 | 显示全部楼层
学习!

出0入0汤圆

发表于 2008-3-26 09:15:34 | 显示全部楼层
学习一下

出0入4汤圆

发表于 2008-3-26 10:16:53 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-3-26 10:47:50 | 显示全部楼层
不知道首发一体头需要另外注意什么。。
在顶一个

出0入0汤圆

发表于 2008-3-29 13:00:40 | 显示全部楼层
印个记号

出0入0汤圆

发表于 2008-3-29 23:21:08 | 显示全部楼层
比较器的反相端最后接到超声波传感器的发送端,是起什么作用阿?

出0入0汤圆

发表于 2008-3-31 08:19:14 | 显示全部楼层
谢谢 收藏了

出0入0汤圆

发表于 2008-4-1 08:07:14 | 显示全部楼层
留个脚印

出0入0汤圆

发表于 2008-4-1 08:45:25 | 显示全部楼层
研究一下

出0入0汤圆

发表于 2008-4-1 11:50:52 | 显示全部楼层
这样的电路有这么好的效果已经不错了

出0入0汤圆

发表于 2008-4-2 15:36:46 | 显示全部楼层
本人刚开始学习avr,好多语句看不明白:
1.newcount=count-13;这个语句什么意思

2.void delay_1ms(void)//1ms
{
unsigned int i;
for(i=1;i<1142;i++); 为什么要循环1142次
3.if(96<=ICR1<=104),这一句如何判别输入的脉冲是38.5~41.6的频率,ICR1里存的不是计数值么,怎么判别频率啊
4.主程序中为什么要有这句:delay_us(20),去掉行不
希望大家解答一下,谢谢!

出0入0汤圆

发表于 2009-3-21 22:04:09 | 显示全部楼层
楼主有问题请教您!  我这里没有5609   准备用其他三极管代替,  但是上网查不到详细资料,用9014装上就烧了,您有好的解决方案么?

出0入0汤圆

发表于 2009-3-23 15:44:29 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-3-23 16:02:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-23 16:08:31 | 显示全部楼层
MARK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2009-3-23 17:54:26 | 显示全部楼层
MARK!!!!!!

出0入0汤圆

发表于 2009-3-23 21:58:53 | 显示全部楼层
双龙机器人的传感器

出0入0汤圆

发表于 2009-4-25 22:10:37 | 显示全部楼层
我也照这个原理图搭了个电路
什么反应都没有,用了9013代替5609
改成9伏电压供电都没有用

一点声响都没有

出0入0汤圆

发表于 2009-4-25 22:26:23 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2009-5-11 11:38:46 | 显示全部楼层
R3 R5 的电阻阻值是多少啊

出0入0汤圆

发表于 2009-5-11 11:54:47 | 显示全部楼层
我个东西,我大学时有做过,当时做出来的效果是5m范围内可以实现可靠接受,最远距离可达12m,不过,会有比较多的误动作。我做的那个是用超声波探测移动物体的。
在载波频率确保符合探头频率的前提下,要提高探测距离,加大发射功率吧,距离越远,功率越大,对接收端的杂波处理会要求越高。

出0入0汤圆

发表于 2009-5-11 11:59:47 | 显示全部楼层
载波有偏差的话,对发射距离是很有影响的。如载波偏差不大的话,距离要比载波无偏差的要短很多的。

出0入0汤圆

发表于 2009-6-2 22:57:37 | 显示全部楼层
超声波测距,硬件电路方面:

1.测距多远取决与发射电路的功率,功率越大,测距越远。当然还有接收电路也起很大作用。
2.接收电路的增益调节很重要。
3.电路中能将发射余震减小,是测距盲区缩小的主要原因。

出0入0汤圆

发表于 2009-8-1 09:04:34 | 显示全部楼层
5v 可以驱动吗

出0入0汤圆

发表于 2009-8-1 09:18:38 | 显示全部楼层
很好

出0入0汤圆

发表于 2009-8-1 13:43:18 | 显示全部楼层
mark!

出0入0汤圆

发表于 2009-8-1 15:30:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-5 16:14:12 | 显示全部楼层
我是这样理解if(96<=ICR1<=104)的,ICP1捕捉中断,信号频率38.5k~41.6k,即信号周期是24us~26us.由于捕捉时间在12us~13us之间(因为96<=ICR1<=104),这保证了脉冲捕捉无论在什么时候开始捕捉信号,都能够捉到且只能捉到一个信号周期的下降沿

出0入0汤圆

发表于 2009-8-5 16:24:17 | 显示全部楼层
我也在研究这个,现在就得几米,怎样增加发射功率?

出0入0汤圆

发表于 2009-8-5 16:46:26 | 显示全部楼层
ding

出0入0汤圆

发表于 2009-8-5 16:53:45 | 显示全部楼层
请教各位newcount=count-13; 这句是什么意思啊?

出0入0汤圆

发表于 2009-8-11 14:28:10 | 显示全部楼层
多谢楼主  我的程序用的是你的  但是驱动部分用的其他的  这个程序不错  谢谢楼主  哈哈   我的可以测  1m多

出0入0汤圆

发表于 2009-8-15 20:50:07 | 显示全部楼层
我也想玩玩超声波测距,楼主的资料很有用

出0入0汤圆

发表于 2009-8-19 03:24:34 | 显示全部楼层
“比较器的反相端最后接到超声波传感器的发送端,是起什么作用阿?”这个 为什么没人解答?

出100入0汤圆

发表于 2009-8-19 12:50:08 | 显示全部楼层
MARK!

出0入0汤圆

发表于 2009-8-20 00:12:21 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-8-21 01:11:59 | 显示全部楼层
想要发射更远就要增大发射头上电压电化幅度,
接收还要提高灵敏度

出0入0汤圆

发表于 2009-8-21 08:17:22 | 显示全部楼层
我也弄了一个  就是接收部分老不稳定   感觉不可能有接收的地方 都有输出波形变化

出0入0汤圆

发表于 2009-8-21 12:47:43 | 显示全部楼层
不太稳定啊   老是乱闪

出0入0汤圆

发表于 2010-3-26 00:14:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-20 22:10:56 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-2-21 22:51:20 | 显示全部楼层
可以增加一级放大电路,提高测量距离。

出0入0汤圆

发表于 2011-6-24 11:46:53 | 显示全部楼层
学习。。

出0入0汤圆

发表于 2011-10-12 16:37:41 | 显示全部楼层
good study~

出0入0汤圆

发表于 2011-11-23 11:54:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-2 20:11:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-2 22:31:37 | 显示全部楼层
研究一下这个电路。

出0入0汤圆

发表于 2012-1-3 08:38:07 | 显示全部楼层
看看!

出0入0汤圆

发表于 2012-2-23 17:37:25 | 显示全部楼层
这是老方案了,臃肿

出0入0汤圆

发表于 2012-2-23 17:38:29 | 显示全部楼层
不过还是谢谢楼主的开源精神,呵呵(别把这种精神得罪了)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 20:53

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

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