智能车制作

标题: 使用山外的底层库如何进行lptmr进行测速呢? [打印本页]

作者: 灰帽子理工男    时间: 2015-4-14 12:01
标题: 使用山外的底层库如何进行lptmr进行测速呢?
我使用的是山外的底层库,使用的是MK60DN510VLQ10芯片,需要在读取的时候对 LPTMR0_CNR; 进行赋值,但是修改了之后似乎没什么用,请大神帮忙检查下,我修改的对吗??

  1. void lptmr_pulse_init(LPT0_ALTn altn, uint16 count, LPT_CFG cfg)
  2. {

  3. #if  defined(MK60F15)
  4.     OSC0_CR |= OSC_CR_ERCLKEN_MASK;                              //使能 OSCERCLK
  5. #endif

  6.     // 开启模块时钟
  7.    
  8.     SIM_SCGC5 |= SIM_SCGC5_LPTIMER_MASK;                        //使能LPT模块时钟

  9.     //设置输入管脚
  10.     if(altn == LPT0_ALT1)
  11.     {
  12.         port_init(PTA19, ALT6 );            //在PTA19上使用 ALT6
  13.     }
  14.     else if(altn == LPT0_ALT2)
  15.     {
  16.         port_init(PTC5, ALT4 );             //在PTC5上使用 ALT4
  17.     }
  18.     else                                    //不可能发生事件
  19.     {
  20.         ASSERT((altn == LPT0_ALT1 ) || (altn == LPT0_ALT2 ));   //设置管脚有误?
  21.     }

  22.     // 清状态寄存器
  23.     LPTMR0_CSR = 0x00;                                          //先关了LPT,这样才能设置时钟分频,清空计数值等

  24. #if defined(MK60DZ10)
  25.     //选择时钟源
  26.     LPTMR0_PSR  =   ( 0
  27.                       | LPTMR_PSR_PCS(1)                  //选择时钟源: 0 为 MCGIRCLK ,1为 LPO(1KHz) ,2为 ERCLK32K ,3为 OSCERCLK
  28.                       | LPTMR_PSR_PBYP_MASK               //旁路 预分频/干扰滤波器 ,即不用 预分频/干扰滤波器(注释了表示使用预分频/干扰滤波器)
  29.                       //| LPTMR_PSR_PRESCALE(1)           //预分频值 = 2^(n+1) ,n = 0~ 0xF
  30.                     );
  31. #elif defined(MK60F15)
  32.     //选择时钟源
  33.     LPTMR0_PSR  =   ( 0
  34.                       | LPTMR_PSR_PCS(3)          //选择时钟源: 0 为 MCGIRCLK ,1为 LPO(1KHz) ,2为 ERCLK32K ,3为 OSCERCLK
  35.                       //| LPTMR_PSR_PBYP_MASK     //旁路 预分频/干扰滤波器 ,即不用 预分频/干扰滤波器(注释了表示使用预分频/干扰滤波器)
  36.                       | LPTMR_PSR_PRESCALE(4)     //预分频值 = 2^(n+1) ,n = 0~ 0xF
  37.                     );
  38. #endif

  39.     // 设置累加计数值
  40.     LPTMR0_CMR  =   LPTMR_CMR_COMPARE(count);                   //设置比较值

  41.     // 管脚设置、使能中断
  42.     LPTMR0_CSR  =  (0
  43.                     | LPTMR_CSR_TPS(altn)       // 选择输入管脚 选择
  44.                     | LPTMR_CSR_TMS_MASK        // 选择脉冲计数 (注释了表示时间计数模式)
  45.                     | ( cfg == LPT_Falling ?  LPTMR_CSR_TPP_MASK :   0  )  //脉冲计数器触发方式选择:0为高电平有效,上升沿加1
  46.                     | LPTMR_CSR_TEN_MASK        //使能LPT(注释了表示禁用)
  47.                     | LPTMR_CSR_TIE_MASK        //中断使能
  48.                     //| LPTMR_CSR_TFC_MASK      //0:计数值等于比较值就复位;1:溢出复位(注释表示0)
  49.                    );
  50.     //LPTMR0_CNR = 0;
  51. }

  52. /*!
  53. *  @brief      获取LPTMR脉冲计数值
  54. *  @return     脉冲计数值
  55. *  @since      v5.0
  56. *  Sample usage:       uint16 data = lptmr_pulse_get();  //获取脉冲计数值
  57. */
  58. uint16 lptmr_pulse_get(void)
  59. {
  60.     uint16 data;
  61.     LPTMR0_CNR = 0x00; //这个是我修改的地方 在读之前 我先给 赋值为 0
  62.     data = LPTMR0_CNR;
  63.     return data;
  64. }


  65. /*!
  66. *  @brief      清空LPTMR脉冲计数
  67. *  @since      v5.0
  68. *  Sample usage:       lptmr_counter_clean();          //清空LPTMR脉冲计数
  69. */
  70. void lptmr_pulse_clean(void)
  71. {
  72.     LPTMR0_CSR  &= ~LPTMR_CSR_TEN_MASK;     //禁用LPT的时候就会自动清计数器的值
  73.     LPTMR0_CSR  |= LPTMR_CSR_TEN_MASK;
  74. }
复制代码



