搜索
bottom↓
回复: 39

KE02 FTM0输入捕获(已解决)

[复制链接]

出0入0汤圆

发表于 2014-1-28 10:04:08 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZJJ 于 2014-2-13 10:44 编辑

不知freescale的大牛们今天还上班吗?
问一个问题:我使用FTM0捕获脉宽,在只使用channel0的情况下能不能实现脉宽捕获?如果可以,如何识别是falling还是Rising?

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-1-28 10:55:19 | 显示全部楼层
楼主,你好!
我们在上班啊!
你的问题可以这样做,KE02的FTM模块他是有双边沿捕获功能的,结构图如下:

也就是外部引脚其实就用了一个通道。
你可以试试,如果遇到问题,欢迎交流!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-1-28 10:56:27 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 10:55
楼主,你好!
我们在上班啊!
你的问题可以这样做,KE02的FTM模块他是有双边沿捕获功能的,结构图如下:

看来年三十才能放假的节奏,辛苦了

出0入0汤圆

发表于 2014-1-28 11:00:32 | 显示全部楼层
山外メ雲ジ 发表于 2014-1-28 10:56
看来年三十才能放假的节奏,辛苦了

呵呵,今天是最后一天哦。
明天以后有问题就基本上是年后回你们了,不过如果有空,我也会在假期逛逛论坛的。

出0入0汤圆

 楼主| 发表于 2014-1-28 11:02:34 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 10:55
楼主,你好!
我们在上班啊!
你的问题可以这样做,KE02的FTM模块他是有双边沿捕获功能的,结构图如下:

我用的是你们的库,FTM2已经被我用作其他功能,在我使用FTM0时,无法经过校验 ASSERT((FTM2 == pFTM)  && (u8ChannelPair < 6) && !(u8ChannelPair & 1) );
我还以为只能用FTM2。
找了例程看,结果只有FTM2的,而FTM0又比FTM2少林很多寄存器,都不知道怎么操作.

出0入0汤圆

