1.5.3 FTM功能详解

1.

FTM模块的时钟

FTM模块的核心是一个16位计数器,该计数器的时钟来源可设置(由FTMx_SC寄存器中的CLKS设置),可来自总线时钟(CLKS=01),也可来自MCG模块的MCGFFCLK,对时钟源可进行分频(由FTMx_SC寄存器中的PS设置)。

如果使用固定频率时钟,即fixed

frenquency clock,也就是MCGFFCLK,则需要在MCG模块中设置。MCG模块提供的MCGFFCLK,可以为其它片上周边设备提供时钟,该时钟可由内部慢速参考时钟提供或外部晶振,且由FLL分频后提供。MCGFFCLK由C1_IREFS位设置来自内部32K还是来自外部经过FDIV分频后的时钟,输出到MCGFFCLK还要2分频一次。

MCGFFCLK用于局部总线时钟同步,而且不得大于MCGOUTCLK的1/8。且该时钟在MCG处于BLPI模式和STOP模式下无效。

一般情况下,只要不是对外部计数功能,我们都会采用Bus Clock为FTM提供时钟。

2.

FTM模块的计数模式

FTM模块在时钟确定后,计数器计数,默认情况下,对分频后输入时钟进行递增无符号计数。计数器初始值由FTMx_CNTIN指定。当一直计数到达FTMx_MOD寄存器的设定值时,TOF置位。计数器回到初始值,循环往复。如下图所示,计数器从0计数到3,循环计数。计数周期时钟周期。

初始值也可是负数,例如CNTIN=0xFFFC(补码-4),MOD=4,则计数器从-4计数到4,循环计数。当CNTIN的最高位,即CNTIN[15]=1时,初始值作为负数对待,否则视为正数。

FTM计数时,建议MOD值必须大于CNTIN值,编程时需注意。如果MOD==CNTIN,则计数值一直保持MOD值,且TOF位一直置1。

当QUADEN=0(非正交解码模式)且CPWMS=0(加法计数)时,计数器为加法计数,如果设置CPWMS=1,则进入先加后减计数模式。(中心对齐PWM必须将该位置1)。

在先加后减计数模式下,假设CNTIN=0,MOD=4,则计数过程如下

在该模式下,计数周期=2*(MOD-CNTIN),当计数值从MOD变为MOD-1时,TOF置位。

如FTMEN=0,此时FTM模块功能等同于S08的TPM模块,此时无论MOD=0或者MOD=0XFFFF,此时计数器为一个自由运行的16位计数器。

如FTMEN=1,且QUADEN=0、CPWMS=0时,此时只有MOD=0xFFFF时,才可作为一个自由运行的计数器。

任何对FTM计数器的写入操作,都会复位计数器,计数器的值重新回到CNTIN指定值。也可以使用FTM的同步功能,让计数器重新回到初值,各通道输出也回到初始值。

FTMx_CONF寄存器中的NUMOF[4:0]可设置TOF置位的频率。默认情况下,即NUMOF[4:0]=0,每个计数周期,TOF置位一次,如果NUMOF=n,(n<32),则每n+1个周期,TOF置位一次。

3.

边沿对齐PWM模式

PWM输出实际上利用的就是FTM的输出比较的功能。当QUADEN = 0,DECAPEN = 0,COMBINE= 0,CPWMS = 0,

MSnB = 1时,FTM工作在EPWM模式下,即边沿对齐模式。可用于产生舵机和电机的PWM控制信号。在这个模式下,FTM计数器工作方式和计数模式相同,默认为加法计数,计数到MOD值后自动返回CNTIN值。PWM信号的周期和计数器计数周期有关,PWM周期=(MOD-CNTIN+1)*时钟周期。

PWM信号高低电平切换的时刻,则由CnV值决定,当计数器累加计数到CnV值相等时,PWM信号则翻转。直到计数到MOD值,一个周期结束,信号回到初始值。这种模式的原理和输出比较模式是相同的,当比较成功时,也就是FTM计数值=CnV时,CHnF标志也会置1。PWM信号的输出可以时左对齐(信号先高后低)也可以是右对齐(信号先低后高)。左右对齐由ELSnB:ELSnA决定,若ELSnB:ELSnA=10则是左对齐模式,若ELSnB:ELSnA=X1则是右对齐模式。以左对齐为例,高电平持续时间=(CnV-CNTIN)*时钟周期。