作者: abacrya、军    时间: 2015-4-14 15:58
不好意思额。。,我的底层库没有改过。。。我直接用的。。。。//////////////////////////////// 以下为正交解码 //////////////////////////////////////////

/*!
*  @brief      初始化FTM 的正交解码 功能
*  @param      FTMn_e    模块号( FTM1、  FTM2)
*  @since      v5.0
*  Sample usage:       FTM_QUAD_Init(FTM1);    //初始化 FTM1 为正交解码模式
*/
void FTM_QUAD_Init(FTMn_e ftmn)
{
    ASSERT( (ftmn == FTM1) || (ftmn == FTM2 ) ); //检查传递进来的通道是否正确

    /******************* 开启时钟 和 复用IO口*******************/
    switch(ftmn)
    {

    case FTM1:
        SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;       //使能FTM1时钟
        if(FTM1_QDPHA == PTA8)                  //管脚复用
        {
            port_init(FTM1_QDPHA, ALT6);
        }
        else if(FTM1_QDPHA == PTA12)
        {
            port_init(FTM1_QDPHA, ALT7);
        }
        else if(FTM1_QDPHA == PTB0)
        {
            port_init(FTM1_QDPHA, ALT6);
        }
        else
        {
            ASSERT(0);                          //断言,配置的管脚不符合要求
        }

        if(FTM1_QDPHB == PTA9)
        {
            port_init(FTM1_QDPHB, ALT6);
        }
        else if(FTM1_QDPHB == PTA13)
        {
            port_init(FTM1_QDPHB, ALT7);
        }
        else if(FTM1_QDPHB == PTB1)
        {
            port_init(FTM1_QDPHB, ALT6);
        }
        else
        {
            ASSERT(0);                          //断言,配置的管脚不符合要求
        }
        break;

    case FTM2:
        SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;                           //使能FTM2时钟
        if(FTM2_QDPHA == PTA10)                  //管脚复用
        {
            port_init(FTM2_QDPHA, ALT6);
        }
        else if(FTM2_QDPHA == PTB18)
        {
            port_init(FTM2_QDPHA, ALT6);
        }
        else
        {
            ASSERT(0);                          //断言,配置的管脚不符合要求
        }

        if(FTM2_QDPHB == PTA11)                  //管脚复用
        {
            port_init(FTM2_QDPHB, ALT6);
        }
        else if(FTM2_QDPHB == PTB19)
        {
            port_init(FTM2_QDPHB, ALT6);
        }
        else
        {
            ASSERT(0);                          //断言,配置的管脚不符合要求
        }
        break;
    default:
        ASSERT(0);                              //断言,配置的模块有误
        break;
    }

    FTM_MODE_REG(FTMN[ftmn])  |=    (0
                                     | FTM_MODE_WPDIS_MASK  //写保护禁止
                                     //| FTM_MODE_FTMEN_MASK   //使能 FTM
                                    );
    FTM_QDCTRL_REG(FTMN[ftmn]) |=   (0
                                    | FTM_QDCTRL_QUADMODE_MASK
                                     );
    FTM_CNTIN_REG(FTMN[ftmn])   = 0;
    FTM_MOD_REG(FTMN[ftmn])     = FTM_MOD_MOD_MASK;
    FTM_QDCTRL_REG(FTMN[ftmn]) |=   (0
                                    | FTM_QDCTRL_QUADEN_MASK
                                     );
    FTM_MODE_REG(FTMN[ftmn])  |= FTM_QDCTRL_QUADEN_MASK;
    FTM_CNT_REG(FTMN[ftmn])     = 0;                    //计数器。只有低16位可用(写任何值到此寄存器,都会加载 CNTIN 的值)
}

/*!
*  @brief      获取FTM 正交解码 的脉冲数
*  @param      FTMn_e    模块号( FTM1、  FTM2)
*  @since      v5.0
*  Sample usage:       int16 count = FTM_QUAD_get(FTM1);    //获取  FTM1 交解码 的脉冲数
*/
int16 FTM_QUAD_get(FTMn_e ftmn)
{
    int16 val;
    ASSERT( (ftmn == FTM1) || (ftmn == FTM2 ) );        //检查传递进来的通道是否正确
    val = FTM_CNT_REG(FTMN[ftmn]);

    return val;
}

/*!
*  @brief      清 FTM 正交解码 的脉冲数
*  @param      FTMn_e    模块号( FTM1、  FTM2)
*  @since      v5.0
*  Sample usage:       FTM_QUAD_clean(FTM1);    //复位 FTM1 正交解码 的脉冲数
*/
void FTM_QUAD_clean(FTMn_e ftmn)
{
    ASSERT( (ftmn == FTM1) || (ftmn == FTM2 ) ); //检查传递进来的通道是否正确

    FTM_CNT_REG(FTMN[ftmn])     = 0;             //计数器。只有低16位可用(写任何值到此寄存器,都会加载 CNTIN 的值)
}

作者: 灰帽子理工男    时间: 2015-4-14 17:48
abacrya、军 发表于 2015-4-14 15:58
不好意思额。。,我的底层库没有改过。。。我直接用的。。。。//////////////////////////////// 以下为正交 ...

正交解码我们也可以 但是用lptmr模块就不行呢





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