智能车制作

标题: K60讨论:LPT脉冲捕捉问题代码 [打印本页]

作者: 天涯小极莫    时间: 2012-2-17 12:28
标题: K60讨论:LPT脉冲捕捉问题代码
void lptmr_pulse_counter(char pin_select)
{
  uint32 a;         //该值用来存放脉冲计数值
  uint32 compare_value=1000;   //比较值,脉冲达到这个值时重置
  
  LPTMR0_CSR=0x00;   //模式初始化
  LPTMR0_PSR=0x00;
  LPTMR0_CMR=0x00;   

if(pin_select==LPTMR_ALT1)   //PTA19
  {
    SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK; //Turn on PORTA clock
    PORTA_PCR19=PORT_PCR_MUX(0x6); //Use ALT6 on PTA19
  }
  else if(pin_select==LPTMR_ALT2)  //PTC5
  {
    SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //Turn on PORTC clock
    PORTC_PCR5=PORT_PCR_MUX(0x4); //Use ALT4 on PTC5
  }

LPTMR0_PSR=LPTMR_PSR_PCS(0x01)|LPTMR_PSR_PBYP_MASK;             //Use LDO but bypass glitch filter

LPTMR0_CMR=LPTMR_CMR_COMPARE(compare_value);                          //Set compare value
  
LPTMR0_CSR=LPTMR_CSR_TPS(pin_select)    //Set LPT to use the pin selected
            |LPTMR_CSR_TMS_MASK                    // put in pulse count mode
            |LPTMR_CSR_TPP_MASK                     //on falling edge (default)
            |~LPTMR_CSR_TFC_MASK                  //counter register is reset  on overflow
            |~LPTMR_CSR_TIE_MASK                   //interrupt is disabled
            |LPTMR_CSR_TEN_MASK;                   //Turn on LPT
  
while((LPTMR0_CSR&LPTMR_CSR_TCF_MASK)==0)     //表示此刻没有脉冲输入,故可以读取脉冲数
      {                                                        
            a=LPTMR0_CNR;        //猜想PTMR0_CNR无法读取,导致等待
       }                                      //可能原因:模式未真正开启
  
}

作者: 天涯小极莫    时间: 2012-2-17 12:30
以上代码模仿FSL的例程。
出现的问题:无法读取LPTMR0_CNR值
                  导致程序停留在此处,无法进行其他代码的执行。
作者: 天涯小极莫    时间: 2012-2-17 20:04
问题已解决,但想说这东西有些不稳定
作者: 而而非无人    时间: 2012-2-18 15:59
楼主 又没有AD的历程 求指点呀 我纠结好些时候了
作者: 天涯小极莫    时间: 2012-2-18 23:14
而而非无人 发表于 2012-2-18 15:59
楼主 又没有AD的历程 求指点呀 我纠结好些时候了

FSL官方的例程,IAR  arm 6.1
作者: 天涯小极莫    时间: 2012-2-18 23:15
好好研究FSL例程和datasheet,很管用
作者: 270136977    时间: 2012-4-3 11:39
天涯小极莫 发表于 2012-2-17 20:04
问题已解决,但想说这东西有些不稳定

是什么问题啊楼主
作者: 天涯小极莫    时间: 2012-4-5 18:55
这是调试通过的代码,液晶每隔1s,显示下速度(脉冲数)
作者: 天涯小极莫    时间: 2012-4-5 18:56
[attach]22116[/attach]

[attach]22116[/attach]刚才,没传成功
作者: sunnyfei    时间: 2012-4-14 14:54
我们的计数好像比实际的大很多,怎么回事
作者: 天涯小极莫    时间: 2012-4-16 08:52
sunnyfei 发表于 2012-4-14 14:54
我们的计数好像比实际的大很多,怎么回事

有么有定时清除寄存器
作者: weichuiweicao    时间: 2012-4-20 22:58
谢谢分享!
作者: zjjzh    时间: 2012-5-2 11:59
天涯小极莫 发表于 2012-2-17 20:04
问题已解决,但想说这东西有些不稳定

你是怎么解决这问题的

作者: hanchao    时间: 2012-5-24 02:31
我的LPTMR测速也很不稳,有时就算用函数发生器给个固定方波它都测不对,求大吓指点迷津啊,不胜感激
作者: 天涯小极莫    时间: 2012-5-26 23:28
hanchao 发表于 2012-5-24 02:31
我的LPTMR测速也很不稳,有时就算用函数发生器给个固定方波它都测不对,求大吓指点迷津啊,不胜感激

我是10ms提取一次值,之后对整个初始化。。。

作者: tianma    时间: 2012-8-10 14:44
我也碰到楼主的问题了:无法读取LPTMR0_CNR值
                  导致程序停留在此处,无法进行其他代码的执行。
楼主是怎么解决的?
作者: 天涯小极莫    时间: 2012-8-12 09:36
tianma 发表于 2012-8-10 14:44
我也碰到楼主的问题了:无法读取LPTMR0_CNR值
                  导致程序停留在此处,无法进行其他代码的 ...

重新初始化
作者: tianma    时间: 2012-8-12 10:29
天涯小极莫 发表于 2012-8-12 09:36
重新初始化

已解决,多谢楼主
作者: m__dd    时间: 2013-3-12 12:44
天涯小极莫 发表于 2012-5-26 23:28
我是10ms提取一次值,之后对整个初始化。。。

我10ms提取一次误差很大,50ms或大于50ms就很稳定(越大越稳定),怎么回事?
我没有整个初始化,只是将其清零了

