KE02 FTM0输入捕获(已解决)

2020-02-11 09:01发布

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

不知freescale的大牛们今天还上班吗?
问一个问题:我使用FTM0捕获脉宽,在只使用channel0的情况下能不能实现脉宽捕获?如果可以,如何识别是falling还是Rising?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
39条回答
ln08136207
1楼-- · 2020-02-14 02:37
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[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位
FSL_TICS_ZJJ
2楼-- · 2020-02-14 06:59
ln08136207 发表于 2014-2-11 13:04
今天测试了一下,遇到一个问题,使用FTM0的channel0捕获外部脉宽,进入中断后出不来了,
配置如下:
FTM_ ...

你好,新的问题的话,最好发个帖子出来,这样也便于我到时候结贴。
发问题的时候,最好说明自己用的什么芯片,什么平台,
如果可以请再发个问题贴,然后我会帮您测试的!
ln08136207
3楼-- · 2020-02-14 08:10
本帖最后由 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;
    }
}
FSL_TICS_ZJJ
4楼-- · 2020-02-14 11:02
ln08136207 发表于 2014-2-11 14:10
这个不是新问题,也是在输入捕获脉宽这个问题中遇到的,

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

好的,问题收到,我待会看一下并测试一下,会尽快回复您!
请耐心等待!
ln08136207
5楼-- · 2020-02-14 12:57
 精彩回答 2  元偷偷看……
FSL_TICS_ZJJ
6楼-- · 2020-02-14 13:24
ln08136207 发表于 2014-2-11 16:31
大神们,有没有结果啊

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

一周热门 更多>