智能车制作

标题: 超声波测距程序 [打印本页]

作者: Mr.不弃    时间: 2014-11-3 21:05
标题: 超声波测距程序
下面是一个用XDT512的超声波测距程序,用示波器却监测不到echo引脚的高电平...
请各路大神前来帮忙...


#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

float Distance;
float T_duration;
unsigned int T0,T1;

//============时钟初始化程序============//
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 PIT模块禁止
  PITINTE = 0x01;          //通道0中断使能
  PITMUX = 0x00;           //16位定时通道0使用0号8位微计数器
  PITMTLD0 =240-1;       //   8位定时器初值设定。240分频,在24MHzBusClock下,为0.1MHz。即10us.
  PITLD0 =50000-1;          //16位定时器初值设定,即定时0.5s
  PITCE = 0X01;              //通道0 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();  
    }
    #pragma CODE_SEG DEFAULT

//============ECT初始化============//  
void ECT0_Init(void)
     {
      TSCR2=0x06;          //禁止溢出中断,分频系数64     周期 2.67us
      TIOS=0xfe;            //PT0为输入捕捉
      TCTL3=0x03;           //输入捕捉0上升沿和下降沿均有效               
      TIE_C0I=1;              //通道0输入捕捉中断允许
      ICSYS_TFMOD=1;    //中断标志设置方式,当锁存发生时触发中断
      ICSYS_BUFEN=1;
      ICSYS_LATQ=0;       //通道0处于队列工作方式
      ICOVW_NOVW0=0;     //允许覆盖寄存器
      TFLG1=0xff;             //清除各IC/OC中断标志位
      TFLG2=0xff;            //清除自由定时器中断标志位
      TSCR1=0x80;           //使能定时器
      }

/*************************************************************/
/*                   输入捕捉中断函数                        */
/*************************************************************/
  
interrupt VectorNumber_Vtimch0 void  T0_CAPTURE(void)
    {           
    if(TFLG1_C0F==1)
    TFLG1_C0F=1;

    T0=TC0H;
    T1=TC0;

    if(T1>T0)
    {
        T_duration=T1-T0;
        Distance=T_duration*2.67*0.017;   // 距离cm        
    }
    else
    {
         T_duration=65535+T1-T0;
         Distance=T_duration*2.67*0.017;   // 距离cm
    }

    TC0H=0x0000;
    TC0=0x0000;   //清除通道0的寄存器和保持寄存器

  }
                 
   //=======================主函数============================//
   void main(void)
   {
   DisableInterrupts;
    PLL_Init();         //设置锁相环
    Pit_Init();   
    IO_Init();
    ECT0_Init();
    EnableInterrupts;   

     for(;;)
     {

     }
   }





补充内容 (2014-11-6 16:01):
TCTL4=0x03;              //输入捕捉0上升沿和下降沿均有效
ICOVW_NOVW0=1;     //不允许覆盖寄存器
作者: Mr.不弃    时间: 2014-11-3 21:06
烦请各位看看程序哪里不对,请不吝赐教...
{:2_36:}
作者: Mr.不弃    时间: 2014-11-4 08:36
Help
作者: Mr.不弃    时间: 2014-11-5 15:09
:'(自顶,不能沉呐...
作者: Mr.不弃    时间: 2014-11-6 15:56
:'(:'(
作者: Mr.不弃    时间: 2014-11-12 10:17
:victory::victory:程序证实是可用的,使用时注意将"补充内容"的代码替换原文中代码...
作者: 西安小姑娘    时间: 2015-4-3 11:52
这个程序可用吗?
作者: Mr.不弃    时间: 2015-4-7 09:20
西安小姑娘 发表于 2015-4-3 11:52
这个程序可用吗?

嗯,可以的

作者: 西安小姑娘    时间: 2015-4-7 12:11
Mr.不弃 发表于 2015-4-7 09:20
嗯,可以的

最后还是没用输入捕捉,老是捕捉不到,最后用了普通IO~~:Q
作者: Mr.不弃    时间: 2015-4-8 10:37
西安小姑娘 发表于 2015-4-7 12:11
最后还是没用输入捕捉,老是捕捉不到,最后用了普通IO~~

补充内容 (2014-11-6 16:01):
TCTL4=0x03;              //输入捕捉0上升沿和下降沿均有效
ICOVW_NOVW0=1;     //不允许覆盖寄存器

作者: 空有一人    时间: 2015-4-23 20:12
学习了
作者: 牛奶土豆    时间: 2015-5-14 13:05
源码中的TC0H应该不能直接给T0吧,如果赋给T0,还要乘以256
作者: Mr.不弃    时间: 2015-5-29 08:17
牛奶土豆 发表于 2015-5-14 13:05
源码中的TC0H应该不能直接给T0吧,如果赋给T0,还要乘以256

为什么需要*256?望指点迷津...

作者: 牛奶土豆    时间: 2015-5-29 12:30
Mr.不弃 发表于 2015-5-29 08:17
为什么需要*256?望指点迷津...

因为TC0H是TC0的高8位啊

作者: Mr.不弃    时间: 2015-5-29 16:39
牛奶土豆 发表于 2015-5-29 12:30
因为TC0H是TC0的高8位啊

TCx为ECT的输入捕捉/输出比较寄存器,TCxH为输入捕捉/输出比较保持寄存器,而且两者都是16位寄存器。
这段程序是对输入的上升沿及下降沿均捕捉:当捕捉到上升沿时,此时TC0中的数值将转移到TC0H中保存,接着TC0保存捕捉到下降沿时刻的数值,并在此时触发中断。
实验结果也说明,不乘的话得到的就是实际的距离。


作者: 牛奶土豆    时间: 2015-5-31 12:38
Mr.不弃 发表于 2015-5-29 16:39
TCx为ECT的输入捕捉/输出比较寄存器,TCxH为输入捕捉/输出比较保持寄存器,而且两者都是16位寄存器。
这 ...

[attach]77574[/attach]你看编译器里的TC0

作者: 牛奶土豆    时间: 2015-5-31 12:42
Mr.不弃 发表于 2015-5-29 16:39
TCx为ECT的输入捕捉/输出比较寄存器,TCxH为输入捕捉/输出比较保持寄存器,而且两者都是16位寄存器。
这 ...

你的能返回距离那TC0H应该就是一个单独的寄存器吧
作者: Mr.不弃    时间: 2015-6-2 08:52
本帖最后由 Mr.不弃 于 2015-6-2 08:53 编辑
牛奶土豆 发表于 2015-5-31 12:42
你的能返回距离那TC0H应该就是一个单独的寄存器吧

嗯,是的。就是下边这个TC0H(hold register)

作者: bruce_lu    时间: 2015-8-28 20:38
我使用US100超声波,请问Trig和Echo接单片机的什么引脚?
作者: bruce_lu    时间: 2015-9-2 00:15
想要小车贴着墙壁行驶,怎么设计算法呢?




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