湛泸骏驰 发表于 2014-2-27 20:51:18

关于k60 FTM 模块 CNT的值能不能为负值的一些疑惑(已解决)

本帖最后由 湛泸骏驰 于 2014-2-28 19:24 编辑

今天再看K60 的正交解码模块。使用的是拉普兰德的库。发现他的脉冲那边有点问题,我又参考了野火的FTM中关于正交解码的 代码

int16 val;
    val = FTM_QUAD_get(FTM1);          //获取FTM 正交解码 的脉冲数(负数表示反方向)
    FTM_QUAD_clean(FTM1);

/*!
*@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);

    return val;
}

/** FTM - Register Layout Typedef */
typedef struct {
__IO uint32_t SC;                              /**< Status and Control, offset: 0x0 */
__IO uint32_t CNT;                               /**< Counter, offset: 0x4 */ 此处的CNT不是无符号整型吗?也就是说此处的值不会是一个负值吧,
__IO uint32_t MOD;                               /**< Modulo, offset: 0x8 */
struct {                                       /* offset: 0xC, array step: 0x8 */
    __IO uint32_t CnSC;                              /**< Channel (n) Status and Control, array offset: 0xC, array step: 0x8 */
    __IO uint32_t CnV;                               /**< Channel (n) Value, array offset: 0x10, array step: 0x8 */
} CONTROLS;




代码中说明。CNT是一个unit32 是一个unsigned 型的吧,为什么最上边却能够通过脉冲数的正负来表示方向呢,

是CNT是一个无符号的寄存器呢,还是我的理解有些问题。


判断正交解码的方向仅仅通过CNT能够实现判断正负方向吗?
我从超核的代码中看到了不同的表示方案


/***********************************************************************************************

************************************************************************************************/
void FTM_QDGetData(FTM_Type *ftm, uint32_t* value, uint8_t* dir)
{
        *dir = (((ftm->QDCTRL)>>FTM_QDCTRL_QUADIR_SHIFT)&1);
        *value = (ftm->CNT);
}

他通过了QUADIR这个寄存器来判断方向。 通过CNT来得脉冲数值。我现在认为CNT 是一个无符号的数值,不能够来判断方向。

                       
FTM_QDGetData(FTM2, &value, &dir);
UART_printf("Value:%dDirection%d\r\n", value, dir);
各位高手。对于超核的这种获取方向和数值的方法倒是理解了。

存在我心中的疑惑是怎么样才能够获取正交解码的值和方向恩,还是我在上边重复说的问题,,
现在手里有编码器,电路板已经发去做了,实验一下的花,还需要等两天,希望大家可以给解答一下。。


湛泸骏驰 发表于 2014-2-28 08:14:34

自己顶一下。

FSL_TICS_ZJJ 发表于 2014-2-28 15:18:36

楼主你好,CNT就是一个无符号的寄存器,当你设置好后,它会从CNTIN开始,如果增加,则会加到MOD值然后产生TOF,再讲到CNTIN重新开始加; 如果是减小,如果CNTIN开始,则先到MOD,然后减小到CNTIN产生TOF,再回到MOD继续减小。
就和下图一样:




你不需要将CNT作为判别方向的基准。
因为K60针对正交编码器有一个专门的位来判别当前的方向是增还是减。
正如你贴出的代码那样读取。
void FTM_QDGetData(FTM_Type *ftm, uint32_t* value, uint8_t* dir)

{

      *dir = (((ftm->QDCTRL)>>FTM_QDCTRL_QUADIR_SHIFT)&1);

      *value = (ftm->CNT);

}



至于正交解码的值,你就读CNT的值,当然如果溢出的话,你就需要考虑加上一个周期了。
希望能够帮到你,如果还有不明白的地方,欢迎提问。

湛泸骏驰 发表于 2014-2-28 17:11:11

FSL_TICS_ZJJ 发表于 2014-2-28 15:18
楼主你好,CNT就是一个无符号的寄存器,当你设置好后,它会从CNTIN开始,如果增加,则会加到MOD值然后产生T ...

通过判断CNT来判断方向是不是就不对呢,




FSL_TICS_ZJJ 发表于 2014-2-28 17:14:57

湛泸骏驰 发表于 2014-2-28 17:11
通过判断CNT来判断方向是不是就不对呢,

你想怎么去判断?
是看它增加了还是减了吗?
有寄存器看,为什么不用。那个寄存器就是实时的检查CNT是增加还是减小的,肯定比你程序做的准。

湛泸骏驰 发表于 2014-2-28 19:23:55

FSL_TICS_ZJJ 发表于 2014-2-28 17:14
你想怎么去判断?
是看它增加了还是减了吗?
有寄存器看,为什么不用。那个寄存器就是实时的检查CNT是增 ...

好的,还是寄存器好。

湛泸骏驰 发表于 2014-3-9 15:12:36

FSL_TICS_ZJJ 发表于 2014-2-28 17:14
你想怎么去判断?
是看它增加了还是减了吗?
有寄存器看,为什么不用。那个寄存器就是实时的检查CNT是增 ...

你好。
今天终于可以弄正交解码了。
使用


void FTM_QDGetData(FTM_Type *ftm, uint32* value, uint8* dir)
{
        *dir = (((ftm->QDCTRL)>>FTM_QDCTRL_QUADIR_SHIFT)&1);
        *value = (ftm->CNT);
}
这个代码,能够读出我小车的的数值   我现在的数值是这样的。

因为我要取脉冲,去控制电机,我不可能去使用这个655XX这个数值,

我尝试了。当dir==0 ;时。使用65535 减去这个数值,但是在平衡车的,平衡点附近。并没有什么作用,还是655xx ,

您是否对正交解码的减计数模式有研究呢,。我给怎么去处理这个数值呢,,
谢谢

湛泸骏驰 发表于 2014-3-9 16:09:30

为了满足我的需要,我使用了这样的判断语句。if(valueleft>30000)
   valueleft=65535-valueleft;
   else
   valueleft=valueleft;

问题现在感觉算是解决了,不知我这样的写法,会给我带来什么样的问题。
1ms读取一次脉冲。。

lidreamer 发表于 2014-3-29 02:22:12

受教了,,
页: [1]
查看完整版本: 关于k60 FTM 模块 CNT的值能不能为负值的一些疑惑(已解决)