智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 5868|回复: 14
打印 上一主题 下一主题

如何获取速度

[复制链接]

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
威望
181
贡献
22
兑换币
0
注册时间
2009-2-25
在线时间
10 小时
跳转到指定楼层
1#
发表于 2009-4-29 17:23:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将编码器的信息接到PT7口,在不使用PE的情况下如何读出编码器的脉冲数。可否提供点中断代码,先谢谢!

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
2#
发表于 2009-4-29 18:41:02 | 只看该作者
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
威望
181
贡献
22
兑换币
0
注册时间
2009-2-25
在线时间
10 小时
3#
 楼主| 发表于 2009-4-29 19:33:26 | 只看该作者
不行哦!下面是我对程序做相应的修改,但还是采集不到,不知可帮我看看是什么原因?
///////////////////////////////////////////////////////////////////
//PT4输入捕捉测速程序,PT4口输入脉冲
//每次记录脉冲时间可修改宏:TIME_INTER
//说明此程序用于总线时钟在32M情况下,若总线时钟有变化,改分频参数和模数常数以得到精确定时
//author:whut_wj

///////////////////////////////////////////////////////////////////
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define TIME_INTER 1000  //1000个ms=1s
unsigned int Get_pulse;   //脉冲个数
unsigned int number_count;


void Start_PLL(void)   //busCLK=32M
{
  REFDV=0x01;          // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
  SYNR=0x03;                 //        =2*16M*3/2=64M
  asm{
    BRCLR CRGFLG,#$08,*
    BSET CLKSEL,#$80
    }                                                                                                          
}

void PWM_Init(void)
{
     PWME=0X00;    //关闭所有通道使能
     PWMCTL=0XE0;  //通道2、3;4、5;6、7级联
     PWMCAE=0X00;  //左对齐
     PWMPOL=0XFF;  //开始输出时为高电平
     PWMPRCLK=0X00;  //ClockA=ClockB=bus clock
     PWMCLK=0XFF;  //所有通道都选择ClockSA或ClockSB
     PWMSCLA=32;   //ClockSA=ClockA/(2*PWMSCLA)
     PWMPER45=10000; //PWM45:20ms,50Hz
     PWMDTY45=800;   //舵机占空比
     PWMSCLB=4;     //ClockSB=ClockB/(2*PWMSCLB)
     PWMPER67=2000; //PWM67:0.5ms,2KHz
     PWMPER23=2000; //PWM23:0.5ms,2KHz
     PWMDTY67=1000; //电机占空比
     PWMDTY23=0;    //电机占空比
     PWME=0XFF;     //通道23,45,67使能
     
     
}
  

/*initiate SCI*/
void SCI_Init(void)
{
     SCI0BD=208;    //busclk 32MHz, 9600bps,SCI0BDL=0xcf
     SCI0CR1=0;                  
     SCI0CR2=0X2C;  //enable Receive Full Interrupt,RX enable,Tx enable
}
void uart_putchar(unsigned char ch)
{
  if (ch == '\n')  
  {
      while(!(SCI0SR1&0x80)) ;     
      SCI0DRL= 0x0d;//output'CR'
                  
     return;
  }
  while(!(SCI0SR1&0x80)) ;       //keep waiting when not empty  
  SCI0DRL=ch;
  SCI0SR1_RDRF=1;
}
void Dly_ms(int ms)               
{
         int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<2770;jj++);    //32MHz--1ms        
}




void MDCInit(void)
{
  MCCTL = MCCTL&0Xfb; //模数计数器禁止运行
  MCCTL = 0Xe3;       //允许中断,模数计数方式
                      //返回时重新加载所用的常数,分频常数为16
  MCCTL = MCCTL|0X04; //模数计数器使能
  MCCNT = 2000; //(1/32M)*16*2000= 1ms
  MCCTL = MCCTL|0X08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
}

void Init_PT4_Capture()
  {
         
     TIOS=0x00;          //输入捕捉
     TCTL3=0x80;         //通道4下降沿触发
     TSCR2=0X07;         //分频,用来给TCNT作时间参考,这里没有意义
   
     TSCR1=0x80;         //Timer Enable
     TIE=0X80;           //初始化定时器开启
  }
  
