FSL_TICS_ZP 发表于 2014-5-22 11:33:33

【经验分享】FTM进阶特性介绍—【双边沿捕捉】

本帖最后由 FSL_TICS_Robin 于 2014-7-18 14:25 编辑

FTM进阶特性介绍 —【双边沿捕捉】
在经验分享《FTM与TPM差异简析》一文中,对FTM和TPM的差异作了详细的介绍,但并未就FTM的进阶功能如:硬件增加死区,故障控制输入,增强触发功能,脉冲双边沿捕捉,初始化和极性控制的使用作过多的阐述。为了加深大家对FTM功能的理解,本人会陆续推出FTM进阶功能使用的经验分享,欢迎大家下载浏览及讨论交流。闲话不叙,下面介绍脉冲双边沿捕捉特性,作为FTM进阶功能使用的经验分享的头篇,希望大伙多多支持。
**** Hidden Message *****




PS:本帖可从飞思卡尔版块置顶帖:飞思卡尔Kinetis资料大本营的飞思卡尔论坛支持小组【经验分享】帖汇总链接进入。

FSL_TICS_ZJJ 发表于 2014-5-22 13:18:36

感谢楼主的最新分享,大家有好的分享也欢迎分享出来。

ecd909090 发表于 2014-5-22 14:06:07

好资料 MARK

cmheia 发表于 2014-5-22 15:45:47

{:lol:}这FTM功能好多

iwqt1983 发表于 2014-5-26 15:02:17

双边沿捕捉很常用的功能,主要是如何用好

浪里白条 发表于 2014-5-26 16:07:17

这个很好,学习一下!

FSL_TICS_ZP 发表于 2014-6-3 10:04:56

iwqt1983 发表于 2014-5-26 15:02
双边沿捕捉很常用的功能,主要是如何用好

这个经验分享中有详细介绍,不妨你参考参考。

提线木偶 发表于 2014-6-5 17:37:05

学习一下

inspiriting 发表于 2014-6-5 18:07:32

{:victory:} {:victory:} {:victory:} {:victory:}

vampirejing 发表于 2014-6-6 21:30:29

看看FTM还有什么功能{:lol:}

Forever 发表于 2014-6-6 21:33:42

这个做什么用的,看看先

FSL_TICS_ZP 发表于 2014-6-9 09:27:10

提线木偶 发表于 2014-6-5 17:37
学习一下

欢迎下载学习,如有疑问可来论坛中讨论!

FSL_TICS_ZP 发表于 2014-6-9 09:27:35

inspiriting 发表于 2014-6-5 18:07


欢迎下载学习,如有疑问可来论坛中讨论!

FSL_TICS_ZP 发表于 2014-6-9 09:28:46

vampirejing 发表于 2014-6-6 21:30
看看FTM还有什么功能

后续还有FTM功能使用经验分享,敬请期待留意!

FSL_TICS_ZP 发表于 2014-6-9 09:29:20

Forever 发表于 2014-6-6 21:33
这个做什么用的,看看先

具体功能请参考下载文档介绍。

jc325168 发表于 2014-6-9 09:29:27

感谢楼主分享

zndz410 发表于 2014-6-9 16:24:28

下来学习学习。

提线木偶 发表于 2014-7-18 15:47:10

版主好,关于ftm的双边沿捕获功能我有点疑问   我现在想用这个功能捕获霍尔信号的周期   就是测电机速度同时还想用这个霍尔信号的跳变沿(上升和下降沿)产生中断用于电机换相,现在我设置的并不能根据跳变沿产生中断只是能产生定时器溢出中断   不知道是我对这个模块理解不太明白还是设置不对      版主可否给我一个双边沿捕捉的初始化程序   上边的附件我没弄明白编译环境是iar   我自己的初始化程序设的乱七八糟不知道哪有问题

提线木偶 发表于 2014-7-18 15:56:07

