智能车制作

标题: 脉冲累加器测速问题 [打印本页]

作者: 我是北丐    时间: 2012-2-14 16:04
标题: 脉冲累加器测速问题
  各位大神好,我在调试测速的时候遇到这样一个问题,pt7口的输入频率只有在20hz一下才能被捕捉到,稍微高一点就捕捉不到了,具体的程序如下:


//PT7口用来接收编码器脉冲
void PA_Init() {
PACTL=0X50;//PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT
PACNT = 0x00;    //累加器置初值
}


void PIT0_Init(void){
   PITCFLMT_PITE=0; //禁止PIT
   PITCE_PCE0=1;    //允许时钟通道0
   PITMUX_PMUX0=0;  //通道0
   PITMTLD0=0XFF;   //通道0预设计数值为255
   PITLD0=0X0752;   //time-out period=(PITMTLD+1)*(PITLD+1)/fBUS=256X1875/48000000=10ms
   PITINTE_PINTE0=1;//通道0中断允许
   PITCFLMT_PITE=1; //开PIT中断
}


//-------------------------PIT0 中断函数-----------------------//
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0_ISR(void){       //0.01秒中断1次\
  PACTL_PAEN=0;//16b计数禁止
  
  speed_value=PACNT;
  PACNT=0x0;  
  
  PACTL_PAEN=1;//16b计数允许
  //PITTF_PTF0=1;//清除PIT0的标记
  PITTF=0X01;
  
  //时间参量
  time_value++;
  if(time_value==10000) time_value=0;
}
#pragma CODE_SEG DEFUALT   


我在pit中断里将PACNT读出来显示,发现只有输入频率比较低时speed_value才有值,稍微高一点就是0了,困扰了好长时间了,求坛里的大神帮忙看下啊。。。感激不尽啊

作者: 我是北丐    时间: 2012-2-14 16:05
自己先顶下
作者: 我是北丐    时间: 2012-2-14 16:09
再顶!
作者: whfwmy    时间: 2012-2-14 16:12
凑活顶一下吧。。。。。。。。。。。。。。哈哈
作者: whfwmy    时间: 2012-2-14 16:13
来人帮忙啊。。。。。。。。。。
作者: zhuwenwujy    时间: 2012-2-14 16:29
没看出有什么毛病啊
作者: 我是北丐    时间: 2012-2-14 17:58
zhuwenwujy 发表于 2012-2-14 16:29
没看出有什么毛病啊

是啊,已经查好长时间了,始终没发现问题,可是频率一高就捕捉不到啊


作者: zhuwenwujy    时间: 2012-2-14 19:10
我是北丐 发表于 2012-2-14 17:58
是啊,已经查好长时间了,始终没发现问题,可是频率一高就捕捉不到啊

那就奇怪了,下载到其他芯片里面试试?

作者: 断翅at雄鹰    时间: 2012-2-14 20:55
顶,我也想,参考一下
作者: 我是北丐    时间: 2012-2-14 21:00
zhuwenwujy 发表于 2012-2-14 19:10
那就奇怪了,下载到其他芯片里面试试?

我换了一个新的最小系统,效果一样,还是出不来啊,伤脑筋。。。

作者: 我是北丐    时间: 2012-2-14 21:01
断翅at雄鹰 发表于 2012-2-14 20:55
顶,我也想,参考一下

我已经惆怅很长时间了,和别人的历程也都对照过了,可还是差不出原因。。。。伤脑筋啊。。。
作者: 我是北丐    时间: 2012-2-15 09:39
坐等高手前来指点啊
作者: zhuwenwujy    时间: 2012-2-15 11:38
我是北丐 发表于 2012-2-14 21:00
我换了一个新的最小系统,效果一样,还是出不来啊,伤脑筋。。。

我得问题倒是解决了……我把12232的显示程序放到了中断里面,占用了大量的时间(相对于pit定的10ms来说),所以出来的数据就不对了……你也加油吧

作者: 我是北丐    时间: 2012-2-15 12:00
zhuwenwujy 发表于 2012-2-15 11:38
我得问题倒是解决了……我把12232的显示程序放到了中断里面,占用了大量的时间(相对于pit定的10ms来说) ...

能把你的程序贴出来看看吗?
作者: yu2010550221    时间: 2012-2-15 12:20

作者: bj_zyl    时间: 2012-2-15 13:20
先用示波器测高频率下PT7的波形看一看对不对
作者: zhuwenwujy    时间: 2012-2-15 14:03
本帖最后由 zhuwenwujy 于 2012-2-15 14:05 编辑
我是北丐 发表于 2012-2-15 12:00
能把你的程序贴出来看看吗?

//***********************************************脉冲累加初始化
void Pulse_Accumulator_Init(void){

      PACTL = 0x46;         //使能脉冲累加器,下降沿触发,禁止中断 0100 0110
      PACNT = 0x0000;       //计数器清零  


   }
//**************************************************PIT初始化

