智能车制作

标题: 关于无线模块HC_SR04测距工作原理的详细解释。。。。求 [打印本页]

作者: 战天变    时间: 2011-7-27 17:04
标题: 关于无线模块HC_SR04测距工作原理的详细解释。。。。求
本帖最后由 战天变 于 2011-7-27 17:33 编辑

硬件如图所示
[attach]8325[/attach]
在trig端给一个至少10us的高电平信号,则该模块内部将循环发射8个40hz脉冲,检测若有回波信号,则在echo端会产生高电平回响信号,其持续

时间与所测距离成正比,所以只要测出持续时间就可以测出距离。

信号如图所示:
[attach]8326[/attach]

本人的问题是:1、如果没回响信号,也就是距离太大,会echo出现什么情况?
                    2、在产生回响信号后,是否会继续发射8个40hz脉冲?

求各位高手帮忙解答一下!
作者: 转角踩到屎    时间: 2011-7-27 17:04
哦,忘了跟你讲,建立工程时注意选择带浮点型运算的。
作者: 转角踩到屎    时间: 2011-7-31 16:17
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
float  Distance;
unsigned int n, shicha,cn0,cn1 ;
//-----时钟初始化程序--------//
void PLL_Init(void)           //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{                            //锁相环时钟=2*16*(2+1)/(1+1)=48MHz
  REFDV=1;                     //总线时钟=48/2=24MHz
  SYNR=2;
  while(!(CRGFLG&0x08));                 
  CLKSEL=0x80;                              
}
    /*IO口初始化*/   
void IO_Init(void)   
{   
    DDRA=0x02;    // A1输出     
}   
void DELAY(unsigned int loop_times)                 //延时10us程序
{
unsigned int loop_i,loop_j;
for(loop_i=0;loop_i<loop_times;loop_i++)
{for(loop_j=0;loop_j<38;loop_j++)
  ;
}
}
//===============PIT模块初始化==================//
void Pit_Init(void)
{
  PITCFLMT_PITE = 1; //使能PIT模块
  PITCE = 0X00;      //通道0,1 PIT模块禁止
  PITINTE = 0x03;    //通道0,1中断使能
  PITMUX = 0x00;      //16位定时通道0使用0号8位微计数器,16位定时器1使用1号微计数器
  PITMTLD0 =120-1;   //8位定时器初值设定。120分频,在24MHzBusClock下,为0.2MHz。即5us.
  PITLD0 =4000-1;   //16位定时器初值设定,即定时20ms
  PITCE = 0X01;      //通道0,1 PIT模块使能
}
//==============触发信号发生程序==========//
void Chufa(void)
   {
     PORTA_PA1=1;//PA1输出高电平
     DELAY(1);      //延时10us
    PORTA_PA1=0;//PA1输出低电平
   }  
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 66 void PIT0(void)
   {
      PITTF_PTF0 = 1;
       Chufa();  
    }
void ECT0_Init(void)
     {
      TSCR2=0x06;     //禁止溢出中断,分频系数64     周期 2.67us
      TIOS=0x00;      //PT7为输入捕捉
      TCTL3=0xc0;     //输入捕捉7上升沿和下降沿均有效               
      TIE_C7I=1;      //通道7输入捕捉中断允许            
      TSCR1=0x80;     //使能定时器
      }
  void interrupt 15 Timer0_Onput(void)
    {           
    TFLG1_C7F=1;
     if(!(n%2)==0)
        {
           cn0=TCNT;
        }
     else  if(n%2==0)
     {
        cn1=TCNT;
        if(cn1>cn0)
          {
            shicha=cn1-cn0;
          }
        else if(cn1<cn0)
        {
          shicha=cn1+65535-cn0;
        Distance=shicha*2.67*0.017;   //单位cm
        }  
     }
  }                             
   //=======================主函数================================//
   void main(void)
   {
    PLL_Init();    //设置锁相环
    Pit_Init();     
    IO_Init();
    ECT0_Init();   
    EnableInterrupts;
     for(;;)
     {
     
     }
   }
作者: 转角踩到屎    时间: 2011-7-31 16:27
不好意思,上面写的文字没发出来
按照你给的这个模组的原理,模组在接收到回波时才会产生高电平,那没有回波就没有高电平喽。
接收到回响后,你要继续给触发信号它才能产生连续方波哦。
上面的这个程序是20ms产生一次中断去测量距离,Trig接A1,用于产生触发信号,T7接ECHO,用于捕捉回响信号的上升沿和下降沿,读取Distance的值就是距离。希望对你有帮助
作者: 包容    时间: 2012-5-8 10:44
请问为什么是回响信号持续的时间就是超声波传播的时间?谢谢
作者: 九劫岛    时间: 2014-2-5 16:41
转角踩到屎 发表于 2011-7-31 16:17
#include  /* common defines and macros */
#include "derivative.h" /* derivative-specific definition ...

请问参数n是怎么变化的。。。




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2