打印
[Kinetis]

KE06开发板的EPWM模式问题

[复制链接]
2817|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zshzcz|  楼主 | 2015-1-23 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
       各位大师,我又来了。昨天听过大神的建议后,我学习了一下KE06开发板的数据手册和一些demo。其中有一个demo是我所想要了解一下的,就是FTM_EPWM_demo。看过代码,也自己把程序烧写到板子上后了,我就有几个问题了。
       首先,就是这些函数,虽然上面都有注释说明其含义,但是我之前从来没有见过这些函数,现在看见这些函数完全不知道该怎么用,所以想问问有没有像我这个板子的一些函数的使用说明和函数库?
       第二个问题,就是EPWM周期问题,使用手册上面说EPWM 周期取决于(MOD − CNTIN + 0x0001),然后EPWM模式只有在CNTIN=0x0000的时候才能使用。下面代码有 FTM_SetModValue(FTM2,9999);应该是把MOD的值设为9999吧?那这个样子的话应该怎么算?9999是十进制还是什么?感觉灯闪的周期没那么大啊。如果我想把周期设为200ms的话应该怎么改?

下面是FTM_EPWM_demo.c
/******************************************************************************
*
* Freescale Semiconductor Inc.
* (c) Copyright 2013 Freescale Semiconductor, Inc.
* ALL RIGHTS RESERVED.
*
***************************************************************************
*
* THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
***************************************************************************//*!
*
* @file FTM_EPWM_demo.c
*
* @author Freescale
*
* @version 0.0.1
*
* @date Oct. 25, 2013
*
* @brief Demonstrate EPWM, output pwm from FTM2 Ch5,
         LED BLUE on FRDM-KE06 board will blink as pwm pulse width changing.
*
*******************************************************************************/

#include "common.h"
#include "ics.h"
#include "ftm.h"
#include "uart.h"
#include "sysinit.h"

/******************************************************************************
* Global variables
******************************************************************************/

/******************************************************************************
* Constants and macros
******************************************************************************/

/******************************************************************************
* Local types
******************************************************************************/

/******************************************************************************
* Local function prototypes
******************************************************************************/

/******************************************************************************
* Local variables
******************************************************************************/

/******************************************************************************
* Local functions
******************************************************************************/;
void FTM2_Task(void);
/******************************************************************************
* Global functions
******************************************************************************/

/********************************************************************/
int main (void)
{     
    /* Perform processor initialization */
    sysinit();
   
    //Select FTM2Ch5 on PTG7
    SIM_RemapFTM2CH4ToPTG6();
   
    /* 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,9999);
    /* set clock source, start counter */
    FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV1);  
    /* 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)
        {}
}

/*****************************************************************************//*!
*
* @brief callback routine of FTM2 driver. FTM2 CH5 will change the duty cycle
*        periodically.
*        
* @param  none.
*
* @return none.
*
* @ Pass/ Fail criteria: none.
*
*****************************************************************************/
uint16_t u16ChV_old, u16ChV_new;
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[4].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_CHANNEL4, u16ChV_new);
    }
    else
    {
        u16count++;
    }
}
/********************************************************************/
如果可能的话,也说一下那个FTM2_TASK函数是干嘛的,谢谢了。

相关帖子

沙发
zshzcz|  楼主 | 2015-1-23 15:16 | 只看该作者
哦,忘了声明一点了
//Select FTM2Ch5 on PTG7
     SIM_RemapFTM2CH4ToPTG6();
这个地方是我自己尝试着换颜色,没有改过来。

使用特权

评论回复
板凳
FSL_TICS_ZJJ| | 2015-1-23 15:45 | 只看该作者
9999是十进制的,你需要看看你FTM选择的时钟是什么,如果是M级别的,时间当然很短。
如果要200ms,你自己计算下需要的MOD值是多少,如果MOD最大都达不到,就通过中断计数,累加达到你想要的时间,思想就是这样的,楼主在仔细看看,并自己尝试设置。

使用特权

评论回复
地板
zshzcz|  楼主 | 2015-1-23 15:48 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-23 15:45
9999是十进制的,你需要看看你FTM选择的时钟是什么,如果是M级别的,时间当然很短。
如果要200ms,你自己计 ...

好的,我再仔细看看,有问题会再回复。

使用特权

评论回复
5
FSL_TICS_ZJJ| | 2015-1-23 15:57 | 只看该作者
zshzcz 发表于 2015-1-23 15:48
好的,我再仔细看看,有问题会再回复。

嗯,其实不难,主要就是仔细配置。

使用特权

评论回复
6
justperky| | 2015-1-25 20:09 | 只看该作者
学习学习

使用特权

评论回复
7
sltian09| | 2015-6-26 10:49 | 只看该作者
本帖最后由 sltian09 于 2015-6-26 11:57 编辑

楼上的理解了木有啊 ,我也用到这里了也还没有理解,不知道周期250us怎么算来的,我算的是1ms啊?
还有void FTM2_Task(void) 这个函数也没有完全理解。
盼楼主介绍介绍啊

使用特权

评论回复
8
小狗爱吃骨头| | 2015-6-26 21:07 | 只看该作者
没有遇到过类似的问题,帮楼主顶一下

使用特权

评论回复
9
sltian09| | 2015-6-27 11:59 | 只看该作者
小狗爱吃骨头 发表于 2015-6-26 21:07
没有遇到过类似的问题,帮楼主顶一下

hi,能请教一下吗,周期250us是怎么算出来的呢?我自己按照手册从新配置了一番EPWM,怎么打不出波形,请看如下:
main()
{
     Clk_Init(); //system bus clock 20M        
     SIM_PINSEL1 |=SIM_PINSEL1_FTM2PS0(0);     
     SIM_SCGC |=SIM_SCGC_FTM2_MASK ;               
     FTM2_MODE |= FTM_MODE_WPDIS_MASK;     
    FTM2_COMBINE=0;                                       
    FTM2_SC=0x09;                                       
    FTM2_C3SC |= FTM_CnSC_ELSB_MASK;
    FTM2_C3SC &= ~FTM_CnSC_ELSA_MASK;               
    FTM2_C3SC |= FTM_CnSC_MSB_MASK;
    FTM2_MODE |= ~1;               
    FTM2_OUTMASK =~FTM_OUTMASK_CH0OM_MASK;
    FTM2_CNTIN=0x0000;        
   FTM2_MOD=9999;                                
   FTM2_C0V=5000;
}

不甚感激啊 !!!!!

使用特权

评论回复
10
大苏牙| | 2015-6-27 14:50 | 只看该作者
谢谢楼主分享,不知道现在用的怎么样了啊

使用特权

评论回复
11
史迪威将军| | 2015-6-27 15:00 | 只看该作者
我也跟着楼主一起学习一下

使用特权

评论回复
12
VB2015| | 2015-9-24 20:05 | 只看该作者
有没有用过FTM0或者FTM1,我的KEAZ128,FTM2模块8个通道都能正常输出PWM波,但FTM0,FTM1的通道就不能输出。求高手指点~

使用特权

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

本版积分规则

5

主题

40

帖子

0

粉丝