//输入捕捉模式
U8 FTM_InputCapture_Init(FTM_MemMapPtr FTM_No, unsigned char Channel, unsigned char CaptureMode,U8 ucPin)
{
    /* open the clock gate */
//FTM 通道使能
        if ((FTM0_BASE_PTR == FTM_No) && (Channel < 8))
    {
      SIM_SCGC6_REG(SIM_BASE_PTR) |= SIM_SCGC6_FTM0_MASK;
   
    }
    else if((FTM1_BASE_PTR == FTM_No)&& (Channel < 2))
    {
      SIM_SCGC6_REG(SIM_BASE_PTR) |= SIM_SCGC6_FTM1_MASK;
   
    }      
    else if ((FTM2_BASE_PTR == FTM_No)&& (Channel < 2))
    {
      SIM_SCGC3_REG(SIM_BASE_PTR) |= SIM_SCGC3_FTM2_MASK;
   
    }
    else
      return FALSE; /* error in FTM address or channel */

      
      FTM_PinInit(FTM_No,Channel,ucPin);//通道选择
      
      FTM_MODE_REG(FTM_No) &= (FTM_MODE_WPDIS_MASK);
      FTM_MODE_REG(FTM_No) &= (FTM_MODE_FTMEN_MASK);//使能ftm全功能
      
      FTM_SC_REG(FTM_No) |= FTM_SC_CLKS(1) | FTM_SC_PS(1);          //   系统时钟 6分频
//    FTM_SC_REG(FTM_No) |= FTM_SC_TOIE_MASK;//使能计数器溢出中断
      FTM_SC_REG(FTM_No) &= (~FTM_SC_CPWMS_MASK);//FTM加计数
      FTM_CNT_REG(FTM_No)=0;
      FTM_CNTIN_REG(FTM_No)=0;
      FTM_MOD_REG(FTM_No)   = 0xFFFF;
      FTM_QDCTRL_REG(FTM_No)=(~FTM_QDCTRL_QUADEN_MASK);//关闭正交解码
      FTM_FILTER_REG(FTM_No)=0x00;    //关闭过滤器
      FTM_MODE_REG(FTM_No) &= (FTM_MODE_FTMEN_MASK);//使能ftm全功能
      
      FTM_COMBINE_REG(FTM_No) &= FTM_COMBINE_DECAPEN0_MASK|FTM_COMBINE_DECAPEN1_MASK|FTM_COMBINE_DECAPEN2_MASK|FTM_COMBINE_DECAPEN3_MASK;
      
      FTM_CnSC_REG(FTM_No,Channel) &=(~FTM_CnSC_CHF_MASK);
      FTM_CnSC_REG(FTM_No,Channel) |= FTM_CnSC_CHIE_MASK;//使能通道输入捕获中断
      FTM_CnSC_REG(FTM_No,Channel) &= (~FTM_CnSC_MSB_MASK);//配置成输入捕获模式
      FTM_CnSC_REG(FTM_No,Channel) &= (~FTM_CnSC_MSA_MASK);
      

    if(FTM_INPUTCAPTURE_RISINGEDGE == CaptureMode)//允许中断,捕获上升沿
    {
      FTM_CnSC_REG(FTM_No,Channel) = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSA_MASK;
    }
    else if(FTM_INPUTCAPTURE_FALLINGEDGE == CaptureMode)// 捕获下降沿
    {
      FTM_CnSC_REG(FTM_No,Channel) = FTM_CnSC_CHIE_MASK | FTM_CnSC_ELSB_MASK;
    }
    else if(FTM_INPUTCAPTURE_BOTHEDGE == CaptureMode)    // 捕获双沿
    {
      
      FTM_CnSC_REG(FTM_No,Channel)|= FTM_CnSC_ELSB_MASK ;//上升或下降沿捕获
      FTM_CnSC_REG(FTM_No,Channel)|= FTM_CnSC_ELSA_MASK ;
    }
    else
      return FALSE;

    FTM_CnSC_REG(FTM_No,Channel) &=(~FTM_CnSC_DMA_MASK);
   
    if ((FTM0_BASE_PTR == FTM_No) && (Channel < 8))
    {
       enable_irq(INT_FTM0);
   
    }
    else if((FTM1_BASE_PTR == FTM_No)&& (Channel < 2))
    {
      enable_irq(INT_FTM1);

    }      
    else if ((FTM2_BASE_PTR == FTM_No)&& (Channel < 2))
    {
      enable_irq(INT_FTM2);
   
    }
   
    return TRUE;
   
   
}



这是我的初始化程序哪有问题希望版主告诉我   编程新手写的比较差别笑

提线木偶 发表于 2014-7-18 16:02:14

