智能小车的超声波避障

51单片机实例

  1. 智能小车(一)——–小车的前进、后退和停止
  2. 智能小车(二)——– 小车的红外遥控调速
  3. 智能小车(三)——– 小车的红外循迹

文章目录

  • 前言
  • 超声波HC-SR04
  • 简介
  • 参数规格
  • 基本工作原理
  • 测距程序设计

  • 前言

    前几节的51智能小车系列中,相信大家对小车模块的使用有了一定的了解,接下来这节我将为大家介绍另一个功能模块,即超声波模块,我也将以51智能小车为例展开为大家介绍。


    超声波HC-SR04

    简介

    超声波是声波的一部分,是人耳听不见、频率高于20KHZ的声波,它和声波有共同之处,即都是由物质振动而产生的,并且只能在介质中传播;同时,它也广泛地存在于自然界,许多动物都能发射和接收超声波,其中以蝙蝠最为突出,它能利用微弱的超声回波在黑暗中飞行并捕捉食物。但超声波还有它的特殊性质,如具有较高的频率与较短的波长,所以,它也与波长很短的光波有相似之处。

    超声波传感器是利用超声波的特性研制而成的传感器。SR04是最常见的超声波传感器之一,在arduino开发中超声波传感器SR04主要用来测距,相比其他测距传感器有着简单易用、灵敏度高等特点。对于超声波传感器各种特性,超声波检测广泛应用在工业、国防、生物医学等方面。

    参数规格

    尺寸:长×宽×高
    工作电压:5V
    感应角度:不大于15度
    探测距离:2cm-450cm
    精度:可达0.2cm

    vcc-VCC
    trig-控制端
    echo-接收端
    gnd-GND

    基本工作原理

    (1)采用IO口TRIG触发测距,给至少10us的高电平信号;

    (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;

    (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;

    时序图:

    采用IO口TRIG触发测距,给最少10us的高电平信号。模块自动发送8个40khz的方波,自动检测是否有信号返回;有信号返回,通过IO口ECHO输出一个高电平,同时开定时器计时,当此口变为低电平时就可以读定时器的值,高电平持续的时间就是超声波从发射到返回的时间。

    原理图:

    本节的设计为: 当小车开启电源时,小车的状态为匀速前进,当超声波感受到前方有障碍物时,小车会向降低速度并同时向左转弯,若前方无障碍物,小车则继续前行,同时恢复初始速度。

    测距程序设计

    //超声波初始化
    void ultrasonic_init(void)
    {
    	TRIG=0;
    	ECHO=1;
    	time1_init();
    }
    
    //超声波测距
    //返回值:测量距离cm
    int ultrasonic_measure (void)
    {
    	unsigned int i,j,temp,temp_sum=0,temp_buf[10];
    
    	int ftemp;
    	
    	for(i=0; i<10; i++)
    	{
    		TRIG=1;//拉高
    		Delay10us();Delay10us();//大约20us
    		TRIG=0; //拉低
    		
    		while(ECHO==0); //等待高电平到来
    		TH0=0x00;
    		TL0=0x00;//清零计数器值
    		TR0=1;//开启定时器,开始计数
    		while(ECHO==1);//等待高电平结束
    		TR0=0;//关闭定时器
    		temp_buf[i]=TH0*256+TL0;
    		Delay(80);
    	}
    	
    	//滤波处理,消除干扰数据
    	for(i=0;i<9;i++)//升序排列
    	{
    		for(j=i+1;j<10;j++)
    		{
    			if(temp_buf[i] >temp_buf[j])
    			{
    				temp=temp_buf[i];
    				temp_buf[i]=temp_buf[j];
    				temp_buf[j]=temp ;
    		  }
    		}
      }
    
    	for(i=0;i<8;i++) temp_sum+=temp_buf[i];
    	ftemp=temp_sum/6;
    	
    	return ftemp*0.00034/2*100;   //单位转化为cm
    }
    
    
    void main()
    {
    	unsigned char un;
    	ultrasonic_init();
    	while(1)
    	{
    		 un=ultrasonic_measure();
    		if(un>10) work();
    		if(un<10) left();		
      }
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 智能小车的超声波避障

    发表评论