关于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);
各位高手。对于超核的这种获取方向和数值的方法倒是理解了。
存在我心中的疑惑是怎么样才能够获取正交解码的值和方向恩,还是我在上边重复说的问题,,
现在手里有编码器,电路板已经发去做了,实验一下的花,还需要等两天,希望大家可以给解答一下。。
自己顶一下。 楼主你好,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的值,当然如果溢出的话,你就需要考虑加上一个周期了。
希望能够帮到你,如果还有不明白的地方,欢迎提问。 FSL_TICS_ZJJ 发表于 2014-2-28 15:18
楼主你好,CNT就是一个无符号的寄存器,当你设置好后,它会从CNTIN开始,如果增加,则会加到MOD值然后产生T ...
通过判断CNT来判断方向是不是就不对呢,
湛泸骏驰 发表于 2014-2-28 17:11
通过判断CNT来判断方向是不是就不对呢,
你想怎么去判断?
是看它增加了还是减了吗?
有寄存器看,为什么不用。那个寄存器就是实时的检查CNT是增加还是减小的,肯定比你程序做的准。 FSL_TICS_ZJJ 发表于 2014-2-28 17:14
你想怎么去判断?
是看它增加了还是减了吗?
有寄存器看,为什么不用。那个寄存器就是实时的检查CNT是增 ...
好的,还是寄存器好。 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 ,
您是否对正交解码的减计数模式有研究呢,。我给怎么去处理这个数值呢,,
谢谢
为了满足我的需要,我使用了这样的判断语句。if(valueleft>30000)
valueleft=65535-valueleft;
else
valueleft=valueleft;
问题现在感觉算是解决了,不知我这样的写法,会给我带来什么样的问题。
1ms读取一次脉冲。。 受教了,,
页:
[1]