智能车制作

标题: K60的正交解码 [打印本页]

作者: larry    时间: 2012-2-27 09:38
标题: K60的正交解码
昨晚弄了一个晚上调出了K60的正交脉冲计数,和大家分享一下,不知车已经立起来的高手有没有也用K60,还用什么方法的呢?/*==============================================================================
功能:FTM1、FTM2模块双路正交脉冲计数;
引脚:PTA12、PTA13、PTA10、PTA11
内容:初始化FTM1、FTM2的正交解码功能;
参数:无
==============================================================================*/
void FTM_QUAD_init()
{
    /*开启端口时钟*/
    SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK;

    /*选择管脚复用功能*/
    PORTA_PCR12 = PORT_PCR_MUX(7);
    PORTA_PCR13 = PORT_PCR_MUX(7);
    PORTA_PCR10 = PORT_PCR_MUX(6);
    PORTA_PCR11 = PORT_PCR_MUX(6);

    /*使能FTM1、FTM2时钟*/
    SIM_SCGC6|=SIM_SCGC6_FTM1_MASK;
    SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;

    FTM1_MOD = 14000; //可根据需要设置
    FTM2_MOD = 14000;

    FTM1_CNTIN = 0;
    FTM2_CNTIN = 0;

    FTM1_MODE |= FTM_MODE_WPDIS_MASK; //禁止写保护
    FTM2_MODE |= FTM_MODE_WPDIS_MASK; //禁止写保护
    FTM1_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,关闭TPM兼容模式,开启FTM所有功能
    FTM2_MODE |= FTM_MODE_FTMEN_MASK; //FTMEN=1,关闭TPM兼容模式,开启FTM所有功能

    FTM1_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //选定编码模式为A相与B相编码模式
    FTM1_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解码模式
    FTM2_QDCTRL &= ~FTM_QDCTRL_QUADMODE_MASK; //选定编码模式为A相与B相编码模式
    FTM2_QDCTRL |= FTM_QDCTRL_QUADEN_MASK; //使能正交解码模式

    FTM1_SC |= FTM_SC_CLKS(3);  //选择外部时钟
//   FTM1_CONF |=FTM_CONF_BDMMODE(3); //可根据需要选择
    FTM2_SC |= FTM_SC_CLKS(3);
//   FTM2_CONF |=FTM_CONF_BDMMODE(3);

}


查看FTM1_CNT、FTM2_CNT就可知道当前计数值,查看TOFDIR、QUADIR可以知道转向。

作者: zouqs19900905    时间: 2012-3-15 19:12
楼主 这个脉冲计算对吗 怎么接IO口啊  还有是什么沿 记数啊 谢谢啦
作者: larry    时间: 2012-3-15 21:16
它是两路脉冲的所有边沿都检测的,所以所得计数器的值要除以4才能得到实际脉冲数
作者: xuezihan    时间: 2012-3-16 20:09
好东西 辛苦楼主勒
作者: 陈胜利    时间: 2012-3-28 20:10
lmptr可以计数
作者: larry    时间: 2012-4-2 13:51
我这里的情况指电磁组的双路脉冲检测方案
作者: 270136977    时间: 2012-4-4 18:26
陈胜利 发表于 2012-3-28 20:10
lmptr可以计数

最近在调脉冲计数,,,,有点问题求指教啊大虾~
作者: 陈胜利    时间: 2012-4-5 23:29

作者: 贰玖零计时器    时间: 2012-4-5 23:56
请问这是实现了加减计数器的功能吗?
作者: eve昔枫    时间: 2012-5-4 14:48
大侠,查看FTM1_CNT、FTM2_CNT当前计数值,查看TOFDIR、QUADIR可以知道转向
TOFDIR、QUADIR是哪两个啊?新手求指导~ 谢谢
我将CNT读取在INT型中 但没有符号 一直是正值~
作者: cjfoon    时间: 2012-5-23 22:05
能不能实现正反向异号脉冲数?
作者: wo520    时间: 2012-5-24 13:02
楼主问一下用K60的优势和XS128相比的优势大不大???
作者: qq703242889    时间: 2012-5-27 15:41
  楼主,可否现身,最近电测测速遇到困难,楼主可有帮助一下,小弟在此拜谢!
