|
本帖最后由 湛泸骏驰 于 2014-2-28 19:24 编辑
今天再看K60 的正交解码模块。使用的是拉普兰德的库。发现他的脉冲那边有点问题,我又参考了野火的FTM中关于正交解码的 代码
- int16 val;
- val = FTM_QUAD_get(FTM1); //[color=Red]获取FTM 正交解码 的脉冲数(负数表示反方向)[/color]
- 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[ftmn]);
- return val;
- }
- [code]
- /** FTM - Register Layout Typedef */
- typedef struct {
- __IO uint32_t SC; /**< Status and Control, offset: 0x0 */
- __IO [color=Red]uint32_t[/color] CNT; /**< Counter, offset: 0x4 */ [color=Orange] 此处的CNT不是无符号整型吗?也就是说此处的值不会是一个负值吧,[/color]
- __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[8];
复制代码
[/code]
代码中说明。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:%d Direction%d\r\n", value, dir);
复制代码
各位高手。对于超核的这种获取方向和数值的方法倒是理解了。
存在我心中的疑惑是怎么样才能够获取正交解码的值和方向恩,还是我在上边重复说的问题,,
现在手里有编码器,电路板已经发去做了,实验一下的花,还需要等两天,希望大家可以给解答一下。。
|
|