在边沿对齐PWM模式中,一般PWM周期不变,通过改变CnV的值以改变占空比,如改变CnV的值,则新的值并不会立刻生效,而是到一个周期结束,FTM计数器从MOD变为CNTIN时,CnV值才生效。

EPWM例程如下,在该例程中,总线时钟为60MHz,经过FTM分频到3.75MHz,FTM递增计数,周期10ms,高电平事件1.5ms。使用FTM0_CH3通道,由PTA6引脚输出。

void FTM_Init(void)

{

PORTA_PCR6= PORT_PCR_MUX(3); // 设置引脚 A6引脚为FTM0_CH3功能

SIM_SCGC6|=SIM_SCGC6_FTM0_MASK;//使能FTM0时钟

FTM0_MODE |=

FTM_MODE_WPDIS_MASK;//写保护禁止

//设置通道0,工作在左边沿对其PWM模式//MSB=1,ELSB:ELSA=10

FTM0_C3SC |= FTM_CnSC_ELSB_MASK;//ELSB=1,ELSA=0,左对齐,先高后低

FTM0_C3SC &= ~FTM_CnSC_ELSA_MASK;

FTM0_C3SC |= FTM_CnSC_MSB_MASK;//MSB=1,模式选择边沿对齐

FTM0_SC=0x0c;//中断禁止,时钟源来自总线时钟60MHz,16分频后得到3.75MHz,CLKS=01,PS=100,CPWMS=0,递增计数

FTM0_MODE &= ~1;//FTM0使能

FTM0_OUTMASK=0XF7;//通道3输出,屏蔽其它通道

FTM0_QDCTRL&=~FTM_QDCTRL_QUADEN_MASK;//禁止正交解码模式

FTM0_COMBINE=0;//DECAPEN=0,双边沿捕捉禁止,COMBINE=0,不级联

FTM0_CNTIN=0;//FTM0计数器初始值为0

FTM0_MOD=37499;//结束值,周期为(MOD-CNTIN+1)*时钟周期=10ms

FTM0_C3V=5625;//高电平1.5ms

FTM0_CNT=0;

}

4.

中心对齐PWM模式

中心对齐PWM模式和边沿对齐PWM模式唯一不同之处在于CPWMS = 1,即此时计数器工作模式为先加后减模式,计数器累加到CnV时,信号翻转,直到计数到MOD值后开始递减计数,再次到达CnV时,信号再次翻转,然后递减到CNTIN值,一个周期结束。同样的MOD、CNTIN、CnV,值,CPWM的周期是EPWM的两倍,但占空比不变。

在中心对齐PWM模式下,ELSnB:ELSnA 的作用和EPWM相同,即ELSnB:ELSnA=10信号输出先高后低,若ELSnB:ELSnA=X1信号输出先低后高。

5.

输入捕捉模式

FTM的输入捕捉模式可捕捉外部信号的正跳变或负跳变,可替代外部中断使用。和一般外部中断不同的是,输入捕捉功能不但可以在捕捉到特定的跳变时产生中断,而且输入引脚可以启用滤波功能,关键是,输入捕捉功能在捕捉到信号时,还可以记录捕捉的时刻,即捕捉发生时,FTM计数器的值会记录在CnV寄存器中。

输入捕捉模式下,DECAPEN =

0(不启用双边呀捕捉),COMBINE = 0(各通道独立),CPWMS= 0(计数器累加计数),MSnB:MSnA = 0:0(输入捕捉模式)。

此时,捕捉什么样的信号则由ELSnB:ELSnA决定。

ELSnB:ELSnA=01:捕捉上升沿;

ELSnB:ELSnA=10:捕捉下降升沿;

ELSnB:ELSnA=11:捕捉上升沿或下降沿。

当对应的通道捕捉到设定的边沿时,CHnF置位,如果对应的CHnIE=1,即中断打开时,即可产生中断。

在输入捕捉模式下,当捕捉到设定的边沿时,此时的FTM计数器的值将自动保存到CnV寄存器中,也就是在输入捕捉模式下,CnV寄存器在程序中只可做读出之用,写入操作会被忽略。

