智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4457|回复: 9
打印 上一主题 下一主题

[软件类] XS128超声波测距程序

[复制链接]

3

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
655
威望
353
贡献
196
兑换币
211
注册时间
2014-6-9
在线时间
53 小时
毕业学校
中国民航大学
跳转到指定楼层
1#
发表于 2014-6-22 21:18:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
求一个能用的XS128超声波测距程序,不需要通过显示屏显示程序,我弄了好久弄不过来,读取定时器的TCn的上的值不行,请大家帮忙了,麻烦了,谢谢。

回复

使用道具 举报

4

主题

306

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4359
威望
1997
贡献
1174
兑换币
1382
注册时间
2013-12-26
在线时间
594 小时
2#
发表于 2014-6-23 09:14:12 | 只看该作者
         flag = 0;
        gpio_set(TRIG,1);               //产生触发脉冲
        pit_delay_us(PIT1,15);
        gpio_set(TRIG,0);

        while(gpio_get(ECHG) == 0);             //等待电平变高,低电平一直等待
        pit_time_start  (PIT0);                 //开始计时
        while(gpio_get(ECHG) == 1)              //等待电平变低,高电平一直等待
        {
            flag++;
            if(flag >FLAGWAIT)
            {
                break;
            }
        };            

        timevar = pit_time_get_us    (PIT0);    //停止计时,获取计时时间
        if(flag <FLAGWAIT )
        {
            timevar = timevar * 340 /2/1000;
        }
这是K60,判断 timevar和你自己的距离阈值作出该做出的反应就可以,自己移植一下吧,不谢

回复

使用道具 举报

3

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
655
威望
353
贡献
196
兑换币
211
注册时间
2014-6-9
在线时间
53 小时
毕业学校
中国民航大学
3#
 楼主| 发表于 2014-6-23 11:03:46 | 只看该作者
