打印
[Kinetis]

关于KE06Z的EPWM模式(3)

[复制链接]
2756|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zshzcz|  楼主 | 2015-1-29 14:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
各位大神。。。还是相同的板子和模式,仍然在KE06Z和EPWM模式下。。
问题就是,200ms的定时我已经设置成功了,但是学长让我改定时的时间的时候发现FTM_SetModValue(FTM2,65534)函数的MOD最大只能设置为65534,并且预分频器我已经调到最大的128分频,但是这样的话我的定时大概才400ms左右。因为FTM_SetModValue中MOD的值定义为u16int,可能寄存器只有16位,所以到不了比65534最大的。但是如果说我现在想设置定时为1s的话,学长说让我对PTG5(就是PTG5_LED_RED)的管脚的数据寄存器进行直接操作,就是给数据寄存器直接赋值,然后用类似的delay函数来进行延迟1s。
我就想问,首先,我的那个管脚的数据寄存器应该怎么找?这个真的是可见的吗?还有KE06Z的芯片有这种可以直接设置延时的函数吗?是否是和delay相同等?谢谢,这次比较急,希望大神们尽快帮忙!

相关帖子

沙发
FSL_TICS_ZJJ| | 2015-1-29 15:00 | 只看该作者
因为MOD是16位的寄存器,所以最大MOD值是65535.
如果你要定时时间长也很简单,你可以定MOD的最大值,并计算时间。
然后配置定时器溢出中断,中断一次就是你最大MOD定时到的时间,然后自己定义个全局变量,计数。
这样把你定时的数据累加就可以达到你想要的任意时间值,然后再到主程序中查看你定时计数的值,时间到去控制你的IO。

使用特权

评论回复
板凳
zshzcz|  楼主 | 2015-1-29 15:11 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-29 15:00
因为MOD是16位的寄存器,所以最大MOD值是65535.
如果你要定时时间长也很简单,你可以定MOD的最大值,并计算 ...

哦,我记得那个void Task函数,那个里面有一个u16count的计数的变量,是否这个变量就是首先时间累加的功能呢?
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 = 18750;//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_CHANNEL3, u16ChV_new);
    }
    else
    {
        u16count++;
    }
}
但是我记得我改变这个值的时候,它是在之前一段时间灯不闪烁,过一段时间后才开始以200ms的频率闪烁,感觉只是改变了前面的等待时间啊。那这个u16count具体的作用是什么呢?

使用特权

评论回复
地板
zshzcz|  楼主 | 2015-1-29 15:43 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-29 15:00
因为MOD是16位的寄存器,所以最大MOD值是65535.
如果你要定时时间长也很简单,你可以定MOD的最大值,并计算 ...

还有哦,那个变量的计数应该放到函数的哪里啊。。我试了好几个位置,可是他还是按照65535的频率在闪啊。。。主函数如下:
int main (void)
{     
    /* Perform processor initialization */
    sysinit();
   
    //Select FTM2Ch5 on PTG7
    SIM_RemapFTM2CH5ToPTG7();
   
    /* FTM2 is set as edge aligned pwm mode, high true pulse */
    FTM_PWMInit(FTM2, FTM_PWMMODE_EDGEALLIGNED, FTM_PWM_HIGHTRUEPULSE);
    /* FTMEN enable */
    FTM_SetFTMEnhanced(FTM2);
    /* update MOD value */
    FTM_SetModValue(FTM2,65535);
    /* set clock source, start counter */
    FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV128);  
    /* enable FTM2 interrupt in NVIC */
    NVIC_EnableIRQ(FTM2_IRQn);
    /* setup call back function for interrupt */
    FTM_SetCallback(FTM2, FTM2_Task);
    /* enable FTM2 overflow interrupt */
    FTM_EnableOverflowInt(FTM2);
   

        while(1)
        {}
}

使用特权

评论回复
5
vigous1| | 2015-1-29 16:05 | 只看该作者
学习了

使用特权

评论回复
6
zshzcz|  楼主 | 2015-1-30 09:27 | 只看该作者
自己顶一下。。求帮助

使用特权

评论回复
7
FSL_TICS_ZJJ| | 2015-1-30 10:31 | 只看该作者
zshzcz 发表于 2015-1-29 15:43
还有哦,那个变量的计数应该放到函数的哪里啊。。我试了好几个位置,可是他还是按照65535的频率在闪啊。 ...

你不会直接把FTM的引脚接到小灯上面吧?
如果是那样,那么你使用system clock 作为FTM的模块时钟就不能达到那么高的间隔了。
你把FTM的时钟源选择为fixed frequency clock,即ICSFFCLK, 不知道你现在选择的是内部时钟还是外部时钟。
ICSFFCLK就是你实际选择的时钟源频率,如果内部,则为37.5Khz,如果是外部晶振,则为外部晶振时钟除掉RDIV的分频。
FTM选择为ICSFFCLK,如果内部时钟,则通过适当的FTM分频即可实现较小的PWM频率。


使用特权

评论回复
8
zshzcz|  楼主 | 2015-1-30 10:51 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-30 10:31
你不会直接把FTM的引脚接到小灯上面吧?
如果是那样,那么你使用system clock 作为FTM的模块时钟就不能达 ...