每个FTM模块的0~3通道可以启用滤波功能,滤波原理是捕捉到边沿时,延时若干个时钟周期再置位CHnF。默认情况下,如不启用滤波功能,则延时3个系统时钟的上升沿。若启用滤波功能,则延时可设置,但只有0~3通道可以设置。注意,捕捉模式下,CNTIN应为0。

当启用滤波功能时,如果输入端发生变化,则滤波器内部的5bit计数器开始累加计数,一旦溢出(溢出值由CHnFVAL[3:0]设定),输入端变化才提交给边沿检测器。如果计数过程中,输入端再次发生相反变化,则计数器会被复位并重新开始计数,这样一些比过滤时间短的脉冲则会被视为干扰且不会提交给边沿计数器。

6.

输出比较模式

当DECAPEN =

0(禁止双边沿检测),COMBINE = 0(各通道独立),CPWMS = 0(计数器累加),MSnB:MSnA = 0:1时,FTM工作在输出比较模式下。

在输出比较模式下,计数器工作在累加模式下,当FTM计数器值=CnV值,时,比较成功,对应通道的引脚输出高电平、低电平或翻转信号。通道输出由ELSnB:ELSnA决定,ELSnB:ELSnA=01:输出翻转,ELSnB:ELSnA=10:输出低电平,ELSnB:ELSn=11:输出高电平。同时,当比较成功时,对应CHnF置位,如CHnIE=1,则比较成功即引发中断。

比较成功翻转电平输出,可用于输出方波。实际上PWM波形的产生也是利用了输出比较的功能实现的,输出比较功能中如使用中断且不输出波形,也可实现定时中断的功能。

7.

组合模式

以上几种模式下,FTMEN=0即可,若要使用增强FTM的功能,即不同于PTM模块功能,则必须FTMEN=1。组合模式就是其中一种,主要用于输出非对称PWM信号。

当FTMEN =

1(启用增强功能)

,QUADEN =

0(不启用正交解码),DECAPEN = 0(不启用双边沿捕捉),COMBINE = 1(相邻通道组合使用)CPWMS = 0(计数器累加模式)时,FTM工作在组合模式下。

组合工作模式下,主要指的是偶数通道2n和相邻的2n+1通道共同控制输出PWM波形。PWM信号的周期和EPWM相同,但是高低电平的切换的时机则由C2nV和C2n+1V确定。电平第一次翻转发生在通道2n比较成功,电平第二次翻转发生在通道2n+1比较成功。在一个周期开始时,初始电平由ELSnB:ELSnA决定,这点和EPWM和CPWM相同。

在组合模式下,PWM信号的第一个边沿只由C2nV决定,而第二个边沿只由C2n+1V决定。两个通道可独立设置对应边沿出现的位置,这就是非对称的PWM输出。

8.

互补模式

一般组合模式下,通道2n和通道2n+1输出波形相同,如果启用互补模式,则两个通道输出互为反向,在互补模式下,还可以启用死区插入功能,这在某些两路电机驱动的应用中是非常有用的。

当FTMEN =

1(启用增强功能)

,QUADEN =

0(不启用正交解码),DECAPEN = 0(不启用双边沿捕捉),COMBINE = 1(相邻通道组合使用)CPWMS = 0(计数器累加模式)COMP = 1(启用补偿模式)时,FTM工作在补偿模式下。在补偿模式下,仍然是2n通道和2n+1通道组合使用,输出PWM信号。和组合模式下不同的是,COMP=0时,2n通道和2n+1通道输出信号相同,而补偿模式下,2n+1通道输出的信号和2n通道是相反的。

例程如下,该例程使用60MHz总线时钟,分频后3.75MHz,输出引脚为C3和C4,分别对应FTM0_CH2和FTM0_CH3,注意由于FTMEN=1,相关寄存器更新采用软件触发的方式。在这个例子中,我们采用了死区插入,死区时间16*63个总线周期,时间大约16.8us。

void FTM0_Init(void)