发表于 2014-1-28 11:05:45 | 显示全部楼层
ln08136207 发表于 2014-1-28 11:02
我用的是你们的库,FTM2已经被我用作其他功能,在我使用FTM0时,无法经过校验 ASSERT((FTM2 == pFTM)  &&  ...

FTM0肯定是可以用的,楼主你不要着急,把你的问题描述的详细点,我待会有空做一个程序给你参考。

出0入0汤圆

 楼主| 发表于 2014-1-28 11:15:10 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 11:05
FTM0肯定是可以用的,楼主你不要着急,把你的问题描述的详细点,我待会有空做一个程序给你参考。 ...

我需要不断的捕捉外部的脉宽信号,因为要捕捉脉宽,也就是要捕获上升沿和下降沿,如果只使用一个通道,假设上升沿时为T1,下降沿是T2,脉宽就是T2-T1.
问题是:在使能通道中断的情况下,上升沿和下降沿都会触发中断,我的问题是,怎么去判断此中断是上升沿还是下降沿?

或者 有没有用FTM0测脉宽的其他方法,使用两个通道的也可以。

出0入0汤圆

发表于 2014-1-28 11:18:33 | 显示全部楼层
ln08136207 发表于 2014-1-28 11:15
我需要不断的捕捉外部的脉宽信号,因为要捕捉脉宽,也就是要捕获上升沿和下降沿,如果只使用一个通道,假设上 ...

你说的单通道确实是有这样的问题,不好判别上升沿还是下降沿,但是之前有过类似的经验,对于单通道可以使用读IO口去判别到底是高还是低来确定边沿的办法,但是这点在KE上还没有予以验证,您可以试试这种方法。
另一种靠谱的方法就是使用FTM的上边沿检测通道,这个外部只使用一个通道n,但是内部又结合了n+1.FTM的这个功能主要是用于解决您所描述的问题。

出0入0汤圆

 楼主| 发表于 2014-1-28 11:24:10 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 11:18
你说的单通道确实是有这样的问题,不好判别上升沿还是下降沿,但是之前有过类似的经验,对于单通道可以使 ...

你说的FTM的上边沿检测通道,我在datasheet中没看到怎么去配置这一功能,在哪一章?(原谅我吧,我太懒了,实在不太想看datasheet)

出0入0汤圆

发表于 2014-1-28 11:27:06 | 显示全部楼层
ln08136207 发表于 2014-1-28 11:24
你说的FTM的上边沿检测通道,我在datasheet中没看到怎么去配置这一功能,在哪一章?(原谅我吧,我太懒了 ...

呵呵,其实我在2楼图片都截出来了,
RM文档下载地址:http://cache.freescale.com/files ... p;WT_TYPE=Reference Manuals&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation
内容讲解在26.4.23  讲了如何去配置这个模式了。
您可以试试,如果遇到问题,及时联系我,不行我用PE给你做个。

出0入0汤圆

 楼主| 发表于 2014-1-28 11:32:26 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 11:27
呵呵,其实我在2楼图片都截出来了,
RM文档下载地址:http://cache.freescale.com/files/32bit/doc/ref_m ...

可FTM0的寄存器里面就没有DECAPEN 这一项,该怎么操作?

出0入0汤圆

发表于 2014-1-28 11:35:13 | 显示全部楼层
本帖最后由 FSL_TICS_ZJJ 于 2014-1-28 11:36 编辑
ln08136207 发表于 2014-1-28 11:32
可FTM0的寄存器里面就没有DECAPEN 这一项,该怎么操作?


你好,在FTM0_COMBINE这个寄存器中,它是寄存器的一个位,不是一个直接寄存器名。

出0入0汤圆

 楼主| 发表于 2014-1-28 12:16:07 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 11:35
你好,在FTM0_COMBINE这个寄存器中,它是寄存器的一个位,不是一个直接寄存器名。 ...

这是我在DEBUG时的FTM0寄存器,里面根本没有你说的FTM0_COMBINE,是我没找到?

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-1-28 14:09:49 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 11:35
你好,在FTM0_COMBINE这个寄存器中,它是寄存器的一个位,不是一个直接寄存器名。 ...

下午还没上班?

出0入0汤圆

发表于 2014-1-28 14:13:51 | 显示全部楼层


楼主,不好意思,我在呢。
刚看了第三章,确实FTM0不支持双通道捕获这个功能,我想想其他方法,马上给你回复。

出0入0汤圆

发表于 2014-1-28 14:26:05 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 14:13
楼主,不好意思,我在呢。
刚看了第三章,确实FTM0不支持双通道捕获这个功能,我想想其他方法,马上给你 ...


楼主,KE02的FTM0和1其实就是和KL25的TPM模块一样了,还有种方法,就是借鉴KL25的方法,采用两个通道,一个上升沿采集,一个下降沿采集,如下图:



然后把两个值相减。

  1. /***************************************************************************//*!
  2. * @brief   TPM1 overflow interrupt service routine.
  3. ******************************************************************************/
  4. void tpm1_isr(void)
  5. {
  6.   TPM1_SC |= TPM_SC_TOF_MASK;
  7.   i16PulseWidth =  (int16)TPM1_C1V;
  8.   i16PulseWidth -= (int16)TPM1_C0V;
  9.   TPM1_C0SC |= TPM_CnSC_CHF_MASK;
  10.   TPM1_C1SC |= TPM_CnSC_CHF_MASK;
  11. }
复制代码

这样也可以实现。

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-1-28 14:28:20 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-1-28 14:26
楼主,KE02的FTM0和1其实就是和KL25的TPM模块一样了,还有种方法,就是借鉴KL25的方法,采用两个通道,一 ...

我就知道还得用这种方法,不过还好,顺便把周期也测了

出0入0汤圆

发表于 2014-1-28 14:37:46 | 显示全部楼层
ln08136207 发表于 2014-1-28 14:28
我就知道还得用这种方法,不过还好,顺便把周期也测了

是的,暂时先用这种方法吧。

出0入0汤圆

发表于 2014-2-8 17:37:39 | 显示全部楼层
这个帖子的内容可以实现你需要,http://www.amobbs.com/thread-5568613-1-1.html

出0入0汤圆

 楼主| 发表于 2014-2-11 13:04:53 | 显示全部楼层


今天测试了一下,遇到一个问题,使用FTM0的channel0捕获外部脉宽,进入中断后出不来了,
配置如下:
FTM_InputCaptureInit(FTM0,FTM_CHANNEL_CHANNEL0,FTM_INPUTCAPTURE_DUALEDGE_RISINGEDGE);
FTM_ClockSet(FTM0,FTM_CLOCK_SYSTEMCLOCK,FTM_CLOCK_PS_DIV8);
   
FTM_SetCallback(FTM0, FTM0_Task);

中断服务函数:
void FTM0_Isr(void)
{
    //FTM_ClrOverFlowFlag(FTM0);
   
    if(FTM_Callback[0])
    {
        FTM_Callback[0]();
    }
    FTM_ClrChanneleventFlag(FTM0,0);
}
/*************清除中断标志位**********/
void FTM_ClrChanneleventFlag(FTM_Type *pFTM,char Channeln)
{
    volatile uint32_t Read_Csc;

    Read_Csc = pFTM->CONTROLS[Channeln].CnSC;
    pFTM->CONTROLS[Channeln].CnSC &= ~FTM_CnSC_CHF_MASK;
     
}

问题是,无法清除 FTMx_CnSC的CHF位

出0入0汤圆

发表于 2014-2-11 13:48:23 | 显示全部楼层
ln08136207 发表于 2014-2-11 13:04
今天测试了一下,遇到一个问题,使用FTM0的channel0捕获外部脉宽,进入中断后出不来了,
配置如下:
FTM_ ...

你好,新的问题的话,最好发个帖子出来,这样也便于我到时候结贴。
发问题的时候,最好说明自己用的什么芯片,什么平台,
如果可以请再发个问题贴,然后我会帮您测试的!

出0入0汤圆

 楼主| 发表于 2014-2-11 14:10:41 | 显示全部楼层
本帖最后由 ln08136207 于 2014-2-11 14:26 编辑
FSL_TICS_ZJJ 发表于 2014-2-11 13:48
你好,新的问题的话,最好发个帖子出来,这样也便于我到时候结贴。
发问题的时候,最好说明自己用的什么 ...


这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,

使用IAR 6.7环境,FRDM_KE02Z测试板, 使用FTM0的Channel0作为输入通道。

问题1:当FTM0_channel0(PTA0)没有有输入信号时,程序会10ms进一次输入捕获中断
问题2:当有信号输入时,程序读取下降沿时的寄存器值会被污染掉。


下面是部分程序:
/***********初始化FTM0*******************/
            FTM_InputCaptureInit(FTM0,FTM_CHANNEL_CHANNEL0,FTM_INPUTCAPTURE_DUALEDGE_BOTHEDGE);
            FTM_ClockSet(FTM0,FTM_CLOCK_SYSTEMCLOCK,FTM_CLOCK_PS_DIV8);
   
            FTM_SetCallback(FTM0, FTM0_Task);
            GPIO_PinInit(GPIO_PTH2,GPIO_PinOutput);
/*************中断服务函数*****************/
void FTM0_Isr(void)
{
    if(FTM_Callback[0])
    {
        FTM_Callback[0]();
    }
    FTM_ClrChanneleventFlag(FTM0,0);
}
/**************其他子函数*****************/
void FTM0_Task(void)
{
   
    char Port_Data;
    Port_Data = (char)(GPIO_Read(GPIOA)&0x1);   //判断是上升沿还是下降沿
    switch(Port_Data)
    {
        case 0:
                    Read_ChannelValue(FTM0,0,0);    //读取下降沿时计数器的值,并计算脉宽(下降沿时的值-上升沿时的值)
                    break;
        case 1:
                    Read_ChannelValue(FTM0,1,0); //读取上升沿时计数器的值。
                    break;
    }
    GPIO_PinToggle(GPIO_PTH2);
}



void Read_ChannelValue(FTM_Type *pFTM,char edge,char Ftm_Channel)
{
    static uint32_t Rising_Edge;
    static uint32_t Falling_Edge;
    static char flag;
   
    ASSERT((FTM0 == pFTM)&&(Ftm_Channel<2)&&(edge<2));
    switch(edge)
    {
        case 0:
                    Falling_Edge = pFTM->CONTROLS[Ftm_Channel].CnV;      //读取此时计数器时的值
                    if(flag)
                    {
                        /**********计算脉宽******************/
                        if(Falling_Edge > Rising_Edge)
                            Pluse_Width = Falling_Edge - Rising_Edge;
                        else
                            Pluse_Width = Falling_Edge +(65535 - Rising_Edge);
                        flag = 0;
                    }
                    break;
        case 1:
                    Rising_Edge = pFTM->CONTROLS[Ftm_Channel].CnV;
                    flag = 1;
                    break;
    }
}

出0入0汤圆

发表于 2014-2-11 14:31:58 | 显示全部楼层
ln08136207 发表于 2014-2-11 14:10
这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,

使用IAR 6.7环境,FRDM_KE02Z测试板, 使用FTM0 ...

好的,问题收到,我待会看一下并测试一下,会尽快回复您!
请耐心等待!

出0入0汤圆

 楼主| 发表于 2014-2-11 16:31:15 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-11 14:31
好的,问题收到,我待会看一下并测试一下,会尽快回复您!
请耐心等待! ...

大神们,有没有结果啊

出0入0汤圆

发表于 2014-2-11 17:22:20 | 显示全部楼层
ln08136207 发表于 2014-2-11 16:31
大神们,有没有结果啊

怎么没有看到你清TOF标志呢?
你可以使用溢出中断,然后在中断中清掉TOF,和CHF两个标志位。
如果不清掉TOF,标志会一直在,就出不了中断了。

出0入0汤圆

 楼主| 发表于 2014-2-12 08:51:31 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-11 17:22
怎么没有看到你清TOF标志呢?
你可以使用溢出中断,然后在中断中清掉TOF,和CHF两个标志位。
如果不清掉T ...

我并没有Enable TOIE,难道这也会进溢出中断?

出0入0汤圆

 楼主| 发表于 2014-2-12 09:31:43 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-11 17:22
怎么没有看到你清TOF标志呢?
你可以使用溢出中断,然后在中断中清掉TOF,和CHF两个标志位。
如果不清掉T ...

版主还没上班?

出0入0汤圆

发表于 2014-2-12 09:33:38 | 显示全部楼层
ln08136207 发表于 2014-2-12 08:51
我并没有Enable TOIE,难道这也会进溢出中断?

这样吧,你把你工程给我看看。
看你贴出的部分代码都看不到你的具体配置。
还有FTM0_Task这个函数是什么时候调用的?
把工程给我,我这边做个测试。

出0入0汤圆

发表于 2014-2-12 09:34:23 | 显示全部楼层

上班了,刚就在看你的问题。

出0入0汤圆

 楼主| 发表于 2014-2-12 09:52:01 | 显示全部楼层
本帖最后由 ln08136207 于 2014-2-12 09:54 编辑
FSL_TICS_ZJJ 发表于 2014-2-12 09:33
这样吧,你把你工程给我看看。
看你贴出的部分代码都看不到你的具体配置。
还有FTM0_Task这个函数是什么 ...


附件是工程,你测试一下,我比较急,急于选定芯片型号
还有就是,你在测试debug的时候,看看会不会出现这个warning:Skipping flash loading pass because there is no data in the designated range: 0x10000000-0x100000FF.

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-2-12 15:57:12 | 显示全部楼层
ln08136207 发表于 2014-2-12 09:52
附件是工程,你测试一下,我比较急,急于选定芯片型号
还有就是,你在测试debug的时候,看看会不会出现这个war ...

首先先回答你的warning问题:
warning:Skipping flash loading pass because there is no data in the designated range: 0x10000000-0x100000FF.
这个问题你把flash loaders 给勾掉就行了。
Captrue 的问题我迟点回你,我会做个测试程序。

出0入0汤圆

 楼主| 发表于 2014-2-12 16:21:28 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-12 15:57
首先先回答你的warning问题:
warning:Skipping flash loading pass because there is no data in the de ...

warning解决了,能解释原因吗?

出0入0汤圆

发表于 2014-2-12 16:25:00 | 显示全部楼层
ln08136207 发表于 2014-2-12 16:21
warning解决了,能解释原因吗?

具体的原因,我想您需要去问一下IAR公司。
这个毕竟和编译器有关系,你可以去这个地址:http://www.iar.com/Products/IAR- ... -devices/Freescale/
然后点击SERVICE CENTER,提交一个问题请求。

出0入0汤圆

发表于 2014-2-14 17:18:22 | 显示全部楼层
ln08136207 发表于 2014-2-11 14:10
这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,

使用IAR 6.7环境,FRDM_KE02Z测试板, 使用FTM0 ...

楼主,你问题解决了吗?前两天比较忙,今天我做了个程序简单的捕获程序, 平台是FRDM-KE02,使用CW的PE做的。
配置如下:使用FTM2的通道2,PTD0 产生一个600us,占空比为300us的PWM波,
然后FTM0的通道0,PTA0作为上升下降沿的捕获,使能事件触发中断,禁止溢出中断,时钟选择为system clock, 分频为/128,module counter 为650.
我这就简单的在事件中断中判断是上升沿还是下降沿,然后将数据存到数组中,然后清标志,计数。
采集到两个数据之后,然后静止通道中断。
程序在中断中读取IO口正常,也不影响下一次的捕获。最后算出来的脉宽就是300us,和发出的波形吻合。
这里我把代码给你,你可以参考下。



希望能够帮到你,如果还有任何问题,欢迎交流!

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-2-17 08:52:12 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-14 17:18
楼主,你问题解决了吗?前两天比较忙,今天我做了个程序简单的捕获程序, 平台是FRDM-KE02,使用CW的PE做 ...

版主你好,我的问题已经解决。
问题的原因在于:在输入捕获的时候,不能让输入通道悬空,否则引脚将处在不确定的状态,希望对其他人能有个借鉴.

出0入0汤圆

发表于 2014-2-17 09:27:21 | 显示全部楼层
ln08136207 发表于 2014-2-17 08:52
版主你好,我的问题已经解决。
问题的原因在于:在输入捕获的时候,不能让输入通道悬空,否则引脚将处在 ...

输入捕获功能的时候,引脚确实是不可以悬空的,这个不仅仅是飞思卡尔单片机,其他单片机也是如此!

出0入0汤圆

发表于 2014-2-18 10:21:40 | 显示全部楼层
谢谢分享,解答真详细啊。

出0入0汤圆

发表于 2014-2-18 10:37:09 | 显示全部楼层
zhongyb 发表于 2014-2-18 10:21
谢谢分享,解答真详细啊。

如果你有问题,照样可以提问题贴,我们也会同样为您解答~!

出0入0汤圆

发表于 2014-9-3 17:28:23 | 显示全部楼层
版主的代码是CW的,下载学习。

出0入0汤圆

发表于 2018-1-3 09:39:02 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-2-14 17:18
楼主,你问题解决了吗?前两天比较忙,今天我做了个程序简单的捕获程序, 平台是FRDM-KE02,使用CW的PE做 ...

大神,请问我这个是怎么回事??配置不了定时器输入捕获

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-3-29 15:13

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

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