现在我很着急    希望版主具体告诉我下怎么改正   根据霍尔信号跳变的捕获中断怎么实现   还能读出周期的   辛苦版主了   一定要帮我啊{:2_34:}

FSL_TICS_Robin 发表于 2014-7-18 17:11:54

提线木偶 发表于 2014-7-18 15:47
版主好,关于ftm的双边沿捕获功能我有点疑问   我现在想用这个功能捕获霍尔信号的周期   就是测电机速度...

附件程序是使用CodeWarrior10.x自带PE工具生成的,所以你得用CodeWarrior10.x软件打开该工程。
你的应用可以通过FTM的双边沿捕捉功能实现,你是否有开启FTM的Channel (n) Interrupt呢?

swap2013 发表于 2014-7-21 09:35:31

TPM也能双边沿捕捉吧,只是需要中断里改一下。

提线木偶 发表于 2014-7-21 09:45:21

FSL_TICS_Robin 发表于 2014-7-18 17:11
附件程序是使用CodeWarrior10.x自带PE工具生成的,所以你得用CodeWarrior10.x软件打开该工程。
你的应用 ...

我没有那个软件,不知道你说的开启FTM的Channel (n) Interrupt,我开了ftm的中断   但是具体可以开启某个通道吗,我只知道enable_irq(62);enable_irq(63);enable_irq(64);是使能ftm0、1、2的,就是说ftm模块确实既能产生跳变沿中断用来霍尔换相,同时还能测得周期和占空比是吗          不知道可否再帮我看看上面的程序哪里有误了,感谢啊!

FSL_TICS_Robin 发表于 2014-7-21 09:48:39

swap2013 发表于 2014-7-21 09:35
TPM也能双边沿捕捉吧,只是需要中断里改一下。

swap2013 你好
谢谢你与大家分享自己使用TPM捕捉的经验{:biggrin:}
FTM是TPM的增强版,所以很多功能已经硬件做好了,这就使得用户的软件更为简单。

提线木偶 发表于 2014-7-21 10:02:15

FSL_TICS_Robin 发表于 2014-7-18 17:11
附件程序是使用CodeWarrior10.x自带PE工具生成的,所以你得用CodeWarrior10.x软件打开该工程。
你的应用 ...

版主说的通道 是不是进入中断后的这个判断啊    void ftmi_isr(void)
                                                               {
                                                                  if( FTM1_C0SC & FTM_CnSC_CHF_MASK)
                                                                   {
                                                                           }


                                                               }

FSL_TICS_Robin 发表于 2014-7-21 10:28:20

本帖最后由 FSL_TICS_Robin 于 2014-7-21 10:29 编辑

提线木偶 发表于 2014-7-21 10:02
版主说的通道 是不是进入中断后的这个判断啊    void ftmi_isr(void)
                                  ...

建议你看一下芯片对应的参考手册的,我这从K60 100MHz主频、144引脚封装、硅版本Rev2.x的参考手册K60P144M100SF2V2RM里截了些描述FTM中断的:
40.6 FTM Interrupts
40.6.1 Timer Overflow Interrupt
The timer overflow interrupt is generated when (TOIE = 1) and (TOF = 1).
40.6.2 Channel (n) Interrupt
The channel (n) interrupt is generated when (CHnIE = 1) and (CHnF = 1).
40.6.3 Fault Interrupt
The fault interrupt is generated when (FAULTIE = 1) and (FAULTF = 1).

通道中断就是指:
40.6.2 Channel (n) Interrupt
The channel (n) interrupt is generated when (CHnIE = 1) and (CHnF = 1).
所以你一旦开启通道中断且通道中断发生之后,就可以通过查询CHnF标志来判断此次进FTM中断是否为以上三种中断里的通道事件触发的。

修改原因:添加文档链接。

FSL_TICS_Robin 发表于 2014-7-21 13:57:44

提线木偶 发表于 2014-7-21 09:45
我没有那个软件,不知道你说的开启FTM的Channel (n) Interrupt,我开了ftm的中断   但是具体可以开启某个 ...

CodeWarrior10.x可以从飞思卡尔官网 CW-MCU10: CodeWarrior for MCUs(Eclipse IDE) - ColdFire、56800/E DSC、Kinetis、Qorivva 56xx、RS08/S08、S12Z 下载页面选择以下安装包:
Evaluation: CodeWarrior for Microcontrollers 10.6 (Eclipse, Offline) 一个月的评估板
Special Edition: CodeWarrior for Microcontrollers 10.6 (Eclipse, Offline) 代码大小限制的特别版

