搜索
bottom↓
回复: 35

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

[复制链接]

出0入0汤圆

发表于 2014-5-22 11:33:33 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_Robin 于 2014-7-18 14:25 编辑

FTM进阶特性介绍 —【双边沿捕捉】

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





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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-5-22 13:18:36 | 显示全部楼层
感谢楼主的最新分享,大家有好的分享也欢迎分享出来。

出0入0汤圆

发表于 2014-5-22 14:06:07 | 显示全部楼层
好资料 MARK

出0入0汤圆

发表于 2014-5-22 15:45:47 | 显示全部楼层
这FTM功能好多

出0入0汤圆

发表于 2014-5-26 15:02:17 | 显示全部楼层
双边沿捕捉很常用的功能,主要是如何用好

出0入0汤圆

发表于 2014-5-26 16:07:17 | 显示全部楼层
这个很好,学习一下!

出0入0汤圆

 楼主| 发表于 2014-6-3 10:04:56 | 显示全部楼层
iwqt1983 发表于 2014-5-26 15:02
双边沿捕捉很常用的功能,主要是如何用好

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

出0入0汤圆

发表于 2014-6-5 17:37:05 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-6-5 18:07:32 | 显示全部楼层

出0入0汤圆

发表于 2014-6-6 21:30:29 | 显示全部楼层
看看FTM还有什么功能

出0入0汤圆

发表于 2014-6-6 21:33:42 | 显示全部楼层
这个做什么用的,看看先

出0入0汤圆

 楼主| 发表于 2014-6-9 09:27:10 | 显示全部楼层

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

出0入0汤圆

 楼主| 发表于 2014-6-9 09:27:35 | 显示全部楼层

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

出0入0汤圆

 楼主| 发表于 2014-6-9 09:28:46 | 显示全部楼层
vampirejing 发表于 2014-6-6 21:30
看看FTM还有什么功能

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

出0入0汤圆

 楼主| 发表于 2014-6-9 09:29:20 | 显示全部楼层
Forever 发表于 2014-6-6 21:33
这个做什么用的,看看先

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

出0入0汤圆

发表于 2014-6-9 09:29:27 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2014-6-9 16:24:28 | 显示全部楼层
下来学习学习。

出0入0汤圆

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

出0入0汤圆

发表于 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;
   
   
}



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

出0入0汤圆

发表于 2014-7-18 16:02:14 | 显示全部楼层
现在我很着急    希望版主具体告诉我下怎么改正   根据霍尔信号跳变的捕获中断怎么实现   还能读出周期的   辛苦版主了   一定要帮我啊

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-7-21 09:35:31 | 显示全部楼层
TPM也能双边沿捕捉吧,只是需要中断里改一下。

出0入0汤圆

发表于 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模块确实既能产生跳变沿中断用来霍尔换相,同时还能测得周期和占空比是吗          不知道可否再帮我看看上面的程序哪里有误了,感谢啊!

出0入0汤圆

发表于 2014-7-21 09:48:39 | 显示全部楼层
swap2013 发表于 2014-7-21 09:35
TPM也能双边沿捕捉吧,只是需要中断里改一下。

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

出0入0汤圆

发表于 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)
                                                                   {
                                                                             }


                                                                 }

出0入0汤圆

发表于 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中断是否为以上三种中断里的通道事件触发的。

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

出0入0汤圆

发表于 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) 代码大小限制的特别版

出0入0汤圆

发表于 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啊      总觉得上升下降捕获中断和占空比取值不能同步实现呢    还是我对这里理解有误了   资料看了没理解明白?

出0入0汤圆

发表于 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的差值就可以推算出周期。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

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

出0入0汤圆

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

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

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

出0入0汤圆

发表于 2014-8-1 14:00:08 | 显示全部楼层
不是说不需要回复可见了吗?

出0入0汤圆

发表于 2014-9-3 09:47:36 | 显示全部楼层
谢谢分享,回了看看情况。

出0入0汤圆

发表于 2014-9-3 14:19:27 | 显示全部楼层
跟高级,多谢楼主

出0入0汤圆

发表于 2014-9-3 14:22:42 | 显示全部楼层
这个功能做输入捕捉用的比较多   

出0入0汤圆

发表于 2014-9-3 14:49:49 | 显示全部楼层
感谢楼主的分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 19:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表