注册 登录
查看: 263|回复: 2

怎么用外部中断检测高电平时间

[复制链接]
发表于 2017-8-11 17:39:09 | 显示全部楼层 |阅读模式
怎么用外部中断检测高电平时间
回复

使用道具 举报

发表于 2017-8-11 18:55:36 | 显示全部楼层
/*
* FTM3 中断(外部脉宽捕捉)
*/
void FTM3_IRQHandler(void)
{
    static int16_t Base_CnV = 0;
    static int16_t FTM3_CH6_CnV = 0;
    static int16_t FTM3_CH7_CnV = 0;
   
    static uint8_t cnt = 0;
    static uint32_t flags = 0;
   
    static bool isFalling = 0U;       // Rising ~ 0, Falling ~ 1
   
    flags = FTM_GetStatusFlags(FTM3);
    FTM_ClearStatusFlags(FTM3, kFTM_Chnl6Flag|kFTM_Chnl7Flag);
   
    if(isFalling == false)                  // 上升沿中断
    {
        Base_CnV = FTM3->CONTROLS[6].CnV;
        
        FTM_SetupInputCapture(FTM3, kFTM_Chnl_6, kFTM_FallingEdge, 0x00U);
        FTM_SetupInputCapture(FTM3, kFTM_Chnl_7, kFTM_FallingEdge, 0x00U);
        isFalling = true;
    }
    else if(isFalling == true)             // 下降沿中断
    {
        if((flags&kFTM_Chnl6Flag) == kFTM_Chnl6Flag)
        {
            FTM3_CH6_CnV = FTM3->CONTROLS[6].CnV;
            FTM3_CH6_PulseWidth = (FTM3_CH6_CnV - Base_CnV)*1000/196;        // 计算脉宽
        }
        else if((flags&kFTM_Chnl7Flag) == kFTM_Chnl7Flag)
        {
            FTM3_CH7_CnV = FTM3->CONTROLS[7].CnV;
            FTM3_CH7_PulseWidth = (FTM3_CH7_CnV - Base_CnV)*1000/196;        // 计算脉宽
        }
        
        if(cnt == 0)                        // 下降沿中断计数,检测到两个下降沿后清零
        {
            cnt++;
        }
        else if(cnt == 1)                   // 下降沿中断计数,检测到两个下降沿后清零
        {
            FTM_SetupInputCapture(FTM3, kFTM_Chnl_6, kFTM_RisingEdge, 0x00U);
            FTM_SetupInputCapture(FTM3, kFTM_Chnl_7, kFTM_RisingEdge, 0x00U);
            FTM3->CNT = 0;
            
            cnt = 0;
            isFalling = false;
        }
    }
}

基于MCUxpresso,测量由航模接收机发出的FTM3 6、7两个通道的PWM输入脉宽。

两个输入信号的上升沿是对齐的,所以才能用两个通道同时测量两个脉宽。
回复 支持 反对

使用道具 举报

发表于 2017-8-12 10:13:15 | 显示全部楼层
就是输入捕捉
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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