查看: 5583|回复: 5

[求助] 关于KEA128中FTM0/1的问题

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
9
最后登录
2016-3-10
发表于 2016-3-9 14:56:11 | 显示全部楼层 |阅读模式
本帖最后由 catson 于 2016-3-9 15:32 编辑

【目的】利用KEA128的FTM0或FTM1生成EPWM到管脚输出,并控制其占空比

【现象】
不能正常控制占空比

【详细】
翻查KEA128_Demos的FTM_EPWM_demo内容
为使用FTM2发送的EPWM程序。

按照芯片手册KEA128 Sub-Family Reference Manual 的 P83 内容:FTM0\1和FTM2一样具有EPWM输出能力,但有部分寄存器不能使用(含CNTIN)
QQ图片20160309144825.jpg

按照芯片手册KEA128 Sub-Family Reference Manual 的 P427 内容:EPWM输出周期、占空比与寄存器CNTIN有关系(与上面内容矛盾?)
QQ截图20160309145414.png

先不管→改写DEMO程序、改输出管脚、改channel等等,能输出PWM,但是没有像DEMO例程那样PWM占空比持续改变,通过改变MOD能够使PWM占空比和周期发生变化。但并不可控,也不知道怎么计算其占空比以及周期。

【问题】
1、若要使用和例程一样的方法生成PWM是否只能够用FTM2?
2、如果使用FTM0\1生成EPWM(手册上说可以)应该怎么操作?怎样控制其占空比/周期?
3、关于2有否demo?

先谢过了~

我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2016-3-10 10:27:21 | 显示全部楼层
三个FTM都可以,
FTM0和FTM1虽然没有FTM_CNTIN寄存器,但是在EPWM和CPWM模式下,CNTIN开始值必须是0,不涉及到设置的问题。
你可以参考这个函数,使能PWM波输出
uint8 FTM_PWM_Init(FTM_MemMapPtr FTM_No, unsigned char PWMModeSelect, unsigned char PWMEdgeSelect)
{
    uint8_t channels, i;
   
    /* open the clock gate */
        if (FTM0_BASE_PTR == FTM_No)
    {
        channels = 2;
        SIM_SCGC_REG(SIM_BASE_PTR) |= SIM_SCGC_FTM0_MASK;
    }
    else if(FTM1_BASE_PTR == FTM_No)
    {
        channels = 2;
        SIM_SCGC_REG(SIM_BASE_PTR) |= SIM_SCGC_FTM1_MASK;
    }        
    else if (FTM2_BASE_PTR == FTM_No)
    {
        channels = 6;
        SIM_SCGC_REG(SIM_BASE_PTR) |= SIM_SCGC_FTM2_MASK;
    }
    else
        return FALSE;  /* error in FTM address or channel */
   
    FTM_SC_REG(FTM_No)  = 0x0; /* diable counter */  
        FTM_MOD_REG(FTM_No) = FTM_MOD_INIT;
   

    if(FTM_PWMMODE_CENTERALLIGNED == PWMModeSelect) /* enable CPWM */
    {
        FTM_SC_REG(FTM_No) |= FTM_SC_CPWMS_MASK;
    }
    else if(FTM_PWMMODE_COMBINE == PWMModeSelect)  /* enable combine pwm mode */
    {
        if(FTM2_BASE_PTR == FTM_No)
        {
            FTM_MODE_REG(FTM_No) |= FTM_MODE_FTMEN_MASK;
            FTM_COMBINE_REG(FTM_No) = FTM_COMBINE_COMBINE0_MASK | FTM_COMBINE_COMP0_MASK | FTM_COMBINE_SYNCEN0_MASK | FTM_COMBINE_DTEN0_MASK |
                                      FTM_COMBINE_COMBINE1_MASK | FTM_COMBINE_COMP1_MASK | FTM_COMBINE_SYNCEN1_MASK | FTM_COMBINE_DTEN1_MASK |
                                      FTM_COMBINE_COMBINE2_MASK | FTM_COMBINE_COMP2_MASK | FTM_COMBINE_SYNCEN2_MASK | FTM_COMBINE_DTEN2_MASK ;                              
        }
        else
            return FALSE;  /* error, only FTM2 has the combine mode */
    }
    if(FTM_PWM_HIGHTRUEPULSE == PWMEdgeSelect)
    {
        /* Configure timers PWM High True Pulses */
        for(i=0; i<channels; i++)
        {
            FTM_CnSC_REG(FTM_No,i) = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK;  
            FTM_CnV_REG(FTM_No,i)  = FTM_C0V_INIT + i*100;
        }
    }
    else if(FTM_PWM_LOWTRUEPULSE == PWMEdgeSelect)
    {
        /* Configure timers for PWM Low True Pulses */
        for(i=0; i<channels; i++)
        {
            FTM_CnSC_REG(FTM_No,i) = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSA_MASK;
            FTM_CnV_REG(FTM_No,i)  = FTM_C0V_INIT + i*100 ;
        }
    }
    FTM_SC_REG(FTM_No) |= FTM_SC_CLKS(FTM_CLOCK_SYSTEMCLOCK);  /* system clock */
    //FTM_PWMLOAD_REG(FTM_No) |= FTM_PWMLOAD_LDOK_MASK | 0x3F;
   
    return TRUE;
}
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
9
最后登录
2016-3-10
 楼主| 发表于 2016-3-10 11:56:51 | 显示全部楼层
