ln08136207 发表于 2014-1-28 10:04:08

KE02 FTM0输入捕获(已解决)

本帖最后由 FSL_TICS_ZJJ 于 2014-2-13 10:44 编辑

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

FSL_TICS_ZJJ 发表于 2014-1-28 10:55:19

楼主,你好!
我们在上班啊!
你的问题可以这样做,KE02的FTM模块他是有双边沿捕获功能的,结构图如下:

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

山外メ雲ジ 发表于 2014-1-28 10:56:27

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


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

FSL_TICS_ZJJ 发表于 2014-1-28 11:00:32

山外メ雲ジ 发表于 2014-1-28 10:56
看来年三十才能放假的节奏,辛苦了

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

ln08136207 发表于 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少林很多寄存器,都不知道怎么操作.

FSL_TICS_ZJJ 发表于 2014-1-28 11:05:45

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

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

ln08136207 发表于 2014-1-28 11:15:10

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

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

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

FSL_TICS_ZJJ 发表于 2014-1-28 11:18:33

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

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

ln08136207 发表于 2014-1-28 11:24:10

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

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

FSL_TICS_ZJJ 发表于 2014-1-28 11:27:06

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

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

ln08136207 发表于 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 这一项,该怎么操作?

FSL_TICS_ZJJ 发表于 2014-1-28 11:35:13

本帖最后由 FSL_TICS_ZJJ 于 2014-1-28 11:36 编辑

ln08136207 发表于 2014-1-28 11:32
可FTM0的寄存器里面就没有DECAPEN 这一项,该怎么操作?

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

ln08136207 发表于 2014-1-28 12:16:07

FSL_TICS_ZJJ 发表于 2014-1-28 11:35
你好,在FTM0_COMBINE这个寄存器中,它是寄存器的一个位,不是一个直接寄存器名。 ...

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

ln08136207 发表于 2014-1-28 14:09:49

FSL_TICS_ZJJ 发表于 2014-1-28 11:35
你好,在FTM0_COMBINE这个寄存器中,它是寄存器的一个位,不是一个直接寄存器名。 ...

下午还没上班?

FSL_TICS_ZJJ 发表于 2014-1-28 14:13:51

ln08136207 发表于 2014-1-28 14:09
下午还没上班?

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

FSL_TICS_ZJJ 发表于 2014-1-28 14:26:05

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

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



然后把两个值相减。

/***************************************************************************//*!
* @brief   TPM1 overflow interrupt service routine.
******************************************************************************/
void tpm1_isr(void)
{
TPM1_SC |= TPM_SC_TOF_MASK;
i16PulseWidth =(int16)TPM1_C1V;
i16PulseWidth -= (int16)TPM1_C0V;
TPM1_C0SC |= TPM_CnSC_CHF_MASK;
TPM1_C1SC |= TPM_CnSC_CHF_MASK;
}
这样也可以实现。

ln08136207 发表于 2014-1-28 14:28:20

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

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

FSL_TICS_ZJJ 发表于 2014-1-28 14:37:46

ln08136207 发表于 2014-1-28 14:28
我就知道还得用这种方法,不过还好,顺便把周期也测了

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

FSL_TICS_ZJJ 发表于 2014-2-8 17:37:39

这个帖子的内容可以实现你需要,http://www.amobbs.com/thread-5568613-1-1.html

ln08136207 发表于 2014-2-11 13:04:53

FSL_TICS_ZJJ 发表于 2014-2-8 17:37
这个帖子的内容可以实现你需要,http://www.amobbs.com/thread-5568613-1-1.html

今天测试了一下,遇到一个问题,使用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)
    {
      FTM_Callback();
    }
    FTM_ClrChanneleventFlag(FTM0,0);
}
/*************清除中断标志位**********/
void FTM_ClrChanneleventFlag(FTM_Type *pFTM,char Channeln)
{
    volatile uint32_t Read_Csc;

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

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

FSL_TICS_ZJJ 发表于 2014-2-11 13:48:23

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

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

ln08136207 发表于 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)
    {
      FTM_Callback();
    }
    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.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.CnV;
                  flag = 1;
                  break;
    }
}

FSL_TICS_ZJJ 发表于 2014-2-11 14:31:58

ln08136207 发表于 2014-2-11 14:10
这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,

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

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

ln08136207 发表于 2014-2-11 16:31:15

FSL_TICS_ZJJ 发表于 2014-2-11 14:31
好的,问题收到,我待会看一下并测试一下,会尽快回复您!
请耐心等待! ...

大神们,有没有结果啊{:sleepy:}

FSL_TICS_ZJJ 发表于 2014-2-11 17:22:20

ln08136207 发表于 2014-2-11 16:31
大神们,有没有结果啊

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

ln08136207 发表于 2014-2-12 08:51:31

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

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

ln08136207 发表于 2014-2-12 09:31:43

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

版主还没上班?

FSL_TICS_ZJJ 发表于 2014-2-12 09:33:38

ln08136207 发表于 2014-2-12 08:51
我并没有Enable TOIE,难道这也会进溢出中断?

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

FSL_TICS_ZJJ 发表于 2014-2-12 09:34:23

ln08136207 发表于 2014-2-12 09:31
版主还没上班?

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

ln08136207 发表于 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.

FSL_TICS_ZJJ 发表于 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 的问题我迟点回你,我会做个测试程序。

ln08136207 发表于 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解决了,能解释原因吗?

FSL_TICS_ZJJ 发表于 2014-2-12 16:25:00

ln08136207 发表于 2014-2-12 16:21
warning解决了,能解释原因吗?

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

FSL_TICS_ZJJ 发表于 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,和发出的波形吻合。
这里我把代码给你,你可以参考下。



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

ln08136207 发表于 2014-2-17 08:52:12

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

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

FSL_TICS_ZJJ 发表于 2014-2-17 09:27:21

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

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

zhongyb 发表于 2014-2-18 10:21:40

谢谢分享,解答真详细啊。

FSL_TICS_ZJJ 发表于 2014-2-18 10:37:09

zhongyb 发表于 2014-2-18 10:21
谢谢分享,解答真详细啊。

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

laotui 发表于 2014-9-3 17:28:23

版主的代码是CW的,下载学习。

水缸仔 发表于 2018-1-3 09:39:02

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

大神,请问我这个是怎么回事??配置不了定时器输入捕获
页: [1]
查看完整版本: KE02 FTM0输入捕获(已解决)