搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2014-2-27 20:51:18 | 显示全部楼层 |阅读模式
本帖最后由 湛泸骏驰 于 2014-2-28 19:24 编辑

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


  1. int16 val;
  2.     val = FTM_QUAD_get(FTM1);          //[color=Red]获取FTM 正交解码 的脉冲数(负数表示反方向)[/color]
  3.     FTM_QUAD_clean(FTM1);
  4.   
  5. /*!
  6. *  @brief      获取FTM 正交解码 的脉冲数
  7. *  @param      FTMn_e    模块号( FTM1、  FTM2)
  8. *  @since      v5.0
  9. *  Sample usage:       int16 count = FTM_QUAD_get(FTM1);    //获取  FTM1 交解码 的脉冲数
  10. */
  11. int16 FTM_QUAD_get(FTMn_e ftmn)
  12. {
  13.     int16 val;
  14.     ASSERT( (ftmn == FTM1) || (ftmn == FTM2 ) );        //检查传递进来的通道是否正确
  15.     val = FTM_CNT_REG(FTMN[ftmn]);

  16.     return val;
  17. }
  18. [code]
  19. /** FTM - Register Layout Typedef */
  20. typedef struct {
  21.   __IO uint32_t SC;                                /**< Status and Control, offset: 0x0 */
  22.   __IO [color=Red]uint32_t[/color] CNT;                               /**< Counter, offset: 0x4 */  [color=Orange] 此处的CNT不是无符号整型吗?也就是说此处的值不会是一个负值吧,[/color]
  23.   __IO uint32_t MOD;                               /**< Modulo, offset: 0x8 */
  24.   struct {                                         /* offset: 0xC, array step: 0x8 */
  25.     __IO uint32_t CnSC;                              /**< Channel (n) Status and Control, array offset: 0xC, array step: 0x8 */
  26.     __IO uint32_t CnV;                               /**< Channel (n) Value, array offset: 0x10, array step: 0x8 */
  27.   } CONTROLS[8];
复制代码



[/code]

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

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


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


  1. /***********************************************************************************************

  2. ************************************************************************************************/
  3. void FTM_QDGetData(FTM_Type *ftm, uint32_t* value, uint8_t* dir)
  4. {
  5.         *dir = (((ftm->QDCTRL)>>FTM_QDCTRL_QUADIR_SHIFT)&1);
  6.         *value = (ftm->CNT);
  7. }
复制代码


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

  1.                        
  2.   FTM_QDGetData(FTM2, &value, &dir);
  3.   UART_printf("Value:%d  Direction%d\r\n", value, dir);
复制代码

各位高手。对于超核的这种获取方向和数值的方法倒是理解了。

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


出0入0汤圆

 楼主| 发表于 2014-2-28 08:14:34 | 显示全部楼层
自己顶一下。

出0入0汤圆

发表于 2014-2-28 15:18:36 | 显示全部楼层
楼主你好,CNT就是一个无符号的寄存器,当你设置好后,它会从CNTIN开始,如果增加,则会加到MOD值然后产生TOF,再讲到CNTIN重新开始加; 如果是减小,如果CNTIN开始,则先到MOD,然后减小到CNTIN产生TOF,再回到MOD继续减小。
就和下图一样:




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

  2. {

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

  4.         *value = (ftm->CNT);

  5. }
复制代码



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

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




出0入0汤圆

发表于 2014-2-28 17:14:57 | 显示全部楼层
湛泸骏驰 发表于 2014-2-28 17:11
通过判断CNT来判断方向是不是就不对呢,


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

出0入0汤圆

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

好的,还是寄存器好。

出0入0汤圆

 楼主| 发表于 2014-3-9 15:12:36 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-28 17:14
你想怎么去判断?
是看它增加了还是减了吗?
有寄存器看,为什么不用。那个寄存器就是实时的检查CNT是增 ...

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


  1. void FTM_QDGetData(FTM_Type *ftm, uint32* value, uint8* dir)
  2. {
  3.         *dir = (((ftm->QDCTRL)>>FTM_QDCTRL_QUADIR_SHIFT)&1);
  4.         *value = (ftm->CNT);
  5. }
复制代码

这个代码,能够读出我小车的的数值   我现在的数值是这样的。

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

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-3-9 16:09:30 | 显示全部楼层
为了满足我的需要,我使用了这样的判断语句。
  1. if(valueleft>30000)
  2.      valueleft=65535-valueleft;
  3.    else
  4.      valueleft=valueleft;
复制代码


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

出0入0汤圆

发表于 2014-3-29 02:22:12 | 显示全部楼层
受教了,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 11:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表