作者: xc229876115    时间: 2013-1-19 21:16
陈胜利 发表于 2012-3-28 20:10
lmptr可以计数

能把你的LPTMR计数代码贴一下么?谢谢!
作者: 海军10291147    时间: 2013-1-19 21:32

作者: 十七岁不哭    时间: 2013-1-21 21:40
楼主为什么没有用过滤器呢?
作者: 我爱小kb    时间: 2013-1-24 01:12
用FTM和用lptmr哪个好呀?有什么不同的吗?
作者: liuyuliuyu1216    时间: 2013-1-24 07:13
顶一个
作者: 文圣利    时间: 2013-2-21 08:49
lmptr可以计数,不好用,计数器只能加,没法清零
作者: 文圣利    时间: 2013-2-21 11:58
正交解码计数,好像会丢,计的数比脉冲累加器得到数要小
作者: dlyt03    时间: 2013-2-21 21:01
参考下
作者: xxyz987    时间: 2013-2-27 20:02
larry 发表于 2012-4-2 13:51
我这里的情况指电磁组的双路脉冲检测方案

摄像头组的也用这两路捕捉,可以吗?
/*功能:FTM1、FTM2模块双路正交脉冲计数;
引脚:PTA12、PTA13、PTA10、PTA11
内容:初始化FTM1、FTM2的正交解码功能;*/

作者: 陈胜利    时间: 2013-3-16 22:10

#include "lptmr.h"

//==========================================================================
//函数名称: lptmr_internal_ref_input                                                      
//函数返回: 无                                          
//参数说明: 无
//注    意: 内部参考时钟4分频作为模块时钟,使用ptc5号引脚,alt2通道        
//功能概要: 清上次寄存器的值便于本次设置      
//==========================================================================
void lptmr_internal_ref_input()
{
  unsigned int compare_value=15625; //4 seconds with prescale=8 and 2Mhz fast clock

  //Reset LPTMR module
  lptmr_clear_registers();
  /* Enable LPT Module */
  SIM_SCGC5|=SIM_SCGC5_LPTIMER_MASK;
   
  //打开c口5号引脚的相应功能
  SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //Turn on PORTA clock
  PORTC_PCR5=PORT_PCR_MUX(0x4); //Use ALT2 on PTC 5
  
  // /* Ensure Internal Reference Clock is Enabled *  /
  MCG_C1|=MCG_C1_IRCLKEN_MASK;  
  //Enable fast internal ref clock by setting MCG_C2[IRCS]=1
  //If wanted to use 32Khz slow mode, set MCG_C2[IRCS]=0 instead
  MCG_C2|=MCG_C2_IRCS_MASK;

  /* Configure LPTMR */
  LPTMR0_CMR=LPTMR_CMR_COMPARE(compare_value);  //Set compare value
  LPTMR0_PSR=LPTMR_PSR_PCS(0x0)|LPTMR_PSR_PRESCALE(0x1);  //Use internal clock prescaled by8
  LPTMR0_CSR=LPTMR_CSR_TPS(0x2)|LPTMR_CSR_TMS_MASK;    //use 2模块(LPT0_ALT2)(c口5引脚) 计数模式  

  LPTMR0_CSR|=LPTMR_CSR_TEN_MASK; //开始计数 //Turn on LPT with default settings

}