void main(void)
{
  DisableInterrupts;
  Start_PLL();
  Init_PT4_Capture();
  MDCInit();
  PWM_Init();
  SCI_Init();
  EnableInterrupts;
  DDRB=0xff;
  PORTB=0XAA;
  for(;;)
   {
         uart_putchar((unsigned char)Get_pulse);
         Dly_ms(1000);
   }
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 26 MDC_ISR(void)
{
  static unsigned int count=0;
  count++;
  if( count==TIME_INTER)        //1秒取一次
    {
      Get_pulse = number_count;
      number_count=0;
      count=0;
      PORTB^=0Xff;
    }
  MCFLG = 0x80;
}



#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 12 PT7_Capture(void)
{
  TFLG1=0x80;
  number_count++;
}
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
威望
181
贡献
22
兑换币
0
注册时间
2009-2-25
在线时间
10 小时
4#
 楼主| 发表于 2009-4-29 19:33:30 | 只看该作者
不行哦!下面是我对程序做相应的修改,但还是采集不到,不知可帮我看看是什么原因?
///////////////////////////////////////////////////////////////////
//PT4输入捕捉测速程序,PT4口输入脉冲
//每次记录脉冲时间可修改宏:TIME_INTER
//说明此程序用于总线时钟在32M情况下,若总线时钟有变化,改分频参数和模数常数以得到精确定时
//author:whut_wj

///////////////////////////////////////////////////////////////////
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#define TIME_INTER 1000  //1000个ms=1s
unsigned int Get_pulse;   //脉冲个数
unsigned int number_count;


void Start_PLL(void)   //busCLK=32M
{
  REFDV=0x01;          // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
  SYNR=0x03;                 //        =2*16M*3/2=64M
  asm{
    BRCLR CRGFLG,#$08,*
    BSET CLKSEL,#$80
    }                                                                                                          
}

void PWM_Init(void)
{
     PWME=0X00;    //关闭所有通道使能
     PWMCTL=0XE0;  //通道2、3;4、5;6、7级联
     PWMCAE=0X00;  //左对齐
     PWMPOL=0XFF;  //开始输出时为高电平
     PWMPRCLK=0X00;  //ClockA=ClockB=bus clock
     PWMCLK=0XFF;  //所有通道都选择ClockSA或ClockSB
     PWMSCLA=32;   //ClockSA=ClockA/(2*PWMSCLA)
     PWMPER45=10000; //PWM45:20ms,50Hz
     PWMDTY45=800;   //舵机占空比
     PWMSCLB=4;     //ClockSB=ClockB/(2*PWMSCLB)
     PWMPER67=2000; //PWM67:0.5ms,2KHz
     PWMPER23=2000; //PWM23:0.5ms,2KHz
     PWMDTY67=1000; //电机占空比
     PWMDTY23=0;    //电机占空比
     PWME=0XFF;     //通道23,45,67使能
     
     
}
  

/*initiate SCI*/
void SCI_Init(void)
{
     SCI0BD=208;    //busclk 32MHz, 9600bps,SCI0BDL=0xcf
     SCI0CR1=0;                  
     SCI0CR2=0X2C;  //enable Receive Full Interrupt,RX enable,Tx enable
}
void uart_putchar(unsigned char ch)
{
  if (ch == '\n')  
  {
      while(!(SCI0SR1&0x80)) ;     
      SCI0DRL= 0x0d;//output'CR'
                  
     return;
  }
  while(!(SCI0SR1&0x80)) ;       //keep waiting when not empty  
  SCI0DRL=ch;
  SCI0SR1_RDRF=1;
}
void Dly_ms(int ms)               
{
         int ii,jj;
   if (ms<1) ms=1;
   for(ii=0;ii<ms;ii++)
     for(jj=0;jj<2770;jj++);    //32MHz--1ms        
}




void MDCInit(void)
{
  MCCTL = MCCTL&0Xfb; //模数计数器禁止运行
  MCCTL = 0Xe3;       //允许中断,模数计数方式
                      //返回时重新加载所用的常数,分频常数为16
  MCCTL = MCCTL|0X04; //模数计数器使能
  MCCNT = 2000; //(1/32M)*16*2000= 1ms
  MCCTL = MCCTL|0X08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
}

void Init_PT4_Capture()
  {
         
     TIOS=0x00;          //输入捕捉
     TCTL3=0x80;         //通道4下降沿触发
     TSCR2=0X07;         //分频,用来给TCNT作时间参考,这里没有意义
   
     TSCR1=0x80;         //Timer Enable
     TIE=0X80;           //初始化定时器开启
  }
  
void main(void)
{
  DisableInterrupts;
  Start_PLL();
  Init_PT4_Capture();
  MDCInit();
  PWM_Init();
  SCI_Init();
  EnableInterrupts;
  DDRB=0xff;
  PORTB=0XAA;
  for(;;)
   {
         uart_putchar((unsigned char)Get_pulse);
         Dly_ms(1000);
   }
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 26 MDC_ISR(void)
{
  static unsigned int count=0;
  count++;
  if( count==TIME_INTER)        //1秒取一次
    {
      Get_pulse = number_count;
      number_count=0;
      count=0;
      PORTB^=0Xff;
    }
  MCFLG = 0x80;
}



#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 12 PT7_Capture(void)
{
  TFLG1=0x80;
  number_count++;
}
回复 支持 反对

使用道具 举报

14

主题

929

帖子

1

精华

功勋会员

WJ

Rank: 10Rank: 10Rank: 10

积分
6304

特殊贡献奖章

威望
1456
贡献
4674
兑换币
17
注册时间
2008-4-6
在线时间
87 小时
5#
发表于 2009-4-29 22:13:31 | 只看该作者
采集不到?什么意思,具体讲是什么?
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
威望
181
贡献
22
兑换币
0
注册时间
2009-2-25
在线时间
10 小时
6#
 楼主| 发表于 2009-4-30 10:44:11 | 只看该作者
就是将采集的数据通过uart_putchar((unsigned char)Get_pulse);
         Dly_ms(1000);
语句输出来的都是00
回复 支持 反对

使用道具 举报

9

主题

358

帖子

42

精华

金牌会员

Rank: 6Rank: 6

积分
1296
威望
80
贡献
506
兑换币
206
注册时间
2008-9-18
在线时间
355 小时
7#
发表于 2009-5-11 10:34:30 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
威望
234
贡献
37
兑换币
10
注册时间
2009-2-10
在线时间
7 小时
8#
发表于 2009-5-15 08:33:49 | 只看该作者
其实用IO中断就可以了.

做为不是很精确的速度采集是足够的.
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
245
QQ
威望
203
贡献
22
兑换币
0
注册时间
2009-3-19
在线时间
10 小时
9#
发表于 2009-5-18 18:18:59 | 只看该作者
用io费时啊!
回复 支持 反对

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
245
QQ
威望
203
贡献
22
兑换币
0
注册时间
2009-3-19
在线时间
10 小时
10#
发表于 2009-5-18 18:19:01 | 只看该作者
用io费时啊!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-20 20:11 , Processed in 0.254091 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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