{

PORTC_PCR3= PORT_PCR_MUX(4); // 设置引脚C3引脚为FTM0_CH2功能

PORTC_PCR4= PORT_PCR_MUX(4); // 设置引脚C4引脚为FTM0_CH3功能

SIM_SCGC6|=SIM_SCGC6_FTM0_MASK;//使能FTM0时钟

FTM0_SC=FTM_SC_CLKS(1)|FTM_SC_PS(4);//中断禁止,时钟源来自总线时钟60MHz,16分频后得到3.75MHz,CLKS=01,PS=100,CPWMS=0,递增计数

FTM0_MODE |= FTM_MODE_WPDIS_MASK;//写保护禁止

FTM0_MODE |=FTM_MODE_FTMEN_MASK;//FTMEN=1

FTM0_QDCTRL&=~FTM_QDCTRL_QUADEN_MASK;//禁止正交解码模式

FTM0_COMBINE|=FTM_COMBINE_COMBINE1_MASK;//FTM0通道2,3联合使用

FTM0_COMBINE|=FTM_COMBINE_COMP1_MASK;//FTM0通道2,3互补输出

FTM0_COMBINE|=FTM_COMBINE_SYNCEN1_MASK;//使能FTM0通道2,3 PWM同步

FTM0_COMBINE|=FTM_COMBINE_DTEN1_MASK;//死区插入

FTM0_DEADTIME=FTM_DEADTIME_DTPS(3)|FTM_DEADTIME_DTVAL(63);

FTM0_SYNCONF|=FTM_SYNCONF_SWWRBUF_MASK;//使能MOD,CNTIN,CV寄存器的软件触发同步

FTM0_SYNC=FTM_SYNC_CNTMIN_MASK|FTM_SYNC_CNTMAX_MASK;//设置load point

FTM0_C2SC |= FTM_CnSC_ELSB_MASK;//ELSB=1,ELSA=0,左对齐,先高后低

FTM0_C2SC &= ~FTM_CnSC_ELSA_MASK;

FTM0_C3SC |= FTM_CnSC_ELSB_MASK;//ELSB=1,ELSA=0,左对齐,先高后低

FTM0_C3SC &= ~FTM_CnSC_ELSA_MASK;

FTM0_OUTMASK=0XF3;//通道2,3输出,屏蔽其它通道

FTM0_CNTIN=0;//FTM0计数器初始值为0

FTM0_MOD=37499;//结束值,周期为(MOD-CNTIN+1)*时钟周期=10ms

FTM0_C2V=5625;//高电平1.5ms

FTM0_C3V=20000;

FTM0_CNT=0;

FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能软件触发

}

在main函数的主循环中,我们可使用串口通信改变波形,通过示波器观看,例程如下:

for(;;)

{

tom=

uart_getchar();

switch(tom)

{

case 'a':

FTM0_C3V+=50;

FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能软件触发

break;

case 'd':

FTM0_C3V-=50;

FTM0_SYNC|=FTM_SYNC_SWSYNC_MASK;//使能软件触发

break;

case 'w':

FTM0_INVCTRL^=FTM_INVCTRL_INV1EN_MASK;//反转

break;

default:break;

}

}

9.

正交解码模式

当FTMEN=1,且QUADEN=1时,FTM工作在正交解码模式。正交解码模式使用A相和B相两路输入控制FTM计数器的加减。可作为A相和B相输入的引脚如下,注意,FTM0没有正交解码功能,只有FTM1和FTM2具有该功能。

PTA8

PTA9

PTA10

PTA11

PTA12

PTA13

PTB18

PTB19

PTB0

PTB1

FTM1_QD_PHA

FTM1_QD_PHB

FTM2_QD_PHA

FTM2_QD_PHB

FTM1_QD_PHA

FTM1_QD_PHB

FTM2_QD_PHA

FTM2_QD_PHB

FTM1_QD_PHA

FTM1_QD_PHB

功能6

功能6

功能6

功能7

功能7

功能6

功能6

功能6

功能6

正交解码模式可用于输入旋转编码器的A相和B相信号,不但可以测量转速,还可以测量旋转的方向,一般旋转编码器的AB相输出信号相位差90°,如下所示。

正交解码模式中的细节设置需要通过FTMx_QDCTRL寄存器完成。

A相输入和B相输入也可以使用类似输入捕捉的滤波功能。原理同输入捕捉,滤波值通过FTMx_FILTER寄存器设置。

滤波的作用是为了在电机速度或位置控制时,由于电机振动造成的AB相输出干扰信号造成计数错误。正常情况下,电机匀速转动,编码器输出信号如图所示。

