大家好,关于之前我问过的KE06板子的EPWM模式,我还有一些后续的问题,苦于找不到人求助,也只能再次的求助大家,实在是不好意思。
我看过了KE06的手册上面说:采用向上计数时的FTM 周期为(MOD – CNTIN + 0x0001) × FTM 计数器时钟的周期。然后也说了:如果(CNTIN = 0x0000),FTM 计数与TPM 向上-向下计数等效,即无符号向上-向下计数。而EPWM模式的介绍上面有:只能在CNTIN = 0x0000 的情况下使用EPWM 模式。
所以上面所述情况应该可以为FTM的周期为(MOD+0x0001)乘以FTM计数器时钟的周期。
上次@FSL_TICS_ZJJ大神给我解答的时说让我看一下计时器的种类,但是我看介绍上说:FTM 只有一个时钟域:系统时钟。并且在函数: FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV2); 里面对于后面的预分频器的修改好像没有什么差别,然后我又想,我自己任务要求的定时器为200ms,照上述公式说,我如果把200ms当做200000us(因为如果就当做200,感觉好像有问题),就应该是只要MOD的值和FTM计数器的值满足等于200000就行。
FTM_SetModValue(FTM2,9999);这应该是设置MOD值的。
void FTM2_Task(void)
{
static uint16_t u16count;
static uint8_t u8DirMark;
/* clear the flag */
FTM_ClrOverFlowFlag(FTM2);
if(100 == u16count)
{
u16count = 0;
u16ChV_old = FTM2->CONTROLS[5].CnV;
if(!u8DirMark)
{
u16ChV_new = u16ChV_old + 200;
if(u16ChV_new >= FTM2->MOD)
{
u16ChV_new = FTM2->MOD - 200;
u8DirMark = 1;
}
else
{
}
}
else
{
u16ChV_new = u16ChV_old - 200;
if(u16ChV_new < 200)
{
u16ChV_new = 200;
u8DirMark = 0;
}
else
{
}
}
/* update the channel value */
FTM_SetChannelValue(FTM2, FTM_CHANNEL_CHANNEL5, u16ChV_new);
}
else
{
u16count++;
}
}
这个FTM2_Task函数里的u16count++我觉得应该算是计数器。但是我改变:100 == u16count中100的值的时候,频率的确会变,但是我改变MOD值的时候它就不会变,比如,我不要求渐变,把函数FTM2_Task函数里面的200全改成9999,这样就没有渐变只有闪烁。但是我将MOD和函数中的数同时改成999,或者其他,为什么还是没有变化?我把值变小了,那个FTM的周期应该也变小了吧?但是为什么没有变化?可能频率和那个u16count的值有关,但是如果把那个值变为200的话又感觉太慢了。
可能我表述的不太清楚,但是问题大概就是只改变MOD值造成的FTM周期改变为什么灯的闪烁频率不改变?
代码都是来源于FRDM-KE06Z的FTM-EPWM_demo.c里面。
谢谢大家了。 |