//==========================================================================
//函数名称: lptmr_pulse_counter                                                        
//函数返回: 无                                          
//参数说明: 输入值为要使用的引脚号
//注    意: 使用1khz的LPO时钟进行计数,使用与低速状态           
//功能概要: 清上次寄存器的值便于本次设置      
//==========================================================================
void lptmr_pulse_counter(char pin_select)
{
  unsigned int compare_value=1000;

  //Reset LPTMR module
  lptmr_clear_registers();

  //Set up GPIO
  if(pin_select==LPTMR_ALT1)
  {
    SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK; //Turn on PORTA clock
    PORTA_PCR19=PORT_PCR_MUX(0x6); //Use ALT6 on PTA19

    //printf("Testing ALT1 pin on PORTA19\n");
    //printf("\tTWR-K70F120M: ALT1 is conected to pin 18 on J15\n");
  }
  else if(pin_select==LPTMR_ALT2)
  {
    SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK; //Turn on PORTC clock
    PORTC_PCR5=PORT_PCR_MUX(0x4); //Use ALT2 on PTC5

  }



  LPTMR0_PSR=LPTMR_PSR_PCS(0x1)|LPTMR_PSR_PBYP_MASK; //Use LPO clock but bypass glitch filter
  LPTMR0_CMR=LPTMR_CMR_COMPARE(compare_value);  //Set compare value
  LPTMR0_CSR=LPTMR_CSR_TPS(pin_select)|LPTMR_CSR_TMS_MASK; //Set LPT to use the pin selected, and put in pulse count mode, on rising edge (default)

  //printf("Press any key to start pulse counter\n");
  //in_char(); //wait for keyboard press

  LPTMR0_CSR|=LPTMR_CSR_TEN_MASK; //Turn on LPT

  
}


//=================================================================================
//函数名: get_counter_value
//功能  : 读编码器的计数值
//注意  : 电压不稳,频率过低可能丢脉冲
//输入  : 无
//输出  : 编码器的计数值

// On each read of the LPTMR counter register, software must first write to the  *
//LPTMR counter register with any value. This will synchronize and register the  *
// current value of the LPTMR counter register into a temporary register. The    *
//contents of the temporary register are returned on each read of the LPTMR      *
// counter register.
//===============================================================================
uint16 get_counter_value()
{
  LPTMR0_CNR=0x1;
  return LPTMR0_CNR;
}

//==========================================================================
//函数名称: lptmr_clear_registers                                                        
//函数返回: 无                                          
//参数说明:            
//功能概要: 清上次寄存器的值便于本次设置      
//==========================================================================
void lptmr_clear_registers()
{
  LPTMR0_CSR=0x00;
  LPTMR0_PSR=0x00;
  LPTMR0_CMR=0x00;
}

作者: zanran8    时间: 2013-3-24 23:17
谢了
作者: zanran8    时间: 2013-3-31 17:02
文圣利 发表于 2013-2-21 11:58
正交解码计数,好像会丢,计的数比脉冲累加器得到数要小

你讲的丢是什么意思
作者: 201000171238    时间: 2013-4-3 21:58
必须选使用外部时钟吗???
作者: hpbfsj    时间: 2013-5-2 12:00
楼主  为什么我的图像显示没有负数呢????
作者: ⌒_⌒ˇ    时间: 2013-7-15 23:59
我想问下,两个接口分别怎样接啊
作者: Newborn    时间: 2013-12-15 12:10
谢谢分享~~O(∩_∩)O~
作者: LIUGUOMING    时间: 2013-12-28 20:39
FTM不是用来产生脉冲的吗,怎么也可以用来计算编码器的脉冲了,不明白,计数不是用lmptr吗?求大神解答
作者: 1105795734    时间: 2014-1-2 14:21
谢谢分享

作者: somebodyes    时间: 2014-2-14 11:46
学习了
作者: 叶鸣    时间: 2014-2-14 13:39
不懂啊
作者: 我们一起走过    时间: 2014-2-14 20:16

作者: 石秋燕子    时间: 2014-2-25 20:09
不懂啊!复制下来研究下!谢谢楼主!
作者: 冬晨夏夜    时间: 2014-3-2 10:45
学习了
作者: 头上两只角    时间: 2014-3-5 11:30
eve昔枫 发表于 2012-5-4 14:48
大侠,查看FTM1_CNT、FTM2_CNT当前计数值,查看TOFDIR、QUADIR可以知道转向
TOFDIR、QUADIR是哪两个啊?新 ...

