查看: 3310|回复: 6

[已解决] 使用Kinetis芯片正交解码模块中遇到的问题

[复制链接]

该用户从未签到

2

主题

8

帖子

0

注册会员

Rank: 2

积分
66
最后登录
2018-6-25
发表于 2018-4-9 21:26:51 | 显示全部楼层 |阅读模式
首先使能FTM1,PS位分频为0,BDMMODE位为0。再使能正交解码模块,使能滤波器,配置为相位编码模式。设置CNTIN为0,MOD为64。将CNTIN值赋值给计数器,使能FTM1中断为计数溢出中断。计满64为1圈中断一次。
在中断程序中根据TOFDIR判断正反转加减圈数再通过串口中断发生给串口调试助手。
信号源给出两路相差90°的10Hz方波信号,理论上是6.4秒产生一次中断发生数据给串口调试助手。但是实际上是一直很快几乎没有间断的发生数据(方波相位固定没有改变)。
使能正交解码模块后计数器的计数是所给的信号吧,还是我理解错了是MCU内部时钟?
/*配置正交解码模块*/
void FTM_QuadDecoderInit(FTM_Type *base, uint32_t startValue, uint32_t overValue)
{
          ftm_phase_params_t ftmFilter;
       
          CLOCK_EnableClock(s_ftmClocks[FTM_GetInstance(base)]);
          base->SC = FTM_SC_PS(0);                                                                                                      //分频为0
          base->CONF = (FTM_CONF_BDMMODE(0) | FTM_CONF_GTBEEN(0));                                           // BDMMODE为0
          base->MODE = FTM_MODE_FAULTM(0) | FTM_MODE_FTMEN_MASK | FTM_MODE_WPDIS_MASK; //使能FTM

          ftmFilter.enablePhaseFilter = true;
          ftmFilter.phaseFilterVal = 7U;
          ftmFilter.phasePolarity = kFTM_QuadPhaseNormal;
          FTM_SetupQuadDecode(base, &ftmFilter, &ftmFilter, kFTM_QuadPhaseEncode);
          
          FTM_SetQuadDecoderModuloValue(base, startValue, overValue);
          FTM_ClearQuadDecoderCounterValue(base);
       
          FTM_EnableInterrupts(base, kFTM_TimeOverflowInterruptEnable);                                   //使能时钟溢出中断
}

/*FTM1中断
void FTM1_IRQHandler()
{
        FTM_ClearStatusFlags(FTM1, kFTM_TimeOverflowFlag);
        if((FTM_GetQuadDecoderFlags(FTM1)) & FTM_QDCTRL_TOFDIR_MASK)                            //查询正反转
                NumOfTurns += 1;
        else
                NumOfTurns -= 1;
          RS485WriteValueData(NumOfTurns);                                                                             //串口中断发出圈数
}


大佬帮忙分析一下谢谢

最佳答案

0大力出奇迹0 发表于 2018-4-10 17:35 使能Quadrature decoder模块后 计数器的时钟源不是Quadrature decoder模块后吗。 是的,如果选择为编码器,时钟直接选择为正交编码模块了。 你有没有正交编码的波形以及FTM中断 ...
回复

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24879
最后登录
2025-7-20
发表于 2018-4-10 10:25:11 | 显示全部楼层
楼主你好!
请给出你使用的kinetis芯片的具体型号!
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

8

帖子

0

注册会员

Rank: 2

积分
66
最后登录
2018-6-25
 楼主| 发表于 2018-4-10 14:00:53 | 显示全部楼层
小恩GG 发表于 2018-4-10 10:25
楼主你好!
请给出你使用的kinetis芯片的具体型号!

KV10Z32VLF7 不好意思
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24879
最后登录
2025-7-20
发表于 2018-4-10 15:44:43 | 显示全部楼层

从你的描述,我觉得FTM的配置可能哪里还有问题。
首次你要确认你的FTM时钟源,分频什么的都没问题,另外,在中断中,我建议你可以翻转下IO口,然后用示波器看看,时间到底是多少?如果还是很快不是你理想的那样,你就需要检查下你的FTM时钟配置是否正确了,明显的定时都有问题了。首先要把定时给搞准确了。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

8

帖子

0

注册会员

Rank: 2

积分
66
最后登录
2018-6-25
 楼主| 发表于 2018-4-10 17:35:47 | 显示全部楼层
小恩GG 发表于 2018-4-10 15:44
从你的描述,我觉得FTM的配置可能哪里还有问题。
首次你要确认你的FTM时钟源,分频什么的都没问题,另外 ...

使能Quadrature decoder模块后 计数器的时钟源不是Quadrature decoder模块后吗。
FTM.PNG
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24879
最后登录
2025-7-20
发表于 2018-4-11 11:18:54 | 显示全部楼层
0大力出奇迹0 发表于 2018-4-10 17:35
使能Quadrature decoder模块后 计数器的时钟源不是Quadrature decoder模块后吗。

是的,如果选择为编码器,时钟直接选择为正交编码模块了。
你有没有正交编码的波形以及FTM中断里面输出IO的波形对比图呢?可以做下,然后用示波器抓下,看看具体情况怎么样?是不是有毛刺导致计数多了呢?先看下,如果有的话,可能要做下输入滤波。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

8

帖子

0

注册会员

Rank: 2

积分
66
最后登录
2018-6-25
 楼主| 发表于 2018-4-17 21:04:50 | 显示全部楼层
小恩GG 发表于 2018-4-11 11:18
是的,如果选择为编码器,时钟直接选择为正交编码模块了。
你有没有正交编码的波形以及FTM中断里面输出IO ...

找到问题了 正交的A/B方波 一个周期共四次跳变,计数器计四次 ,需要乘以四倍
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 20:38 , Processed in 0.105070 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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