自己编写的K60 PWM,超简洁,需要的可以看
时间:11-14 15:22 阅读:4854次
*温馨提示:点击图片可以放大观看高清大图
简介:新手第一次做小车,老师直接让用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时钟和分频}