我也遇到了同样的问题   那个方向  怎么判断啊。
作者: songtt    时间: 2014-3-13 21:28
那我想问一下 你的舵机和电机的PWM 怎么输出的 脉冲累加已经占有FTM两个通道了
作者: -單眼皮_    时间: 2014-4-2 00:20
你好,怎么我在pit中断读FTM1_CNT、FTM2_CNT的值,但出现了硬件上访错误,是不是不可以直接读寄存器的值得原因?请问楼主是怎么读到的?
作者: 恋May    时间: 2014-4-11 10:15
eve昔枫 发表于 2012-5-4 14:48
大侠,查看FTM1_CNT、FTM2_CNT当前计数值,查看TOFDIR、QUADIR可以知道转向
TOFDIR、QUADIR是哪两个啊?新 ...

解决了吗。、

作者: 恋May    时间: 2014-4-11 10:15
头上两只角 发表于 2014-3-5 11:30
我也遇到了同样的问题   那个方向  怎么判断啊。

解决了吗。、

作者: 1174751315    时间: 2014-4-12 19:19
楼主,我觉得除以四不好,不如将PID目标放大四倍,这样就避免了除法运算。
作者: DHTCL    时间: 2014-5-14 19:49
请问怎么查看TOFDIR的值啊
作者: DHTCL    时间: 2014-5-14 22:06
请问怎么查看TOFDIR、QUADIR的值
作者: DHTCL    时间: 2014-5-16 21:54
恋May 发表于 2014-4-11 10:15
解决了吗。、

请问怎么查询TOFDIR、QUADIR的值啊?
作者: DHTCL    时间: 2014-5-17 10:11
恋May 发表于 2014-4-11 10:15
解决了吗。、

大侠,FTM1_CNT、FTM2_CNT一直都是正值,请问怎么修改啊
作者: DHTCL    时间: 2014-5-17 10:14
eve昔枫 发表于 2012-5-4 14:48
大侠,查看FTM1_CNT、FTM2_CNT当前计数值,查看TOFDIR、QUADIR可以知道转向
TOFDIR、QUADIR是哪两个啊?新 ...

我的问题也是这个,FTM1_CNT、FTM2_CNT都是正值,请问你是怎么解决的啊?

作者: stafan    时间: 2014-5-20 22:24
小哥,四个IO口,两个编码器,如何接啊,是串联了

作者: 武狂狼    时间: 2014-5-31 23:46

作者: zkm123    时间: 2014-6-23 10:13
DHTCL 发表于 2014-5-17 10:14
我的问题也是这个,FTM1_CNT、FTM2_CNT都是正值,请问你是怎么解决的啊?

我怎么输出的都是0啊。。。这个怎么整啊   中断服务程序中需要写什么东西么?他这个计数是怎么个流程啊?求赐教大侠
作者: DHTCL    时间: 2014-6-25 12:43
请问 FTM2_MOD这是一个什么变量,最大值可以设置到多少啊?
作者: DHTCL    时间: 2014-6-25 12:46
larry 发表于 2012-3-15 21:16
它是两路脉冲的所有边沿都检测的,所以所得计数器的值要除以4才能得到实际脉冲数

请问 FTM1_MOD。FTM2_MOD这是一个什么变量,最大值可以设置到多少啊?
作者: LMH    时间: 2014-7-11 16:10
LPT怎么就不能加2个编码器啊 就只能加一个,加另一个怎么没反应啊
作者: Greece    时间: 2014-7-21 15:19
我去 我的都是负值 好忧伤
作者: 飘零浮云    时间: 2014-11-21 16:19
正交解码是什么啊?
作者: lgb10010    时间: 2014-12-6 15:20
666
作者: 18336836896    时间: 2015-2-9 16:05
FTM1对K60的A8.A9吧  我用的是FX15
作者: Ijason    时间: 2015-3-30 22:18
第十届光电组直立的能用吗  都还不太懂  刚接触不久  求指教
作者: 刘卅卌    时间: 2016-5-15 20:26
额,没看懂,帮楼主顶一个吧
作者: MOTO    时间: 2016-8-30 15:45
这个好

作者: zq5666792    时间: 2016-10-30 14:46
eve昔枫 发表于 2012-5-4 14:48
大侠,查看FTM1_CNT、FTM2_CNT当前计数值,查看TOFDIR、QUADIR可以知道转向
TOFDIR、QUADIR是哪两个啊?新 ...

正交解码,读取FTM2_CNT的数据一直是正值,你解决了吗?






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