智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1171|回复: 2
打印 上一主题 下一主题

使用山外的底层库如何进行lptmr进行测速呢?

[复制链接]

22

主题

77

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1261
威望
556
贡献
299
兑换币
320
注册时间
2013-11-5
在线时间
203 小时
跳转到指定楼层
1#
发表于 2015-4-14 12:01:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我使用的是山外的底层库,使用的是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. }
复制代码


回复

使用道具 举报

38

主题

446

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6502
威望
4814
贡献
652
兑换币
1264
注册时间
2014-3-19
在线时间
518 小时
2#
发表于 2015-4-14 15:58:17 | 只看该作者
不好意思额。。,我的底层库没有改过。。。我直接用的。。。。//////////////////////////////// 以下为正交解码 //////////////////////////////////////////

/*!
*  @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 的值)
}
回复 支持 反对

使用道具 举报

22

主题

77

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1261
威望
556
贡献
299
兑换币
320
注册时间
2013-11-5
在线时间
203 小时
3#
 楼主| 发表于 2015-4-14 17:48:53 | 只看该作者
abacrya、军 发表于 2015-4-14 15:58
不好意思额。。,我的底层库没有改过。。。我直接用的。。。。//////////////////////////////// 以下为正交 ...

正交解码我们也可以 但是用lptmr模块就不行呢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-23 22:59 , Processed in 0.080983 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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