gsc617 发表于 2014-6-23 09:14
flag = 0;
        gpio_set(TRIG,1);               //产生触发脉冲
        pit_delay_us(PIT ...

谢谢你了,我调试一下吧。
回复

使用道具 举报

3

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
655
威望
353
贡献
196
兑换币
211
注册时间
2014-6-9
在线时间
53 小时
毕业学校
中国民航大学
4#
 楼主| 发表于 2014-6-23 11:08:42 | 只看该作者
xgchen_12 发表于 2014-6-23 11:03
谢谢你了,我调试一下吧。

我的问题是XS128的ECT计时器读取不了它的值,程序框架我已经写好了,就是结果不对,麻烦帮我看一下,谢谢了
回复

使用道具 举报

4

主题

306

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4359
威望
1997
贡献
1174
兑换币
1382
注册时间
2013-12-26
在线时间
594 小时
5#
发表于 2014-6-23 11:31:58 | 只看该作者
xgchen_12 发表于 2014-6-23 11:08
我的问题是XS128的ECT计时器读取不了它的值,程序框架我已经写好了,就是结果不对,麻烦帮我看一下,谢谢 ...

XS128的ECT计时器没有经过严格的时钟处理,定时不准的,好像有准确PIT定时器的吧,用这个试试吧
回复

使用道具 举报

3

主题

17

帖子

0

精华

高级会员

Rank: 4

积分
655
威望
353
贡献
196
兑换币
211
注册时间
2014-6-9
在线时间
53 小时
毕业学校
中国民航大学
6#
 楼主| 发表于 2014-6-23 12:12:26 | 只看该作者
gsc617 发表于 2014-6-23 11:31
XS128的ECT计时器没有经过严格的时钟处理,定时不准的,好像有准确PIT定时器的吧,用这个试试吧

对的,有PIT定时中断,我再去试试。谢谢你喽。
回复

使用道具 举报

10

主题

193

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1606
威望
643
贡献
295
兑换币
398
注册时间
2013-8-15
在线时间
334 小时
7#
发表于 2014-7-10 16:13:11 | 只看该作者
gsc617 发表于 2014-6-23 09:14
flag = 0;
        gpio_set(TRIG,1);               //产生触发脉冲
        pit_delay_us(PIT ...

你们超声波准吗?
回复

使用道具 举报

4

主题

306

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4359
威望
1997
贡献
1174
兑换币
1382
注册时间
2013-12-26
在线时间
594 小时
8#
发表于 2014-7-10 22:52:00 | 只看该作者
傲气杰杰 发表于 2014-7-10 16:13
你们超声波准吗?

有时不灵,能用
回复

使用道具 举报

2

主题

291

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1578
QQ
威望
740
贡献
524
兑换币
501
注册时间
2013-10-30
在线时间
157 小时
9#
发表于 2015-5-14 11:30:01 | 只看该作者
回复

使用道具 举报

0

主题

3

帖子

0

精华

注册会员

Rank: 2

积分
15
QQ
威望
10
贡献
5
兑换币
4
注册时间
2017-10-11
在线时间
0 小时
毕业学校
西南交通大学
10#
发表于 2017-10-11 15:44:56 | 只看该作者
/*---------------------------------------------------------*/
/************************************************************
飞翔科技MC9S12XS128智能车开发平台
E-mail: 2008f.d@163.com
淘宝店:http://fxfreefly.taobao.com
************************************************************/
/*---------------------------------------------------------*/
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "OLED.h"

#define  BUS_CLOCK                   32000000           //总线频率,改变总线频率直接在此处修改
#define  OSC_CLOCK                   16000000           //晶振频率

#define TRIG1  PTM_PTM6
#define ECHO1  PTIH_PTIH2

#define TRIG1_dir  DDRM_DDRM6
#define ECHO1_dir  DDRH_DDRH2

unsigned int a,b;
unsigned int k=0;
unsigned int distance1;   //障碍物的距离,单位cm


/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
  TSCR1_TFFCA = 1;  // 定时器标志位快速清除
  TSCR1_TEN = 1;    // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器)
  TIOS  = 0xff;      //指定所有通道为输出比较方式
  TCTL1 = 0x00;            // 后四个通道设置为定时器与输出引脚断开
  TCTL2 = 0x00;     // 前四个通道设置为定时器与输出引脚断开
  TIE   = 0x00;     // 禁止所有通道定时中断
  TSCR2 = 0x07;            // 预分频系数pr2-pr0:111,,时钟周期为4us,
  TFLG1 = 0xff;            // 清除各IC/OC中断标志位
  TFLG2 = 0xff;     // 清除自由定时器中断标志位
}

/*************************************************************/
/*                   初始化超声波函数                        */
/*************************************************************/
void init_CS(void)
{
    TRIG1_dir=1;
    ECHO1_dir=0;
    TRIG1=0;
   
}

/*************************************************************/
/*                  通过超声波模块测距                       */
/*************************************************************/
void chufa_CS1(void)
{
    a=TCNT;
    TRIG1=1;      //产生触发信号
    for(;;)
    {
        if(TCNT-a>=3)   //信号持续12us
            break;
    }
    TRIG1=0;
   
    while(ECHO1==0);   //等待返回信号
   
    a=TCNT;
    while(ECHO1==1)
    {
        if(TCNT-a>1470)   //所测距离大于1米
        break;
    }
    b=TCNT-a;     //计算测距的时长
    //b的单位为4us
    //则距离可以表达为4*b*0.000001*340*100/2cm
   
    distance1=17*b/250;
}

/*************************************************************/
/*                    在OLED上显示数据                       */
/*************************************************************/
void play_data(void)
{
    unsigned char temp[8];
    if(distance1>=100)
    {
        temp[0]='>';
        temp[1]='=';
        temp[2]='1';
        temp[3]='0';
        temp[4]='0';
        temp[5]='c';
        temp[6]='m';
        temp[7]=0;
    }
    else
    {
        temp[0]=distance1/10+48;
        temp[1]=distance1%10+48;
        temp[2]='c';
        temp[3]='m';
        temp[4]=' ';
        temp[5]=' ';
        temp[6]=' ';
        temp[7]=0;
    }
    OLED_6x8Str(18,3,temp);
}


/*************************************************************/
/*                         主函数                            */
/*************************************************************/
void main(void)
{
        DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  OLED_Init();
  init_CS();
        EnableInterrupts;

  OLED_PutString(0, 0, "飞翔科技开发板");   //显示16x16汉字

  OLED_6x8Str(0,3,"d1:");
  
  TFLG1_C7F = 1;              //清除标志位
  TC7 = TCNT + 2500;         //设置输出比较时间为10ms
  for(;;)
  {
      if(TFLG1_C7F==1)            
      {
          TFLG1_C7F = 1;              //清除标志位
          TC7 = TCNT + 2500;         //设置输出比较时间为10ms
         
          k+=1;
          if(k>=4)
          {
              k=0;
              chufa_CS1();
              play_data();
          }
      }
      
  }
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 02:31 , Processed in 0.101385 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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