void PIT_Init(void){

   PITCFLMT&=~(1<<7);              //禁止PIT
   PITCE |= 1<<0;                  //开启通道0
   PITMUX &=~(1<<0);               //与时基0连接
   PITMTLD0 = 0xFF;                //255
   // PITLD0 = 0x927B;              //37500*256/48000000= 0.2s ;
// PITLD0 =  0X752;                 // 20ms
   PITLD0 =   0xEA5;               //1875*256/48000000=10ms
   PITCFLMT|=(1<<7);               //使能定时器
   PITTF|=(1<<0);                  //清除溢出标志位
   PITINTE|=(1<<0);                //开启溢出中断
}

//*************************************************PIT溢出中断服务程序
#pragma CODE_SEG __NEAR_SEG NON_BANKED //定时器中断
void interrupt 66 pit_interrupt(void)
{

   short int a=0,b=0,c=0,R_Velocity,L_Velocity;
   L_Velocity = PACNT;                                          //左轮编码器脉冲数
    b=PORTA;                                                    //取计数器低位值
     b=(b&0x0f)+((b>>4)*10);
      c=PTS;                                                     //取计数器高位值
       c=(c&0x0f)+((c>>4)*10);
       R_Velocity=c*100+b;                                       //右轮计数器测得脉冲数
     PTH |= (1<<0);                                             //计数器清零   

   PTH &= ~(1<<0);                                            //计数器开始工作      
   

  PITTF=0X01;//清通道0溢出标志,加载新的计时时间
}




作者: 我是北丐    时间: 2012-2-15 15:17
zhuwenwujy 发表于 2012-2-15 14:03
//***********************************************脉冲累加初始化
void Pulse_Accumulator_Init(vo ...

好的,多谢,我回头试试
作者: 我是北丐    时间: 2012-2-15 15:18
bj_zyl 发表于 2012-2-15 13:20
先用示波器测高频率下PT7的波形看一看对不对

波形是对的,我试过直接给pwm都不行
作者: zhuwenwujy    时间: 2012-2-15 17:28
我是北丐 发表于 2012-2-15 15:17
好的,多谢,我回头试试

PIT初始化里面,10ms和20ms的定时弄反了,上面是 PITLD0 =  0X752  是10ms,下面是20ms
不好意思啊,刚才才发现

作者: 孜孜和少阳    时间: 2012-2-26 13:50
让我想想啊
作者: pcj2011    时间: 2012-2-28 17:53
zhuwenwujy 发表于 2012-2-15 14:03
//***********************************************脉冲累加初始化
void Pulse_Accumulator_Init(vo ...

中断函数里的数据处理是什么意思呀,能不能给我这种新手解释下嘛。多谢咯。
作者: 樱花流年    时间: 2012-3-10 23:20
同样的困惑啊,我那个是用编码器转动,直接没有反应。在这儿同求一下
作者: 我是北丐    时间: 2012-3-11 11:13
樱花流年 发表于 2012-3-10 23:20
同样的困惑啊,我那个是用编码器转动,直接没有反应。在这儿同求一下

你用示波器看一下转动时编码器输出的波形
作者: hai_chuan    时间: 2012-4-15 15:33
我这也是啊  怎么回事
作者: long1429    时间: 2012-4-15 15:43
求解
作者: zhiyang1989    时间: 2012-4-22 16:05
我是北丐 发表于 2012-3-11 11:13
你用示波器看一下转动时编码器输出的波形

我想问下 你说的那个频率是什么意思啊 哪个频率啊 还有用示波器怎么看编码器的波形啊 什么才算正常啊 求指导。。
作者: 海彬    时间: 2012-4-24 21:13
我的比你还惨,程序都一样,读出来全是0,不解?????
作者: 我是北丐    时间: 2012-4-25 01:02
海彬 发表于 2012-4-24 21:13
我的比你还惨,程序都一样,读出来全是0,不解?????

你用pwm给pt7,看程序计不计数
作者: 海彬    时间: 2012-4-25 10:26
我是北丐 发表于 2012-4-25 01:02
你用pwm给pt7,看程序计不计数

解决了,原来是pit有问题,原来设置错了,现在一切正常。谢谢
作者: 汪稳wangwen    时间: 2012-5-30 15:27
我也想知道呀
作者: zhukongkong    时间: 2012-6-3 08:34
你用的是 捕捉?
作者: yukunlinykl    时间: 2012-6-3 09:52
你反复读PACNT,不要清零,用BDM显示在调试界面上。用一个按钮给T7口信号,不断按按钮,看看PACNT是不是紧随按钮增长,看看是不是涨到20就变成0了。
作者: 1111玩儿    时间: 2012-6-14 20:20
是 啊   为什么????????????
作者: 黄明小伙仔    时间: 2012-6-14 21:01
外部计数好坑爹,有车友解决这问题,请赐教……………………
作者: 涛韬    时间: 2012-7-19 21:50
测速的接到PT0口,能解决测速问题?





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