智能车制作

标题: 编码器脉冲捕捉计数问题 [打印本页]

作者: abacrya、军    时间: 2014-4-29 07:20
标题: 编码器脉冲捕捉计数问题
在弄编码器时,之前写的程序是每有一个正跳变脉冲,就进入FTM中断,让里面的变量加一;但是学长说这种效率太低了,,,叫我i用一个TIP定时中断,定时为一毫秒,一毫秒进入一次中断,在中断服务程序中读出FTM脉冲捕捉的计数寄存器,让后让在清零;



现在有一个问题,就是不知道这个寄存器在哪,叫什么名字,百度也不到,完全手册里也没发现,求指点,,,,,,,,

谢谢了!

作者: yyyzrxh    时间: 2014-4-29 08:14
脉冲累加器?
作者: 机遇    时间: 2014-4-29 09:16
FTM输入捕捉?用FTM的正交解码
作者: abacrya、军    时间: 2014-4-29 15:56
yyyzrxh 发表于 2014-4-29 08:14
脉冲累加器?

[attach]59156[/attach]

作者: abacrya、军    时间: 2014-4-29 15:59
机遇 发表于 2014-4-29 09:16
FTM输入捕捉?用FTM的正交解码

正交解码  那个不是用来判断正反的么?

作者: zhagsenkk    时间: 2014-4-29 16:55
:):)
作者: abacrya、军    时间: 2014-4-29 19:24
zhagsenkk 发表于 2014-4-29 16:55

同学  留个建议
作者: 狂野的庄稼汉    时间: 2014-4-29 19:40
abacrya、军 发表于 2014-4-29 15:59
正交解码  那个不是用来判断正反的么?

正交解码既可以判断正反,又可以测速,测不出来速度怎么判断正反?看Fire的库吧,里面有正交解码,在FTM那里

作者: abacrya、军    时间: 2014-4-29 19:47
狂野的庄稼汉 发表于 2014-4-29 19:40
正交解码既可以判断正反,又可以测速,测不出来速度怎么判断正反?看Fire的库吧,里面有正交解码,在FTM那 ...

[attach]59166[/attach]FTM就这三个   没有找到你说i的。。。你给我复制一个把、、。谢谢啦  我只用了一个FTM口测速、、



作者: 狂野的庄稼汉    时间: 2014-4-29 19:50
abacrya、军 发表于 2014-4-29 19:47
FTM就这三个   没有找到你说i的。。。你给我复制一个把、、。谢谢啦

额,我用的是新库,这是MK60_ftm.c里的函数
  1. //////////////////////////////// 以下为正交解码 //////////////////////////////////////////

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

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

  14.     case FTM1:
  15.         SIM_SCGC6 |= SIM_SCGC6_FTM1_MASK;       //使能FTM1时钟
  16.         if(FTM1_QDPHA == PTA8)                  //管脚复用
  17.         {
  18.             port_init(FTM1_QDPHA, ALT6);
  19.         }
  20.         else if(FTM1_QDPHA == PTA12)
  21.         {
  22.             port_init(FTM1_QDPHA, ALT7);
  23.         }
  24.         else if(FTM1_QDPHA == PTB0)
  25.         {
  26.             port_init(FTM1_QDPHA, ALT6);
  27.         }
  28.         else
  29.         {
  30.             ASSERT(0);                          //断言,配置的管脚不符合要求
  31.         }

  32.         if(FTM1_QDPHB == PTA9)
  33.         {
  34.             port_init(FTM1_QDPHB, ALT6);
  35.         }
  36.         else if(FTM1_QDPHB == PTA13)
  37.         {
  38.             port_init(FTM1_QDPHB, ALT7);
  39.         }
  40.         else if(FTM1_QDPHB == PTB1)
  41.         {
  42.             port_init(FTM1_QDPHB, ALT6);
  43.         }
  44.         else
  45.         {
  46.             ASSERT(0);                          //断言,配置的管脚不符合要求
  47.         }
  48.         break;

  49.     case FTM2:
  50.         SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK;                           //使能FTM2时钟
  51.         if(FTM2_QDPHA == PTA10)                  //管脚复用
  52.         {
  53.             port_init(FTM2_QDPHA, ALT6);
  54.         }
  55.         else if(FTM2_QDPHA == PTB18)
  56.         {
  57.             port_init(FTM2_QDPHA, ALT6);
  58.         }
  59.         else
  60.         {
  61.             ASSERT(0);                          //断言,配置的管脚不符合要求
  62.         }

  63.         if(FTM2_QDPHB == PTA11)                  //管脚复用
  64.         {
  65.             port_init(FTM2_QDPHB, ALT6);
  66.         }
  67.         else if(FTM2_QDPHB == PTB19)
  68.         {
  69.             port_init(FTM2_QDPHB, ALT6);
  70.         }
  71.         else
  72.         {
  73.             ASSERT(0);                          //断言,配置的管脚不符合要求
  74.         }
  75.         break;
  76.     default:
  77.         ASSERT(0);                              //断言,配置的模块有误
  78.         break;
  79.     }

  80.     FTM_MODE_REG(FTMN[ftmn])  |=    (0
  81.                                      | FTM_MODE_WPDIS_MASK  //写保护禁止
  82.                                      //| FTM_MODE_FTMEN_MASK   //使能 FTM
  83.                                     );
  84.     FTM_QDCTRL_REG(FTMN[ftmn]) |=   (0
  85.                                     | FTM_QDCTRL_QUADMODE_MASK
  86.                                      );
  87.     FTM_CNTIN_REG(FTMN[ftmn])   = 0;
  88.     FTM_MOD_REG(FTMN[ftmn])     = FTM_MOD_MOD_MASK;
  89.     FTM_QDCTRL_REG(FTMN[ftmn]) |=   (0
  90.                                     | FTM_QDCTRL_QUADEN_MASK
  91.                                      );
  92.     FTM_MODE_REG(FTMN[ftmn])  |= FTM_QDCTRL_QUADEN_MASK;
  93.     FTM_CNT_REG(FTMN[ftmn])     = 0;                    //计数器。只有低16位可用(写任何值到此寄存器,都会加载 CNTIN 的值)
  94. }

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

  106.     return val;
  107. }

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

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


复制代码




作者: zkm123    时间: 2014-6-23 08:55
狂野的庄稼汉 发表于 2014-4-29 19:50
额,我用的是新库,这是MK60_ftm.c里的函数

ASSERT()是什么函数啊  这个怎么写啊?
作者: 狂野的庄稼汉    时间: 2014-6-23 09:39
zkm123 发表于 2014-6-23 08:55
ASSERT()是什么函数啊  这个怎么写啊?

断言函数,自行百度

作者: zkm123    时间: 2014-6-23 10:10
狂野的庄稼汉 发表于 2014-6-23 09:39
断言函数,自行百度

恩恩 !!!




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