FSL_TICS_ZP 发表于 2016-3-10 10:27
三个FTM都可以,
FTM0和FTM1虽然没有FTM_CNTIN寄存器,但是在EPWM和CPWM模式下,CNTIN开始值必须是0,不涉 ...

谢谢你的耐心讲解,我完全被那个DEMO、标准库、手册说明给绕进去了-_-
还没动手不过看着问题应该是可以解决的,感谢你!

不过,还是发几句牢骚,也是希望freescale能做得更好:
1、既然EPWM是FTM0、1、2都可以做的,为什么DEMO要选FTM2来做呢…还特地用些FTM2才能用的API来做…像这个FTM_SetFTMEnhanced, 虽然说是inline的但是FTM0\1来调马上就访问不能访问的寄存器导致死机了…API描述那里还写着可以调随便一个FTM呢…这个明显和手册矛盾了啊…

2、CNTIN这个既然值必然为0,为什么在CNTIN一章节里面没有呢?完后EPWM里面也没提到。(没一字不漏看完手册不敢说通篇没有)。看完你的解析,我知道基本上如无特别情况就是CNTIN设成0,然后通过调整MOD调整周期,通过调整CNV调整占空比的设置,当初在手册上面写明就好了……

3、手册:坦白讲写得真是有点难懂(英文版也是、中文版也是),或许是我理解力问题。或者说用来翻查的时候想找的东西不容易找到。我也只用过ST和Renesas的,个人感觉是要好找不少。

最后必须为FREESCALE的FAE在社区这么迅速积极的回答和对应点个赞!^_^
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2016-3-10 13:34:20 | 显示全部楼层
catson 发表于 2016-3-10 11:56
谢谢你的耐心讲解,我完全被那个DEMO、标准库、手册说明给绕进去了-_-
还没动手不过看着问题应该是可以解 ...

谢谢建议,
建议你先自己可以在参考代码的基础上进行修改,有什么问题的话,随时联系
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

70

帖子

0

注册会员

Rank: 2

积分
141
最后登录
2016-3-17
发表于 2016-3-10 18:37:21 | 显示全部楼层
FSL_TICS_ZP 发表于 2016-3-10 10:27
三个FTM都可以,
FTM0和FTM1虽然没有FTM_CNTIN寄存器,但是在EPWM和CPWM模式下,CNTIN开始值必须是0,不涉 ...

学习了,辛苦作者了,写的这么详细,谢谢分享!
logo.png
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

26

帖子

0

注册会员

Rank: 2

积分
184
最后登录
2017-12-17
发表于 2016-9-13 10:00:23 | 显示全部楼层
catson 发表于 2016-3-10 11:56
谢谢你的耐心讲解,我完全被那个DEMO、标准库、手册说明给绕进去了-_-
还没动手不过看着问题应该是可以解 ...

你好,我也遇到这个问题,你是怎么解决的额、
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-18 10:13 , Processed in 0.104735 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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