作者: 忍冬草    时间: 2013-3-17 20:27
楼主,是几路计数
作者: 霸气外露    时间: 2013-4-7 00:18
学习中。。。。。。。
作者: 寒窗乍暖    时间: 2013-4-8 13:12
天涯小极莫 发表于 2012-2-17 20:04
问题已解决,但想说这东西有些不稳定

想请问一下楼主怎么解决这个问题,我现在读出来的LPTMR0_CNR一直为零,我也觉得是在这一句上程序卡死了

作者: 天涯小极莫    时间: 2013-4-8 21:45
寒窗乍暖 发表于 2013-4-8 13:12
想请问一下楼主怎么解决这个问题,我现在读出来的LPTMR0_CNR一直为零,我也觉得是在这一句上程序卡死了

重新初始化

作者: ③⑦喥の膤    时间: 2014-9-8 10:26
sunnyfei 发表于 2012-4-14 14:54
我们的计数好像比实际的大很多,怎么回事

我的怎么都一直没数据呢?

作者: ③⑦喥の膤    时间: 2014-9-8 10:34
你的这个代码现在能用吗

作者: ③⑦喥の膤    时间: 2014-9-8 11:24
void lptmr_pulse_counter()
{
         uint32 compare_value=50000;
         SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;  //开启模块的时钟单元
          
          LPTMR0_CSR=0x00;                    //LPTMR的初始化
          LPTMR0_PSR=0x00;
          LPTMR0_CMR=0x00;
         
          SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //Turn on PORTC clock
          PORTC_PCR5=PORT_PCR_MUX(0x4);      //Use ALT4 on PTC5

          LPTMR0_PSR|=LPTMR_PSR_PCS(0x1)|LPTMR_PSR_PBYP_MASK;  //Use LDO but bypass glitch filter

          LPTMR0_CMR|=LPTMR_CMR_COMPARE(compare_value);        //Set compare value
          
          LPTMR0_CSR|=LPTMR_CSR_TPS(0x2);            //Set LPT to use the pin selected
          LPTMR0_CSR|=LPTMR_CSR_TMS_MASK;            //put in pulse count mode   上升沿捕捉
          LPTMR0_CSR|=LPTMR_CSR_TEN_MASK;   
}
void pit1_isr(void)
{  
                disable_irq (69);
      if((PIT_TFLG0&PIT_TFLG_TIF_MASK)!=0)
      {   
              LPTMR0_CNR=0x01;
              d = LPTMR0_CNR;                                             //保存脉冲计数器计算值
              uart_send(chai,5);
              uart_putchar(',');
              LPTMR0_CSR &= ~(0x01);
              LPTMR0_CSR |= (0x01);//LPT0_ALT2,计数模式
             // LPTMR_CSR_REG(LPTMR0_BASE_PTR)  &= ~LPTMR_CSR_TEN_MASK;     //重启LPTMR 清计数
             // LPTMR_CSR_REG(LPTMR0_BASE_PTR)  |=LPTMR_CSR_TEN_MASK;  
            PIT_TFLG0|=PIT_TFLG_TIF_MASK;       //清标志
            lptmr_pulse_counter();
      }
      enable_irq (69);
}
作者: ③⑦喥の膤    时间: 2014-9-8 11:24
③⑦喥の膤 发表于 2014-9-8 11:24
void lptmr_pulse_counter()
{
         uint32 compare_value=50000;

void lptmr_pulse_counter()
{
         uint32 compare_value=50000;
         SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;  //开启模块的时钟单元
          
          LPTMR0_CSR=0x00;                    //LPTMR的初始化
          LPTMR0_PSR=0x00;
          LPTMR0_CMR=0x00;
         
          SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //Turn on PORTC clock
          PORTC_PCR5=PORT_PCR_MUX(0x4);      //Use ALT4 on PTC5

          LPTMR0_PSR|=LPTMR_PSR_PCS(0x1)|LPTMR_PSR_PBYP_MASK;  //Use LDO but bypass glitch filter

          LPTMR0_CMR|=LPTMR_CMR_COMPARE(compare_value);        //Set compare value
          
          LPTMR0_CSR|=LPTMR_CSR_TPS(0x2);            //Set LPT to use the pin selected
          LPTMR0_CSR|=LPTMR_CSR_TMS_MASK;            //put in pulse count mode   上升沿捕捉
          LPTMR0_CSR|=LPTMR_CSR_TEN_MASK;   
}
void pit1_isr(void)
{  
                disable_irq (69);
      if((PIT_TFLG0&PIT_TFLG_TIF_MASK)!=0)
      {   
              LPTMR0_CNR=0x01;
              d = LPTMR0_CNR;                                             //保存脉冲计数器计算值
              uart_send(chai,5);
              uart_putchar(',');
              LPTMR0_CSR &= ~(0x01);
              LPTMR0_CSR |= (0x01);//LPT0_ALT2,计数模式
             // LPTMR_CSR_REG(LPTMR0_BASE_PTR)  &= ~LPTMR_CSR_TEN_MASK;     //重启LPTMR 清计数
             // LPTMR_CSR_REG(LPTMR0_BASE_PTR)  |=LPTMR_CSR_TEN_MASK;  
            PIT_TFLG0|=PIT_TFLG_TIF_MASK;       //清标志
            lptmr_pulse_counter();
      }
      enable_irq (69);
}


帮我看看有什么问题,数据一直为零






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