[汽车MCU – KEA] 【玩转KEA】官方实验例程FTM模块

[复制链接]
8221|13
 楼主| FSL_FAE_REMI 发表于 2014-7-24 11:46 | 显示全部楼层 |阅读模式
本帖最后由 FSL_FAE_REMI 于 2014-7-24 11:52 编辑

         FTM模块(The FlexTimer module)的主要功能有输入捕捉、输出比较和产生PWM信号来驱动电机和进行能量管理。
       本实验主要是通过FTM模块的计数器功能,分别对FTM2模块的0123四个通道的FTM2_CnV寄存器设置不同的输出匹配的值,分别为15400100ms 30800200ms)、46200300ms)、 61600400ms)。当计数器上升计数到与对应的FTM2_CnV寄存器的设定值相等时,对应通道上产生一次中断。然后通过中断,对通道的引脚电平进行翻转,计数器重新计数。这样相当于产生了四个不同周期的PWM信号来控制KEA128开发板上的4LED灯的点亮与熄灭。
芯片引脚与LED电路如下图所示。
1.png 2.PNG


设置FTM2_CnV寄存器的值代码如下:
main.c文件中:
FTM_Init();                                                                       /* Initialize the FTM module */
     FTM_SetPeriod(0, 15400); /* Interrupt every 15400 counts,  equal to every 100 ms */                                                         
     FTM_SetPeriod(1, 30800); /* Interrupt every 30800 counts,  equal to every 200 ms */                                 
     FTM_SetPeriod(2, 46200); /* Interrupt every 46200 counts,  equal to every 300 ms */                                             
     FTM_SetPeriod(3, 61600); /* Interrupt every 61600 counts, equal to every  400 ms */
FTM.c文件中:
void FTM_SetPeriod(UINT8 ch, UINT32 per)
{
     period[ch] = per;
     FTM2_C0V = FTM_CnV_VAL(period[0]) ;
     FTM2_C1V = FTM_CnV_VAL(period[1]) ;   
     FTM2_C2V = FTM_CnV_VAL(period[2]) ;
     FTM2_C3V = FTM_CnV_VAL(period[3]);
}
其中:FTM_CnV_VAL为赋值函数,其设定可以在SKEAZ1284.h文件中查询含义。


引脚电平跳变的代码如下:
main.c文件中:
void FTM_Interrupt(UINT8 ch)
{
                 switch(ch)
                 {
                 case 0:
                             LED0_TOGGLE;
                 break;
                 case 1:
                             LED1_TOGGLE;         
                 break;
                 case 2:
                             LED2_TOGGLE;         
                 break;
                 case 3:
                             LED3_TOGGLE;         
                 break;
                 }
}
GPIO.h文件中:
#define OUTPUT_TOGGLE(port,register_num)   XOUTPUT_TOGGLE(port,register_num)
#define XOUTPUT_TOGGLE(port,register_num)    GPIO##port##_PTOR|=1<<register_num

TRK-KEA128_LABTS2.zip (343.24 KB, 下载次数: 150)
     




评论

感谢,正在学习  发表于 2018-1-16 19:06
FSL_FAE_STEVE 发表于 2014-7-24 11:51 | 显示全部楼层
感谢楼主的分享!
FSL_TICS_ZJJ 发表于 2014-7-24 13:35 | 显示全部楼层
支持楼主的原创分享!
663208879 发表于 2014-9-16 16:23 | 显示全部楼层
想问下 这个 100、200、300、400ms所对应的值是怎么算出来的
FSL_TICS_Robin 发表于 2014-9-16 16:43 | 显示全部楼层
663208879 发表于 2014-9-16 16:23
想问下 这个 100、200、300、400ms所对应的值是怎么算出来的

既然是FTM的counter个数,那么肯定和FTM counter频率有关。
你可以查一下FTM counter的频率在此程序中设置成了多少。

663208879 发表于 2014-9-16 17:24 | 显示全部楼层
FTM2_SC |= FTM_SC_PS(7);        /* Select Preescaler in this case 128. 20 Mhz /128 =156.25 Khz. */
                                /* Counter increase by one every 6.4 us */
FTM2_SC |= FTM_SC_CLKS(1);      /* FTM2 use system clock */

以上是例子上对定时器的配置,FTM counter 是156.25Khz(6.4us)   15400 * 6.4us = 98.560ms  ,所以不知道这个100MS是怎么算出来的
FSL_TICS_Robin 发表于 2014-9-16 17:27 | 显示全部楼层
663208879 发表于 2014-9-16 17:24
FTM2_SC |= FTM_SC_PS(7);        /* Select Preescaler in this case 128. 20 Mhz /128 =156.25 Khz. */
                                /*  ...

手头没有这块开发板呢暂时,请问你用示波器测试LED引脚电压波形是准确的100ms吗?
663208879 发表于 2014-9-16 20:45 | 显示全部楼层
用示波器看确实是100ms
FSL_TICS_Robin 发表于 2014-9-17 15:02 | 显示全部楼层
663208879 发表于 2014-9-16 17:24
FTM2_SC |= FTM_SC_PS(7);        /* Select Preescaler in this case 128. 20 Mhz /128 =156.25 Khz. */
                                /*  ...

这注释感觉蛮奇怪的嘛
建议你利用PTH2引脚上的BUSOUT功能输出Bus Clock并用示波器观察一下。
SIM_SOPT0寄存器的CLKOE可以用于使能该引脚功能。

FTM counter的时钟源从你程序配置来看就是选择的这个FTM / PWT时钟除以128

这样一来你就可以根据DIV1\DIV2\DIV3的值以及测得Bus Clock频率得知FTM / PWT时钟了。

KEA128 clock.jpg


lingyun1 发表于 2015-6-30 15:28 | 显示全部楼层
完全没看懂这注释是什么意思
lingyun1 发表于 2015-6-30 15:28 | 显示全部楼层
完全没看懂这注释是什么意思,这128.2MHZ是怎么来的啊?
lingyun1 发表于 2015-6-30 15:30 | 显示全部楼层
完全没看懂这注释是什么意思,这128.2MHZ是怎么来的啊?
VB2015 发表于 2015-9-24 20:02 | 显示全部楼层
有没有用过FTM0,或者FTM1啊,我这边用的KEAZ128,FTM2模块的8个通道都能按设计输出指定的PWM脉冲波,但FTM0,FTM1的2个通道完全不行。求高手指点哦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

15

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部