自己编写的K60 PWM,超简洁,需要的可以看看

新手第一次做小车,老师直接让用K60了,,现在就开始学K60啦。
今天准备PWM模块,原本想直接用野火或拉普兰德的底层库,搞了一上午都没成功(太笨了我。。)
最后决定把FTM寄存器仔细看下。模仿着别人的代码终于成功了。代码如下。
通道默认为 FTM0的CH4  即  PTA7 。
以下是一点总结,也贴出来给大家看看吧


FTM:

1.      使用SIM模块开启对应的FTMx的时钟:SIM_SCGC6|=SIM_SCGC6_FTM0_MASK;   

2.      开启之后对应的FTM的寄存器显示复位值。但是定时器并没有开始计数

3.      直到FTMx_SC中的CLKS位不为0时,计数器开始计数。

4.      计数到MOD后TOF置位,若TOIE为1,对应中断打开(enable_irq(62)),则进入中断函数。

5.      FTM中的系统时钟应该是BUS_CLK..即48MHz

PWM:

   1.  FTM0_CnV必须在CnSC之后赋值????(这里本人试了发现当CnV在CnSC之前赋值的话不成功。。不知道原因,知道的解释下吧)

  2.   当置位了MSB后,打开了通道的匹配功能,(当CNT==CnV时匹配发生,翻转对应通道的电平,之后CNT继续计数直到等于MOD,计数器重新开始计数) 

#include "mypwm.h"

extern int periph_clk_khz;

void FTM_Init(u32 freq,u32 duty)    //默认为PTA 7 
{
    u32 clk_hz = (periph_clk_khz * 1000) ;       //bus频率
    u16 mod;
    u8 sc_ps;
    u16 cv;

    mod = (clk_hz >> 16 ) / freq ;         //  以下5行是为了将参数给的频率、占空比转化为寄存器的值
    for(sc_ps = 0; (mod >> sc_ps) >= 1; sc_ps++);
    if(freq < 1000)sc_ps++;
    mod = (clk_hz >> sc_ps) / freq;
    cv = (duty * (mod - 0 + 1)) / 100;

    SIM_SCGC6|=SIM_SCGC6_FTM0_MASK;  //开启FTM0时钟
    PORTA_PCR7=PORT_PCR_MUX(3);       //PTA7 第三功能
    FTM0_CNT=0;                       //清计数器                          
    FTM0_CNTIN=0;                      //初始值为0
    FTM0_C4SC=0x28;                    //MSB ELSB置1    EPWM模式
    FTM0_C4V=cv;                       //匹配值,即占空比
    FTM0_MOD=mod;                      //计数终值,决定频率 
    FTM0_SC=FTM_SC_PS(sc_ps) | FTM_SC_CLKS(1);   //定时器时钟为BUS时钟和分频
}

永不止步步 发表于11-14 10:08 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:305867个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号