如果出现电机振动,则会出现如下波形。

正交解码系统框图如下所示

在正交解码模式下,计数器的时钟源来自外部的A相和B相输入。

A相和B相的极性确定以后,则通过QUADMODE位设置加减计数模式。

如果QUADMODE=1,B相输入值用于指示计数方向,A相输入用于计数,FTM计数器在A相输入的每个上升沿进行计数,累加或递减由B相电平决定。如下图所示。如果采用旋转编码器,则B相信号可由编码器输出的AB相通过D触发器后输入。

QUADMODE=1时计数模式

如果QUADMODE=0,则计数方向由AB相之间的关系决定,计数频率由A相B相输入信号决定。当A相或B相的信号出现跳

变,即可触发FTM计数器改变。在这种模式下,只需要把旋转编码器的AB相输出直接接到FTM的AB相输入即可。下图即为编码器正向旋转的AB相的关系示意图。

在QUADMODE=0时,只要满足以下任何一个条件,计数器即加1

l

A相出现上升沿时,B相为低电平;

l

B相出现上升沿时,A相为高电平;

l

B相出现下降沿时,A相为低电平;

l

A相出现下降沿时,B相为高电平。

在QUADMODE=0时,只要满足以下任何一个条件,计数器即减1

l

A相出现上升沿时,B相为高电平;

l

B相出现上升沿时,A相为低电平;

l

B相出现下降沿时,A相为高电平;

l

A相出现下降沿时,B相为低电平。

如果计数溢出,可能为正向溢出,也可能为反向溢出。正向溢出时,计数器累加计数到MOD后,即返回到CNTIN,这时TOF置位,而TOFDIR位也置1,表示正向溢出。反向溢出时,即计数器递减计数,从CNTIN变为MOD时,TOF置1,但TOFDIR为0,表示反向溢出。

正交解码模式初始化例程如下,该例程使用A10和A11引脚输入作为旋转编码器的A相和B相输入。

void

FTM2_QUAD_Iint(void)

{

PORTA_PCR10= PORT_PCR_MUX(6); // 设置引脚 A10引脚为FTM2_PHA功能

PORTA_PCR11= PORT_PCR_MUX(6); // 设置引脚 A11引脚为FTM2_PHB功能

SIM_SCGC3|=SIM_SCGC3_FTM2_MASK;//使能FTM2时钟

FTM2_MODE |= FTM_MODE_WPDIS_MASK;//写保护禁止

FTM2_QDCTRL|=FTM_QDCTRL_QUADMODE_MASK;//AB相同时确定方向和计数值

FTM2_CNTIN=0;//FTM0计数器初始值为0

FTM2_MOD=65535;//结束值

FTM2_QDCTRL|=FTM_QDCTRL_QUADEN_MASK;//启用FTM2正交解码模式

FTM2_MODE |=

FTM_MODE_FTMEN_MASK;//FTM2EN=1

FTM2_CNT=0;

}

在周期性定时中断服务程序中,读取FTM2_CNT的值并清0计数值即可得到当前的转速,使用int变量保存,如为正数则为正转,负数则为反转。定时中断处理程序入下。

void pit0_isr(void)

{

uint32 c;

PIT_TFLG0=PIT_TFLG_TIF_MASK;

pulse=FTM2_CNT;

FTM2_CNT=0;

c=PIT_CVAL0;

}

