KE02 FTM0输入捕获(已解决)

2020-02-11 09:01发布

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

不知freescale的大牛们今天还上班吗?
问一个问题:我使用FTM0捕获脉宽,在只使用channel0的情况下能不能实现脉宽捕获?如果可以,如何识别是falling还是Rising?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
40条回答
ln08136207
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;
    }
}
0人赞 举报

一周热门 更多>