智能车制作

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

作者: xgchen_12    时间: 2014-6-22 21:18
标题: XS128超声波测距程序
求一个能用的XS128超声波测距程序,不需要通过显示屏显示程序,我弄了好久弄不过来,读取定时器的TCn的上的值不行,请大家帮忙了,麻烦了,谢谢。

作者: gsc617    时间: 2014-6-23 09:14
         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和你自己的距离阈值作出该做出的反应就可以,自己移植一下吧,不谢


作者: xgchen_12    时间: 2014-6-23 11:03
gsc617 发表于 2014-6-23 09:14
flag = 0;
        gpio_set(TRIG,1);               //产生触发脉冲
        pit_delay_us(PIT ...

谢谢你了,我调试一下吧。
作者: xgchen_12    时间: 2014-6-23 11:08
xgchen_12 发表于 2014-6-23 11:03
谢谢你了,我调试一下吧。

我的问题是XS128的ECT计时器读取不了它的值,程序框架我已经写好了,就是结果不对,麻烦帮我看一下,谢谢了
作者: gsc617    时间: 2014-6-23 11:31
xgchen_12 发表于 2014-6-23 11:08
我的问题是XS128的ECT计时器读取不了它的值,程序框架我已经写好了,就是结果不对,麻烦帮我看一下,谢谢 ...

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

作者: xgchen_12    时间: 2014-6-23 12:12
gsc617 发表于 2014-6-23 11:31
XS128的ECT计时器没有经过严格的时钟处理,定时不准的,好像有准确PIT定时器的吧,用这个试试吧

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

作者: 傲气杰杰    时间: 2014-7-10 16:13
gsc617 发表于 2014-6-23 09:14
flag = 0;
        gpio_set(TRIG,1);               //产生触发脉冲
        pit_delay_us(PIT ...

你们超声波准吗?
作者: gsc617    时间: 2014-7-10 22:52
傲气杰杰 发表于 2014-7-10 16:13
你们超声波准吗?

有时不灵,能用

作者: 牛奶土豆    时间: 2015-5-14 11:30

作者: 我的名字不好笑    时间: 2017-10-11 15:44
/*---------------------------------------------------------*/
/************************************************************
飞翔科技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();
          }
      }
      
  }
}





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