智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4213|回复: 19
打印 上一主题 下一主题

超声波测距程序

[复制链接]

3

主题

42

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2624
威望
1359
贡献
901
兑换币
895
注册时间
2014-9-11
在线时间
182 小时
跳转到指定楼层
1#
发表于 2014-11-3 21:05:40 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
下面是一个用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;     //不允许覆盖寄存器
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
20#
发表于 2015-9-2 00:15:12 | 只看该作者
想要小车贴着墙壁行驶,怎么设计算法呢?
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
威望
154
贡献
78
兑换币
90
注册时间
2014-8-30
在线时间
35 小时
毕业学校
广州大学
19#
发表于 2015-8-28 20:38:47 | 只看该作者
我使用US100超声波,请问Trig和Echo接单片机的什么引脚?
回复 支持 反对

使用道具 举报

3

主题

42

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2624
威望
1359
贡献
901
兑换币
895
注册时间
2014-9-11
在线时间
182 小时
18#
 楼主| 发表于 2015-6-2 08:52:11 | 只看该作者
本帖最后由 Mr.不弃 于 2015-6-2 08:53 编辑
牛奶土豆 发表于 2015-5-31 12:42
你的能返回距离那TC0H应该就是一个单独的寄存器吧

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

2

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1578
QQ
威望
740
贡献
524
兑换币
501
注册时间
2013-10-30
在线时间
157 小时
17#
发表于 2015-5-31 12:42:48 | 只看该作者
Mr.不弃 发表于 2015-5-29 16:39
TCx为ECT的输入捕捉/输出比较寄存器,TCxH为输入捕捉/输出比较保持寄存器,而且两者都是16位寄存器。
这 ...

你的能返回距离那TC0H应该就是一个单独的寄存器吧
回复 支持 反对

使用道具 举报

2

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1578
QQ
威望
740
贡献
524
兑换币
501
注册时间
2013-10-30
在线时间
157 小时
16#
发表于 2015-5-31 12:38:38 | 只看该作者
Mr.不弃 发表于 2015-5-29 16:39
TCx为ECT的输入捕捉/输出比较寄存器,TCxH为输入捕捉/输出比较保持寄存器,而且两者都是16位寄存器。
这 ...

你看编译器里的TC0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

3

主题

42

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2624
威望
1359
贡献
901
兑换币
895
注册时间
2014-9-11
在线时间
182 小时
15#
 楼主| 发表于 2015-5-29 16:39:22 | 只看该作者
牛奶土豆 发表于 2015-5-29 12:30
因为TC0H是TC0的高8位啊

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

回复 支持 1 反对 0

使用道具 举报

2

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1578
QQ
威望
740
贡献
524
兑换币
501
注册时间
2013-10-30
在线时间
157 小时
14#
发表于 2015-5-29 12:30:59 | 只看该作者
Mr.不弃 发表于 2015-5-29 08:17
为什么需要*256?望指点迷津...

因为TC0H是TC0的高8位啊
回复 支持 反对

使用道具 举报

3

主题

42

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2624
威望
1359
贡献
901
兑换币
895
注册时间
2014-9-11
在线时间
182 小时
13#
 楼主| 发表于 2015-5-29 08:17:55 | 只看该作者
牛奶土豆 发表于 2015-5-14 13:05
源码中的TC0H应该不能直接给T0吧,如果赋给T0,还要乘以256

为什么需要*256?望指点迷津...
回复 支持 反对

使用道具 举报

2

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1578
QQ
威望
740
贡献
524
兑换币
501
注册时间
2013-10-30
在线时间
157 小时
12#
发表于 2015-5-14 13:05:36 | 只看该作者
源码中的TC0H应该不能直接给T0吧,如果赋给T0,还要乘以256
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 00:30 , Processed in 0.093516 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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