那个SIM_RemapFTM2CH3ToPTG5()函数应该就是把FTM引到这个管脚上了吧?那也就是说不能用系统时钟了?
固定频率时钟ICSFFCLK 是一种可以用于FTM 计数器的备选时钟源,允许在系统
时钟或外部时钟以外另选一种时钟源。这种时钟输入源集成在芯片内部。有关更多
信息,请参见具体的芯片文档。由于FTM 硬件的实施限制,固定频率时钟的频率
不得超过系统时钟频率的1/2。
这个是我参考手册上面关于固定频率的时钟的说法,这个样子的话再系统时钟和外部时钟之外的话,那应该是内部了吧?那就可以直接用37.5khz去计算吗?

使用特权

评论回复
9
zshzcz|  楼主 | 2015-1-30 11:05 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-30 10:31
你不会直接把FTM的引脚接到小灯上面吧?
如果是那样,那么你使用system clock 作为FTM的模块时钟就不能达 ...

额,我现在换用成了ICSFFCLK,然后按照37.5khz的频率修改了MOD值和CnV值,它的确周期变长了,但是为什么在正常闪的时候,它前面会很快的闪两下呢?这个是怎么回事啊。。

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-1-30 11:47 | 只看该作者
zshzcz 发表于 2015-1-30 11:05
额,我现在换用成了ICSFFCLK,然后按照37.5khz的频率修改了MOD值和CnV值,它的确周期变长了,但是为什么 ...

你看下示波器,看看这个引脚的PWM波形是怎样的。
是不是你之前给这个引脚其他信号了。

使用特权

评论回复
11
zshzcz|  楼主 | 2015-1-30 11:53 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-30 11:47
你看下示波器,看看这个引脚的PWM波形是怎样的。
是不是你之前给这个引脚其他信号了。 ...

嗯,好。我试试看。

使用特权

评论回复
12
FSL_TICS_ZJJ| | 2015-1-30 12:47 | 只看该作者
zshzcz 发表于 2015-1-30 11:53
嗯,好。我试试看。

可以debug查看,在FTM中断中设断点,看看第一个溢出周期对不对。

使用特权

评论回复
13
zshzcz|  楼主 | 2015-1-30 13:39 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-30 12:47
可以debug查看,在FTM中断中设断点,看看第一个溢出周期对不对。

是不是这个原因呢?就是我那个task函数,运行的时候,看情况好像是向上向下计数,由于第一个周期的时候,u16Chv_new的值没有一开始就设成0或者是MOD,而是设成CnV减去200或者是CnV加上200,所以才导致前面的第一个周期不是一个完整的周期,所以才会出现这样的问题?具体的void_Task函数请看我上面贴出来的,谢谢。

使用特权

评论回复
14
FSL_TICS_ZJJ| | 2015-1-30 14:28 | 只看该作者
本帖最后由 FSL_TICS_ZJJ 于 2015-1-30 14:29 编辑
zshzcz 发表于 2015-1-30 13:39
是不是这个原因呢?就是我那个task函数,运行的时候,看情况好像是向上向下计数,由于第一个周期的时候, ...

debug看下,你配置的寄存器情况。
如果是EPWM,要求:
The Edge-Aligned mode is selected when:
• DECAPEN = 0
• COMBINE = 0
• CPWMS = 0, and
• MSnB = 1
你查看下你FTMX_SC[CPWMS]这个位是多少,在你初始化之后。

使用特权

评论回复
15
zshzcz|  楼主 | 2015-1-30 14:50 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-30 14:28
debug看下,你配置的寄存器情况。
如果是EPWM,要求:
The Edge-Aligned mode is selected when:

我现在看了下,好像初始化以后那位上是1了耶,但是这个好像是由FTM_ClockSet(FTM2, FTM_CLOCK_FIXEDFREQCLOCK, FTM_CLOCK_PS_DIV1)这个函数来决定最后SC寄存器里的值啊,这个是
void FTM_ClockSet(FTM_Type *pFTM, uint8_t u8ClockSource, uint8_t u8ClockPrescale)
{
    uint8_t   u8Temp;
    u8Temp  = (pFTM->SC & 0xE0);
    u8Temp |= (FTM_SC_CLKS(u8ClockSource & 0x3) | FTM_SC_PS(u8ClockPrescale & 0x7));
    pFTM->SC = u8Temp;
}
这样最后算出来的结果是11110000,这样的话CPWMS就是1了,但是这个是在头文件里定义的函数,这要怎么改啊?

使用特权

评论回复
16
FSL_TICS_ZJJ| | 2015-2-2 09:45 | 只看该作者
zshzcz 发表于 2015-1-30 14:50
我现在看了下,好像初始化以后那位上是1了耶,但是这个好像是由FTM_ClockSet(FTM2, FTM_CLOCK_FIXEDFREQC ...

你是自己计算出来的,还是debug出来看结果的?
官方例程如果不改动,默认就是EPWM的,

所以你如果学习,还是需要debug看看你的寄存器值是不是RM上面规定的值,还有就是用示波器看你的PWM波形。

使用特权

评论回复
17
sltian09| | 2015-6-26 12:01 | 只看该作者
用示波器测量脉冲周期是250us这是怎么算出来的呢?我算的是1ms啊,请楼主明示啊!!

使用特权

评论回复
18
芙蓉洞| | 2015-6-27 21:32 | 只看该作者
谢谢楼主分享这么好的帖子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

40

帖子

0

粉丝