在线时间13 小时
UID3302475
注册时间2017-10-25
NXP金币0
该用户从未签到
注册会员

- 积分
- 66
- 最后登录
- 2018-6-25
|
首先使能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中断 ...
|
|