智能车制作

标题: 给小车跪了——第三篇 [打印本页]

作者: 徐晋鸿!    时间: 2013-3-8 14:20
标题: 给小车跪了——第三篇
本篇讲述了编码器脉冲的奇幻采集(k60)的故事。话不多说进入正题。这次遇到的问题是有关lptmr模块。我使用野火的程序。我的初始化函数是
INT_COUNT是2000
lptmr_counter_init(LPT0_ALT1, INT_COUNT, 2, LPT_Rising);
   //初始化脉冲计数器,用LPT0_ALT1,即PTA19输入,每隔INT_COUNT产生中断,延时2个时钟滤波,上升沿触发
采集函数是
void speed_get()
{
  speed_read = LPTMR0_CNR;                         //保存脉冲计数器计算值
   lptmr_counter_clean();                                  //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)
}
采集函数是在场中断进去时调用的,于是产生的现象是,哪怕编码器不转speed_read 还是会有变化的值(15 左右会变化)。
有没有同学和我有一样的遭遇?

作者: 1006110218    时间: 2013-3-8 15:09
你可以用FTM的正交解码测速,挺好用的!
作者: 野火    时间: 2013-3-8 17:56
这么神奇啊
作者: 野火    时间: 2013-3-8 17:57
如果不行,就用正交解码咯,参考代码:


//FTM1_CNT=0;   用s16变量保存,他就是脉冲,负数表示反方向

/*配置正交解码*/

void FTM2_QUAD_Iint(void)
{
    PORTB_PCR18= PORT_PCR_MUX(6); // 设置引脚A10引脚为FTM2_PHA功能  
    PORTB_PCR19= PORT_PCR_MUX(6); // 设置引脚A11引脚为FTM2_PHB功能  
    SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;//使能FTM2时钟  
    FTM2_MODE |= FTM_MODE_WPDIS_MASK;//写保护禁止  
    FTM2_QDCTRL|=FTM_QDCTRL_QUADMODE_MASK;//AB相同时确定方向和计数值  
    FTM2_CNTIN=0;//FTM0计数器初始值为0  
    FTM2_MOD=65535;//结束值  
    FTM2_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//启用FTM2正交解码模式  
    FTM2_MODE |= FTM_MODE_FTMEN_MASK;//FTM2EN=1   
    FTM2_CNT=0;  
}

void FTM1_QUAD_Iint(void)
{
    PORTA_PCR12= PORT_PCR_MUX(7); // 设置引脚A12引脚为FTM1_PHA功能  
    PORTA_PCR13= PORT_PCR_MUX(7); // 设置引脚A13引脚为FTM1_PHB功能  
    SIM_SCGC6|=SIM_SCGC6_FTM1_MASK;//使能FTM1时钟  
    FTM1_MODE |= FTM_MODE_WPDIS_MASK;//写保护禁止  
    FTM1_QDCTRL|=FTM_QDCTRL_QUADMODE_MASK;//AB相同时确定方向和计数值  
    FTM1_CNTIN=0;//FTM0计数器初始值为0  
    FTM1_MOD=65535;//结束值  
    FTM1_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//启用FTM1正交解码模式  
    FTM1_MODE |= FTM_MODE_FTMEN_MASK;//FTM1EN=1   
    FTM1_CNT=0;  
}

作者: 徐晋鸿!    时间: 2013-3-8 18:38
1006110218 发表于 2013-3-8 15:09
你可以用FTM的正交解码测速,挺好用的!

嗯,谢谢
作者: 徐晋鸿!    时间: 2013-3-8 18:43
野火 发表于 2013-3-8 17:57
如果不行,就用正交解码咯,参考代码:

谢谢!火哥,
我的FTM2是用来给电机PWM的
(FTM_PWM_init(FTM2, CH1, 10000, 100);//A11
   FTM_PWM_init(FTM2, CH0, 10000, 100);//A10速度控制可行),
FTM1给舵机
FTM_PWM_init(FTM1, CH0, 300, 492);  //FTM模块产生PWM,用 FTM1_CH0 ,即 PTA8 ,
我还能使用你的FTM1模块吗?

作者: 野火    时间: 2013-3-8 20:28
徐晋鸿! 发表于 2013-3-8 18:43
谢谢!火哥,
我的FTM2是用来给电机PWM的
(FTM_PWM_init(FTM2, CH1, 10000, 100);//A11

用了FTM1做PWM,就不能做正交解码了

作者: dec112233    时间: 2013-4-13 02:37
野火 发表于 2013-3-8 20:28
用了FTM1做PWM,就不能做正交解码了

请问火哥,我用的是单向的编码器可以使用正交解码测速吗?

作者: 野火    时间: 2013-4-16 10:19
dec112233 发表于 2013-4-13 02:37
请问火哥,我用的是单向的编码器可以使用正交解码测速吗?

可以,B相的核心板管脚,接3.3V

作者: dec112233    时间: 2013-4-16 22:53
野火 发表于 2013-4-16 10:19
可以,B相的核心板管脚,接3.3V

那可以使用内部上拉吗 ?     怎么 设置内部上拉?

作者: 野火    时间: 2013-4-17 16:27
dec112233 发表于 2013-4-16 22:53
那可以使用内部上拉吗 ?     怎么 设置内部上拉?

可以用内部上拉,不过要悬空那个管脚
port 模块里设置的


作者: dec112233    时间: 2013-4-17 21:23
野火 发表于 2013-4-17 16:27
可以用内部上拉,不过要悬空那个管脚
port 模块里设置的

恩 用的你的库 设置了   还是检测不出来速度  准备用DMA试试    谢谢啊   

作者: boking    时间: 2013-4-17 23:02
A19口确实不好用,我们也有这个问题,换成c5口就好了

作者: jackailson    时间: 2013-4-26 07:54
野火 发表于 2013-4-16 10:19
可以,B相的核心板管脚,接3.3V

火哥,是不是单相编码器可以用你上面给的程序,只是将产生脉冲的B相接PTA10,然后PTA11接3.3v,是么?

作者: 野火    时间: 2013-4-26 08:00
jackailson 发表于 2013-4-26 07:54
火哥,是不是单相编码器可以用你上面给的程序,只是将产生脉冲的B相接PTA10,然后PTA11接3.3v,是么?

编码器输出脉冲的接A相,B相接3.3V  啊


作者: jackailson    时间: 2013-4-26 08:19
就是将编码器产生脉冲的线接PTA8,PTA9接3.3V,程序如下//*****************************************************************************
//  FTM1 编码器1  引脚 PTA 8-9
//*****************************************************************************
void FTM1_QUAD_Int(void)  
{
  
  PORTA_PCR8     =  PORT_PCR_MUX(6);                                            // 设置引脚A8引脚为FTM2_PHA功能  
  PORTA_PCR9     =  PORT_PCR_MUX(6);                                            // 设置引脚A9引脚为FTM2_PHB功能  
  PORT_PCR_REG(PORTA_BASE_PTR, 8) |= PORT_PCR_PE_MASK | PORT_PCR_PS_MASK ;      //开弱上拉
  PORT_PCR_REG(PORTA_BASE_PTR, 9) |= PORT_PCR_PE_MASK | PORT_PCR_PS_MASK ;      //开弱上拉
  SIM_SCGC6     |=  SIM_SCGC6_FTM1_MASK;                                        // 使能FTM2时钟  
  FTM1_MODE     |=  FTM_MODE_WPDIS_MASK;                                        // 写保护禁止  
  FTM1_QDCTRL   |=  FTM_QDCTRL_QUADMODE_MASK;                                   // AB相同时确定方向和计数值  
  FTM1_CNTIN     =  0;                                                          // FTM0计数器初始值为0  
  FTM1_MOD       =  65535;                                                      // 结束值  
  FTM1_QDCTRL   |=  FTM_QDCTRL_QUADEN_MASK;                                     // 启用FTM2正交解码模式  
  FTM1_MODE     |=  FTM_MODE_FTMEN_MASK;                                        // FTM2EN=1   
  FTM1_CNT       =  0;  
}  
作者: jackailson    时间: 2013-4-26 08:20
野火 发表于 2013-4-26 08:00
编码器输出脉冲的接A相,B相接3.3V  啊

就是将编码器产生脉冲的线接PTA8,PTA9接3.3V,程序如下//*****************************************************************************
//  FTM1 编码器1  引脚 PTA 8-9
//*****************************************************************************
void FTM1_QUAD_Int(void)  
{
  
  PORTA_PCR8     =  PORT_PCR_MUX(6);                                            // 设置引脚A8引脚为FTM2_PHA功能  
  PORTA_PCR9     =  PORT_PCR_MUX(6);                                            // 设置引脚A9引脚为FTM2_PHB功能  
  PORT_PCR_REG(PORTA_BASE_PTR, 8) |= PORT_PCR_PE_MASK | PORT_PCR_PS_MASK ;      //开弱上拉
  PORT_PCR_REG(PORTA_BASE_PTR, 9) |= PORT_PCR_PE_MASK | PORT_PCR_PS_MASK ;      //开弱上拉
  SIM_SCGC6     |=  SIM_SCGC6_FTM1_MASK;                                        // 使能FTM2时钟  
  FTM1_MODE     |=  FTM_MODE_WPDIS_MASK;                                        // 写保护禁止  
  FTM1_QDCTRL   |=  FTM_QDCTRL_QUADMODE_MASK;                                   // AB相同时确定方向和计数值  
  FTM1_CNTIN     =  0;                                                          // FTM0计数器初始值为0  
  FTM1_MOD       =  65535;                                                      // 结束值  
  FTM1_QDCTRL   |=  FTM_QDCTRL_QUADEN_MASK;                                     // 启用FTM2正交解码模式  
  FTM1_MODE     |=  FTM_MODE_FTMEN_MASK;                                        // FTM2EN=1   
  FTM1_CNT       =  0;  
}  


作者: 野火    时间: 2013-4-26 08:48
jackailson 发表于 2013-4-26 08:20
就是将编码器产生脉冲的线接PTA8,PTA9接3.3V,程序如下//******************************************** ...

代码注释有误,是FTM1的

作者: jackailson    时间: 2013-4-26 09:08
恩,知道,就是这样吧,还有我按照这个方法试了一下,正反转电机能检测到脉冲,但是脉冲数没有负数啊,但是正转到反转、反转到正转时,脉冲数是有减小的,我的脉冲检测周期是100ms,是不是我的检测周期太长导致没有负数,还是初始化程序时有其他要求?
作者: 20112232    时间: 2013-6-2 14:48
jackailson 发表于 2013-4-26 09:08
恩,知道,就是这样吧,还有我按照这个方法试了一下,正反转电机能检测到脉冲,但是脉冲数没有负数啊,但是 ...

这个问题解决了没有?我反转的时候测得的脉冲在65535附近,就是他给的结束值附近。





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