提线木偶 发表于 2014-7-22 13:43:38

FSL_TICS_Robin 发表于 2014-7-21 10:28
建议你看一下芯片对应的参考手册的,我这从K60 100MHz主频、144引脚封装、硅版本Rev2.x的参考手册K60P144 ...

谢谢,通道那个我是那个弄得昨天改了改可以进中断了   我还有点没想明白   我现在是双边沿捕获   选择的是上升和下降沿   也就是说他可以在捕捉到上升沿时进入中断   下降沿时也进入中断?

版主资料里的一句话:当脉冲边沿与设置的边沿模式相符时,FTMx_CNT的值自动存储在FTM_CnV内,

那我的cnv值要怎么读呢?进入中断就读?那捕捉的是上升沿还是下降沿我不知道啊   这里的cnv值应该是这个功能自动后次读取的值与前次读取的值相减后的值吧    那我应该在下降沿后才能得到cnv啊      总觉得上升下降捕获中断和占空比取值不能同步实现呢    还是我对这里理解有误了   资料看了没理解明白?

FSL_TICS_Robin 发表于 2014-7-22 15:13:52

提线木偶 发表于 2014-7-22 13:43
谢谢,通道那个我是那个弄得昨天改了改可以进中断了   我还有点没想明白   我现在是双边沿捕获   选 ...

你的FTM模块有双边沿捕获功能,需要使能该模式。
以先高后低的PWM举例:
硬件上将PWM信号接到通道n的输入端;
软件上将通道n设置成上升沿、通道n+1设置成下降沿,那么确认发生上升沿后会把该时刻的FTMx_CNT存入C(n)V并触发通道n的中断,确认发生下降沿后会把该时刻的FTMx_CNT存入C(n+1)V并触发通道n+1的中断。(当然只有你使能了CH(n)IE或CH(n+1)IE位才能让通道标志CH(n+1)F或CH(n+1)F去触发channel (n)或channel (n+1)的中断)
你进入中断后通过判断通道标志CH(n)F或CH(n+1)F 对应地去读FTM0_CnV或FTM0_C(n+1)V就可以了。
FTM0_C(n+1)V和FTM0_CnV的差值就可以推算出高电平时间,两次FTM0_CnV的差值就可以推算出周期。

提线木偶 发表于 2014-7-23 10:50:27

FSL_TICS_Robin 发表于 2014-7-22 15:13
你的FTM模块有双边沿捕获功能,需要使能该模式。
以先高后低的PWM举例:
硬件上将PWM信号接到通道n的输入 ...

非常感谢   这个是资料里说的一般方法吗   
使用MCU测量输入脉冲周期的一般方法是:设置脉冲上升沿触发或下降沿触发中断,在中断函数中,读取MCU中的Timer模块的计数寄存器的值,并用后次读取的值与前次读取的值相减,推导出脉冲周期值      这个是不是只要设置输入捕获模式就可以
那双边缘捕获模式和输入捕获模式有什么区别呢 ?   我先试试这个   

FSL_TICS_Robin 发表于 2014-7-25 17:14:07

提线木偶 发表于 2014-7-23 10:50
非常感谢   这个是资料里说的一般方法吗   
使用MCU测量输入脉冲周期的一般方法是:设置脉冲上升沿触发或 ...

我在29楼描述的是FTM的双边沿捕捉模式呀
双边沿捕获模式只需要硬件连接一个引脚,CnV的值会根据channel n 和channel n+1的配置捕获

你还是要多看看参考手册和楼主的介绍呢

jieao 发表于 2014-8-1 14:00:08

不是说不需要回复可见了吗?

jiang887786 发表于 2014-9-3 09:47:36

谢谢分享,回了看看情况。

sunnyqd 发表于 2014-9-3 14:19:27

跟高级,多谢楼主

xlxbangel 发表于 2014-9-3 14:22:42

这个功能做输入捕捉用的比较多   

RobotRD 发表于 2014-9-3 14:49:49

感谢楼主的分享
页: [1]
查看完整版本: 【经验分享】FTM进阶特性介绍—【双边沿捕捉】