输入捕获高电平时,如果高电平捕获之后,定时器重装值,然后到达低电平,这个捕获的高电平时间不是错误了吗?

2019-08-19 20:50发布

如题
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
l692519765
1楼-- · 2019-08-19 21:17
回复【6楼】倒拔萝卜:
---------------------------------
谢谢 了解了 设置一个溢出标志,防止在高低电平之间出现了计数器重装值这种神奇的事情发生。
倒拔萝卜
2楼-- · 2019-08-20 01:42

首先:定时器的CNT从0向上计数到指定值后,又从0开始向上计数,如此循环,每一次溢出都会响应一次中断,置位TIM_FLAG_Update

捕获:当定时器的捕获脚检测一个边沿时,会置位TIM_FLAG_CCx,同时TIMx->CCRx记录下此时CNT的值,并把它记录在cap_start变量中;当再有一个边沿时,又会置位TIM_FLAG_CCx,TIMx->CCRx又记录下此时CNT的值,并把它记录在cap_end变量中;这时cap_end和cap_start的差值就是高电平的时间了;

如果CNT已经溢出了好几次了怎么算呢?
CNT每次响应溢出中断时,再定义一个溢出变量overflow++就行了

根据cap_start,cap_end,overflow和定时器的ARR寄存器值就可以算出高电平时间了

以下是参考程序:
void TIM2_IRQHandler(void)
{
      static u16 cap_start=0, cap_end=0, cap_sta=0, cap_tim=0;
      static u32 overflow=0;

      if (TIM2->SR & TIM_FLAG_Update)//溢出中断
      {
               overflow++;

       }

       if (TIM2->SR & TIM_FLAG_CC1)//捕获中断
       {
               if (cap_sta==0)//捕获到了上升沿
               {
                       cap_start = TIM2->CCR1;
                       cap_tim = overflow;
                       xxxx;//设置成下降沿中断
                       cap_sta=1;//下一次进入下降沿判断

                }
                else if (cap_sta ==1)//补货到了下降沿
                {
                       cap_end = TIM2->CCR1;
                       xxxx;//设置成上升沿中断,为下一次准备
                       cap_sta=0;//进入下一次的上升沿判断

                        if(overflow == cap_tim)//两次捕获间,CNT没有溢出
                               pulse_time = cap_end - cap_start;
                        else   //CNT溢出了(overflow-cap_tim)次
                               pulse_time =  cap_end+(TIM2->ARR+1-cap_start)+
                                                   (overflow-1-cap_tim)*(TIM2->ARR+1);

                 }

       }

}

倒拔萝卜
3楼-- · 2019-08-20 04:09
 精彩回答 2  元偷偷看……
ricefat
4楼-- · 2019-08-20 08:47
为什么不用上升沿下降沿捕获?
l692519765
5楼-- · 2019-08-20 09:53
回复【2楼】倒拔萝卜:
---------------------------------
上升沿捕获,记录了此时计数器寄存器的值,但是再捕获下降沿之前,计数器就重装值了。。。那么下降沿捕获的计数器值减去上升沿计数器值不就是计算错误的了吗。。。。
l692519765
6楼-- · 2019-08-20 13:15
回复【2楼】倒拔萝卜:
---------------------------------
上升沿捕获,记录了此时计数器寄存器的值,但是再捕获下降沿之前,计数器就重装值了。。。那么下降沿捕获的计数器值减去上升沿计数器值不就是计算错误的了吗。。。。

一周热门 更多>