OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3363|回复: 1

一个定时器捕获多路PWM输入的问题

[复制链接]

17

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-11-21
在线时间
11 小时
发表于 2016-8-22 17:29:54 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 woshiyunsk 于 2016-8-22 17:38 编辑

我用一个定时器捕获多路PWM输入,会出现如下情况:
1、同时打开时,一个准确,其他几个有误差;
2、单独测试某一个时,均无误差;
4路信号频率都在600Hz以下,请各位大侠帮忙看一下(这是,屏蔽掉其他通道,只保留一个通道后的代码),看看有什么好的解决办法:
void SpdCaptureFinishedHandler(void)
{
       uint16_t u16SpdCaptureCurrentCounter;
//    uint8_t i;
      if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
      {
           if(g_eSpdCaptureWorkSwitch[0] == ON)
          {
               u16SpdCaptureCurrentCounter = TIM_GetCapture1(TIM3);
               if(g_u8SpdCaptureTriggersCrossCycleNmb[0] < 1)//未跨越计时周期
               {  
                     if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[0])
                    {
                           g_fSpdCaptureFrequency[0] = 2000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[0]);
                    }
                    else    //比较值未变化,则认为没转动
                    {
                           g_fSpdCaptureFrequency[0] = 0;
                     }
                }
                else if(g_u8SpdCaptureTriggersCrossCycleNmb[0] < 10)//跨周期时间为1-10个
                      {
                             g_fSpdCaptureFrequency[0] = 2000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[0]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[0] - 1) * 2000) + u16SpdCaptureCurrentCounter); //
                       }
                       else//跨周期超过10个,认为未转动
                       {
                             g_fSpdCaptureFrequency[0] = 0;
                       }
                g_u16SpdCaptureLastTimeCounter[0] = u16SpdCaptureCurrentCounter; g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
            }
            else
            {}
            TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
      }
//    if(TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
//    {
//             if(g_eSpdCaptureWorkSwitch[1] == ON)
//             {
//                 u16SpdCaptureCurrentCounter = TIM_GetCapture2(TIM3);
//                 if(g_u8SpdCaptureTriggersCrossCycleNmb[1] < 1)//未跨越计时周期
//                 {
//                     if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[1])
//                    {
//                        g_fSpdCaptureFrequency[1] = 4000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[1]);
//                    }
//                    else    //比较值未变化,则认为没转动
//                    {
//                        g_fSpdCaptureFrequency[1] = 0;
//                     }
//                  }
//                  else if(g_u8SpdCaptureTriggersCrossCycleNmb[1] < 10)//跨周期时间为1-10个
//                       {
//                             g_fSpdCaptureFrequency[1] = 4000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[1]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[1] - 1) * 1000) + u16SpdCaptureCurrentCounter); //
//                        }
//                       else//跨周期超过10个,认为未转动
//                       {
//                           g_fSpdCaptureFrequency[1] = 0;
//                       }
//            g_u16SpdCaptureLastTimeCounter[1] = u16SpdCaptureCurrentCounter;
//            g_u8SpdCaptureTriggersCrossCycleNmb[1] = 0;
//        }
//        else
//        {}
//        TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
//    }
//    if(TIM_GetITStatus(TIM3, TIM_IT_CC3) != RESET)
//    {
//        if(g_eSpdCaptureWorkSwitch[2] == ON)
//        {
//            u16SpdCaptureCurrentCounter = TIM_GetCapture3(TIM3);
//            if(g_u8SpdCaptureTriggersCrossCycleNmb[2] < 1)//未跨越计时周期
//            {
//                if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[2])
//                {
//                    g_fSpdCaptureFrequency[2] = 4000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[2]);
//                }
//                else    //比较值未变化,则认为没转动
//                {
//                    g_fSpdCaptureFrequency[2] = 0;
//                }
//            }
//            else if(g_u8SpdCaptureTriggersCrossCycleNmb[2] < 10)//跨周期时间为1-10个
//            {
//                g_fSpdCaptureFrequency[2] = 4000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[2]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[2] - 1) * 1000) + u16SpdCaptureCurrentCounter);  
//            }
//            else//跨周期超过10个,认为未转动
//            {
//                g_fSpdCaptureFrequency[2] = 0;
//            }
//            g_u16SpdCaptureLastTimeCounter[0] = u16SpdCaptureCurrentCounter;
//            g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
//        }
//        else
//        {}
//        TIM_ClearITPendingBit(TIM3, TIM_IT_CC3);
//    }
//    if(TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
//    {
//        if(g_eSpdCaptureWorkSwitch[3] == ON)
//        {
//            u16SpdCaptureCurrentCounter = TIM_GetCapture4(TIM3);
//            if(g_u8SpdCaptureTriggersCrossCycleNmb[3] < 1)//未跨越计时周期
//            {
//                if((u16SpdCaptureCurrentCounter - 2) >= g_u16SpdCaptureLastTimeCounter[3])
//                {
//                    g_fSpdCaptureFrequency[3] = 4000.0 / (u16SpdCaptureCurrentCounter - g_u16SpdCaptureLastTimeCounter[3]);
//                }
//                else    //比较值未变化,则认为没转动
//                {
//                    g_fSpdCaptureFrequency[3] = 0;
//                }
//            }
//            else if(g_u8SpdCaptureTriggersCrossCycleNmb[3] < 10)//跨周期时间为1-10个
//            {
//                g_fSpdCaptureFrequency[3] = 4000.0 / ((1000 - 1 - g_u16SpdCaptureLastTimeCounter[3]) + ((g_u8SpdCaptureTriggersCrossCycleNmb[3] - 1) * 1000) + u16SpdCaptureCurrentCounter);
//            }
//            else//跨周期超过10个,认为未转动
//            {
//                g_fSpdCaptureFrequency[3] = 0;
//            }
//            g_u16SpdCaptureLastTimeCounter[3] = u16SpdCaptureCurrentCounter;
//            g_u8SpdCaptureTriggersCrossCycleNmb[3] = 0;
//        }
//        else
//        {}
//        TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
//    }
    //更新中断产生
    if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
//        for(i = 0; i < 4; i++)
//        {
//            if(g_eSpdCaptureWorkSwitch == ON)
//            {
//                g_u8SpdCaptureTriggersCrossCycleNmb++;
//                if(g_u8SpdCaptureTriggersCrossCycleNmb >= 10)
//                {
//                    g_u8SpdCaptureTriggersCrossCycleNmb = 0; //
//                                      g_fSpdCaptureFrequency = 0;
//                }
//            }
//            else
//            {
//                g_u8SpdCaptureTriggersCrossCycleNmb = 0;
//                g_fSpdCaptureFrequency = 0;
//                g_u16SpdCaptureLastTimeCounter = 0;
//            }
//        }
                if(g_eSpdCaptureWorkSwitch[0] == ON)
                {
                        g_u8SpdCaptureTriggersCrossCycleNmb[0]++;
                        if(g_u8SpdCaptureTriggersCrossCycleNmb[0] >= 20)
                        {
                                g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
                                g_fSpdCaptureFrequency[0] = 0;
                         }
                }
                else
                {
                       g_u8SpdCaptureTriggersCrossCycleNmb[0] = 0;
                        g_fSpdCaptureFrequency[0] = 0;
                        g_u16SpdCaptureLastTimeCounter[0] = 0;
                }
          TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
      }
}


水好深。。。。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-24 22:02:41 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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