ftm模块linux驱动,飞思卡尔K60 FTM模块详解【二】相关推荐

  1. ftm模块linux驱动,飞思卡尔k系列_ftm模块详解.doc

    飞思卡尔k系列_ftm模块详解 1.5FTM模块1.5.1 FTM模块简介FTM模块是一个多功能定时器模块,主要功能有,PWM输出.输入捕捉.输出比较.定时中断.脉冲加减计数.脉冲周期脉宽测量.在K1 ...

  2. 【Linux驱动】安卓充电芯片bq24735调试详解

    一.bq24735简介 bq24735 是一款高效率同步电池充电器. 当系统供电需求暂时高于适配器最大供电水平的时候, bq24735 使用智能加速技术来允许电池向系统中释放能量,这样的话将保护适配器 ...

  3. linux查看录音驱动程序,linux驱动由浅入深系列:ALSA框架详解 音频子系统之二

    本文以高通平台为例,介绍一下android下的音频结构.android使用的是tinyALSA作为音频系统,使用方法和基本框架与linux中常用的ALSA音频子系统是一致的. ALSA音频框架 ALS ...

  4. linux驱动(七)gpiolib库详解

    ---恢复内容开始--- 1:什么是gpiolib,为什么要有gpiolib? linux中从2.6.35以后就开始有gpiolib库了,gpiolib的作用是对所有的gpio实行统一管理,因为驱动在 ...

  5. linux系统中shell脚本最全详解二shell条件判断语法介绍函数分析

    目录 一.shell判断句 1.if条件判断语句 2.test判断 二.语法介绍 1.shell运算符 2.shell循环语句 三.shell函数 一.shell判断句 1.if条件判断语句 if语法 ...

  6. 飞思卡尔K60nbsp;FTM模块详…

    原文地址:飞思卡尔K60 FTM模块详解[二] 作者:杨家二少 1.5.3 FTM功能详解 1.         FTM模块的时钟 FTM模块的核心是一个16位计数器,该计数器的时钟来源可设置(由FT ...

  7. 飞思卡尔MC9S12X PIT模块

    今天带着大家学习了解下飞思卡尔MC9S12XS PID模块. PIT模块概述 周期性中断定时器(Periodic Interrupt Timer,PIT)模块是一组24位的定时器,由8位微定时器和16 ...

  8. linux驱动之可加载模块

    Linux 的众多优良特性之一就是可以在运行时扩展由内核提供的特性的能力. 这意味着你可以在系统正在运行着的时候增加内核的功能( 也可以去除 ). 每块可以在运行时添加到内核的代码, 被称为一个模块. ...

  9. linux添加hello驱动,Linux驱动之建立一个hello模块

    目标:在开发板上执行insmod hello.ko能在控制台打印出hello init:接着执行rmmod会在控制台打印出hello exit 建立一个hello模块的步骤如下: 1.建立一个hell ...

  10. Android 驱动(12)---Linux DTS(Device Tree Source)设备树详解

    Linux DTS(Device Tree Source)设备树详解 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇) Linux DTS(Device Tr ...

最新文章

  1. .net 使用 Aspose.Words 进行 Word替换操作
  2. 现代密码学2.4--香农定理/Shannon Theorem:完美安全的充分必要条件
  3. SVN项目,快速查看项目的当前版本号
  4. html中从下往上遮罩效果,css制作从下往上逐渐显示的div
  5. 服务器排障 之 nginx 499 错误的解决
  6. pymssql.OperationalError: (20017 问题解决
  7. @configuration注解_Spring注解@Configuration
  8. Jmeter发送get请求
  9. 三菱MX Component通信应用
  10. 2020年“泰迪杯”数据分析职业技能大赛A 题优秀报告:教育平台的线上课程智能推荐策略
  11. 《计算机组成原理》作业,《计算机组成原理》作业一解答.doc
  12. Android Studio 开关控件Switch使用
  13. 投简历的格式(第一分简历)
  14. MySQL的一级索引和二级索引
  15. Windows记录ping时间戳
  16. mysql汉字插不进去_Mysql下插入汉字失败
  17. CA证书的签发流程详情
  18. python 英语分词_用几十行代码实现python中英文分词
  19. 苹果手机输入法设置的3个技巧,身边朋友都在用
  20. 投简历一直没有回应,原因竟然是...

热门文章

  1. Chair:支付宝前端团队推出的Node.js Web框架
  2. HTML颜色名称和颜色代码表
  3. 简单破解 Sencha Architect 2.2 (ExtJs Designer) - 李路平 - 博客园
  4. 大厂Java八股文面试真题汇总,2022秋招必备,面试不慌
  5. java基于for、while循环经典案例题(仅供参考)
  6. JSP空间上当受骗篇
  7. 系统启动时启动服务器,在BOIS如何设置启动项 启动方式怎么选择
  8. 学生用计算机的感叹号在哪,感叹号怎么打电脑(感叹号的用法及举例)
  9. 多渔:苦干执行,胜者为王!
  10. opencv中step[i],step1(i),elemsize,elemsize1